【.NET 框架】—— Dapper框架基於Sqlserver資料庫CRUD操作(一)
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框架相關的元件引入到解決方案中。具體操作如下:
2.2.基於mockaroo構造虛擬資料
Mockaroo網址:https://www.mockaroo.com/
Mockaroo是一個模擬虛擬資料的一個數據構造網站,可以通過它來構造虛擬的資料庫表中的資料,並生成sql檔案,非常方便,這裡簡單地列出構造資料的表與相應的表中的欄位列。
這裡使用mockaroo網站構造資料列並下載到對應的sql如下圖所示操作即可:
選擇Download Data後可以自動生成Person.sql檔案。
2.3.Dapper與資料庫訪問操作
使用Dapper連線Sqlserver資料庫需要使用到連線字串,連線字串是在App.config檔案中配置,需要新增如下連線配置:
配置如下:
<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; } } }
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; } }
資料插入:
執行結果:
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 ? "資料更新成功" : "資料更新失敗"); }
修改結果:
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; } }