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; } }