【.NET 框架】—— Dapper框架基于Sqlserver数据库CRUD操作(一)

  • A+
所属分类:.NET技术
摘要

Dapper是.NET开发中一款轻量级的ORM映射框架,它轻量级、速度快,与同类型ORM框架如EF框架相比具有更高的执行效率。支持多种数据库,可以在所有的Ado.NET Providers下工作,包括sqlite、oracle、mysql、postgreSQL与SqlServer数据库。可以与数据库进行一对一、一对多、多对多的关系映射。它内部通过Emit反射IDataReder序列队列,来快速得到和产生对象,性能高。支持.NET Core,是一个跨平台的框架。


1.Dapper框架介绍

Dapper是.NET开发中一款轻量级的ORM映射框架,它轻量级、速度快,与同类型ORM框架如EF框架相比具有更高的执行效率。支持多种数据库,可以在所有的Ado.NET Providers下工作,包括sqlite、oracle、mysql、postgreSQL与SqlServer数据库。可以与数据库进行一对一、一对多、多对多的关系映射。它内部通过Emit反射IDataReder序列队列,来快速得到和产生对象,性能高。支持.NET Core,是一个跨平台的框架。

Dapper框架官网:https://dapper-tutorial.net/dapper

2.Dapper框架的基本应用

2.1.Dapper框架的安装引用

使用Dapper框架首先需要在项目中引入Dapper的安装包,在项目中添加引用浏览外部引用包,选择Dapper进行下载即可将Dapper框架相关的组件引入到解决方案中。具体操作如下:

【.NET 框架】—— Dapper框架基于Sqlserver数据库CRUD操作(一)

 

2.2.基于mockaroo构造虚拟数据

Mockaroo网址:https://www.mockaroo.com/

Mockaroo是一个模拟虚拟数据的一个数据构造网站,可以通过它来构造虚拟的数据库表中的数据,并生成sql文件,非常方便,这里简单地列出构造数据的表与相应的表中的字段列。

这里使用mockaroo网站构造数据列并下载到对应的sql如下图所示操作即可:

【.NET 框架】—— Dapper框架基于Sqlserver数据库CRUD操作(一)

 

选择Download Data后可以自动生成Person.sql文件。

2.3.Dapper与数据库访问操作

使用Dapper连接Sqlserver数据库需要使用到连接字符串,连接字符串是在App.config文件中配置,需要添加如下连接配置:

【.NET 框架】—— Dapper框架基于Sqlserver数据库CRUD操作(一)

 

配置如下:

<connectionStrings>     <add        name="ConnString"        connectionString="Server=DESKTOP-3POL04N;User Id=sa;Pwd=123456;DataBase=DapperDemo"        providerName="System.Data.SqlClient"     /> </connectionStrings>

构造连接访问助手类DBHelper类:

①首先需要在项目中添加DBHelper的类型引用System.Configuration;

【.NET 框架】—— Dapper框架基于Sqlserver数据库CRUD操作(一)

 

②构建DBHelper数据库访问类:

//数据访问助手类     public static class DBHelper     {         /// <summary>         /// 从配置文件中读取数据库连接字符串         /// </summary>         public static string ConnString         {             get             {                 return ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString;             }         }     }

2.3.1.按条件进行查询

条件查询及Sql注入问题的解决:

Sql注入问题主要是使用SqlConnection对象的Query方法进行匿名参数传递,需要对应sql语句中的变量的值以及使用传入的参数进行赋值。

/// <summary>         /// 根据用户姓氏查询用户集合         /// </summary>         /// <param name="lastName"></param>         /// <returns></returns>         public List<Person> FindListByLastName(string lastName)         {             //IDbConnection由于Dapper ORM的操作实际上是对IDbConnection类的扩展,所有的方法都是该类的扩展方法。             using (IDbConnection db = new SqlConnection(DBHelper.ConnString))             {                 //C#6的语法:容易引起sql注入的问题,如:select * from Person where last_name = 'Crevy' or '1' = '1';                  string sql = $"select * from Person where last_name = '{lastName}'";                 //解决sql注入的问题,注意以下的参数对应关系                 string sqlQuery = $"select * from Person where last_name = @tempName";                 return db.Query<Person>(sqlQuery, new { tempName = lastName }).ToList();                 // return db.Query<Person>(sqlQuery).ToList();  //转化为List的类型返回             }         }

2.3.2.按输入进行插入

