關於Dapper的介紹,其實多到可以算月經文了XD
不過剛好有機會使用到,所以就順著介紹一下。
Dapper是一個輕量型的ORM工具,著重在效能與速度,所以他也只有一個Dll檔而已
非常輕量。
有興趣的讀者們可以到GitHub上看一下SouceCode,都是公開的。
雖然耳聞Dapper這個神器很久了,只是由於筆者是EF派的,所以已經很少會接觸到純下SQL的部分。
不過最近,筆者剛好需要撰寫SQL Command,於是又重新投入 DataReader、DataSet、DataTable的懷抱。
只是在使用的過程中,由於不想要讓程式碼看起來太過骯髒,於是在上層多包了一層父類來減少重複的程式碼
不過在撰寫查詢的時候卻發現到一個問題:
以下由DataReader做一個簡單的示範。
片段程式碼:
// 設定相關資料庫連線參數
String connection = System.Configuration.ConfigurationManager.ConnectionStrings["OrderDB"].ConnectionString;
protected SqlConnection sc = new SqlConnection(connection);
protected SqlCommand sqlcommand = new SqlCommand();
String sql = "select Student_Id,Student_Name from Student";
sqlcommand.Connection = sc;
// 開啟連線
sc.Open();
SqlCommand command = new SqlCommand(sql,connection);
// 讀取資料
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
Console.WriteLine("StudentId: {0}, StudentName: {1}", reader["Student_Id"],reader["Student_Name"]);
}
由於已經習慣寫EF的我,對於這樣的操作方式會覺得顯得不夠直觀。
明明已經在Select當中定義了要讀取哪些欄位,但是在最後DataReader的時候,還是需要再次手動撈取欄位
假設如果要塞到自定義的List中,還需要一個一個把欄位給放進去。
於是開始思考,該怎麼做才能最快解決這個問題。
後來研究了許久,還是決定投入EF的懷抱,即使是透過SQL Command的方式。
Dapper的使用方式相當簡單:
首先在NuGet當中先安裝Dapper工具
接著就可以直接撰寫啦!
Dapper主要是透過 Extension Method 來擴充 SqlConnection的類別
因此當你在最上層 using了 Dapper後
using Dapper;
你會發現SqlConnection多了以下東西:
主要是針對Query來去做擴充。
後來了解後發現原理其實很簡單
就是先取得泛型的類別,並透過for迴圈的方式,將每一個的欄位資料,Mapping到指定的類別當中,
最後再裝回List,結束。
object obj;
Type type = obj.GetType();
var ps = type.GetProperties();
而Dapper使用方法呢其實就是這樣子:
// 設定相關資料庫連線參數
String connection = System.Configuration.ConfigurationManager.ConnectionStrings["OrderDB"].ConnectionString;
protected SqlConnection sc = new SqlConnection(connection);
protected SqlCommand sqlcommand = new SqlCommand();
String sql = "select Student_Id,Student_Name from Student";
sqlcommand.Connection = sc;
// 開啟連線
sc.Open();
// 資料讀取
String sql = "select Student_Id,Student_Name from Student";
var result = sc.Query<Student>(sql);
這裡使用泛型版本的 Query 方法,以便將查詢結果自動對應至先前定義好的 Student 物件的屬性。
如此一來就可以快速的取得資料了。
結果如下:
另外,Dapper本身也支援具名參數,主要是為了防止 sql injection
使用方法也相當的簡單:
String sql = "select Student_Id,Student_Name from Student where Student_Name=@Name";
var result = sc.Query<Student>(sql,new { Name="Leo"});
以上文章敘述如有錯誤及觀念不正確,請不吝嗇指教:)
有任何家教、案子 或技術相關問題 請都歡迎聯繫我