Dapper是.NET开发中一款轻量级的ORM映射框架,它轻量级、速度快,与同类型ORM框架如EF框架相比具备更高的执行效率。支持多种数据库,能够在全部的Ado.NET Providers下工做,包括sqlite、oracle、mysql、postgreSQL与SqlServer数据库。能够与数据库进行一对1、一对多、多对多的关系映射。它内部经过Emit反射IDataReder序列队列,来快速获得和产生对象,性能高。支持.NET Core,是一个跨平台的框架。mysql
Dapper框架官网:https://dapper-tutorial.net/dappersql
使用Dapper框架首先须要在项目中引入Dapper的安装包,在项目中添加引用浏览外部引用包,选择Dapper进行下载便可将Dapper框架相关的组件引入到解决方案中。具体操做以下:数据库
Mockaroo网址:https://www.mockaroo.com/oracle
Mockaroo是一个模拟虚拟数据的一个数据构造网站,能够经过它来构造虚拟的数据库表中的数据,并生成sql文件,很是方便,这里简单地列出构造数据的表与相应的表中的字段列。app
这里使用mockaroo网站构造数据列并下载到对应的sql以下图所示操做便可:框架
选择Download Data后能够自动生成Person.sql文件。ide
使用Dapper链接Sqlserver数据库须要使用到链接字符串,链接字符串是在App.config文件中配置,须要添加以下链接配置:post
配置以下:性能
<connectionStrings> <add name="ConnString" connectionString="Server=DESKTOP-3POL04N;User Id=sa;Pwd=123456;DataBase=DapperDemo" providerName="System.Data.SqlClient" /> </connectionStrings>
构造链接访问助手类DBHelper类:网站
①首先须要在项目中添加DBHelper的类型引用System.Configuration;
②构建DBHelper数据库访问类:
//数据访问助手类 public static class DBHelper { /// <summary> /// 从配置文件中读取数据库链接字符串 /// </summary> public static string ConnString { get { return ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString; } } }
条件查询及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的类型返回 } }
执行插入数据代码:
/// <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; } }
数据插入:
执行结果:
修改首先根据界面上输入的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 ? "数据更新成功" : "数据更新失败"); }
修改结果:
删除数据部分比较简单,下面直接给出删除代码部分:
/// <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; } }