执行插入数据代码:

/// <summary>         /// 根据界面输入插入对应数据         /// </summary>         /// <param name="lastName"></param>         /// <returns></returns>         public bool InsertPersonData(Person person)         {             //IDbConnection由于Dapper ORM的操作实际上是对IDbConnection类的扩展,所有的方法都是该类的扩展方法。             using (IDbConnection db = new SqlConnection(DBHelper.ConnString))             {                 string insertSql = "insert into Person(first_name, last_name, email, gender) values " +                     "(@First_Name, @Last_Name, @Email, @Gender)";                 int resNum = db.Execute(insertSql, new Person                 {                     First_Name = person.First_Name,                     Last_Name = person.Last_Name,                     Email = person.Email,                     Gender = person.Gender,                 });                  return resNum > 0;             }         }

数据插入:

【.NET 框架】—— Dapper框架基于Sqlserver数据库CRUD操作(一)

 

执行结果:

【.NET 框架】—— Dapper框架基于Sqlserver数据库CRUD操作(一)

 

2.3.3.修改特定ID的列

修改首先根据界面上输入的ID进行查询显示,之后在执行对应的修改方法,具体代码如下所示:

/// <summary>         /// 根据界面输入ID查询出Person信息         /// </summary>         /// <param name="lastName"></param>         /// <returns></returns>         public Person QueryPersonById(int id)         {             Person person = null;             //IDbConnection由于Dapper ORM的操作实际上是对IDbConnection类的扩展,所有的方法都是该类的扩展方法。             using (IDbConnection db = new SqlConnection(DBHelper.ConnString))             {                 string querySql = "select * from Person where id = @tempId";                 person = db.Query<Person>(querySql, new { tempId = id }).FirstOrDefault();             }              return person;         }          /// <summary>         /// 根据传入的Person更新数据库表中数据         /// </summary>         /// <param name="person"></param>         public bool UpdatePerson(Person person)         {             //IDbConnection由于Dapper ORM的操作实际上是对IDbConnection类的扩展,所有的方法都是该类的扩展方法。             using (IDbConnection db = new SqlConnection(DBHelper.ConnString))             {                 string updateSql = "update Person set " +                     "first_name = @First_Name, last_name = @Last_Name, email = @Email, gender = @Gender " +                     "where id = @ID";                 //注意:这里的First_Name、Last_Name等这些字段都是person赋值的,所以必须和Person                 //类中的属性一致                 int exeRes = db.Execute(updateSql, person);                  return exeRes > 0;             }         }

界面上的点击按钮事件编写:

private void searchBtn_Click(object sender, EventArgs e)         {             PersonService service = new PersonService();             string idStr = this.searchID.Text;             if (!int.TryParse(idStr, out int id))             {                 MessageBox.Show("ID必须为正整数", "警告");                 return;             }              Person person = service.QueryPersonById(id);             this.tb_firstName.Text = person.First_Name;             this.tb_lastName.Text = person.Last_Name;             this.tb_Email.Text = person.Email;             this.tb_Gender.Text = person.Gender;         }          private void update_Btn_Click(object sender, EventArgs e)         {             PersonService service = new PersonService();             bool updateRes = service.UpdatePerson(new Person             {                 ID = Convert.ToInt32(this.searchID.Text),                 First_Name = this.tb_firstName.Text,                 Last_Name = this.tb_lastName.Text,                 Email = this.tb_Email.Text,                 Gender = this.tb_Gender.Text             });              MessageBox.Show(updateRes ? "数据更新成功" : "数据更新失败");         }

修改结果:

【.NET 框架】—— Dapper框架基于Sqlserver数据库CRUD操作(一)

 

 【.NET 框架】—— Dapper框架基于Sqlserver数据库CRUD操作(一)

 

2.3.4.删除特定的数据列

删除数据部分比较简单,下面直接给出删除代码部分:

/// <summary>         /// 根据传入的ID进行数据删除         /// </summary>         /// <param name="person"></param>         public bool DeleteDataById(int id)         {             //IDbConnection由于Dapper ORM的操作实际上是对IDbConnection类的扩展,所有的方法都是该类的扩展方法。             using (IDbConnection db = new SqlConnection(DBHelper.ConnString))             {                 string delSql = "delete from person where id = @ID";                 //类中的属性一致                 int exeRes = db.Execute(delSql, new { ID = id});                  return exeRes > 0;             }         }