ORM Dapper

[C#.Net] 短小精幹的ORM-Dapper介紹(一)

Bruce Hou 2018/12/13 17:48:09
23762

[C#.Net] 短小精幹的ORM-Dapper介紹(一)


簡介

ORM(Object-relational mapping)技術是目前開發上與DB溝通的最主要的方式,若是使用ORM,大概有90%的開發人員是使用Entity Framework(EF),不過EF的肥大與執行效率不佳也常常讓人詬病,今天就介紹一個超輕量又快速,卻又很強大的ORM框架-Dapper

作者

侯舜宇


Dapper說明與安裝

目前大部分的開發人員在與DB的溝通方是就是使用 EntityFramework,雖然嚴謹紮實,卻也多出不少額外的工作,例如要依照 Schema 在專案定義 Entity 物件、資料庫變更時要記得同步更新 Entity 定義,遇到多 TABLE JOIN 查詢得另外宣告自訂類別承接查詢結果。對於要求嚴謹精準的中大型系統,這類準備工作屬無法避免的代價,但在一些力求快速輕巧的開發情境,所有對資料庫的存取 (Table、View、Stored Procedure) 需預先定義,還必須隨時保持與資料庫一致,使用 EF 之類的架構就顯的笨重
 
今天就來介紹一個超輕量級的 ORM-Dapper,幾乎感覺不到它的存在,安裝後只有一個組件 Dapper.dll,大小呢?只有156KB (EntityFramework.dll 的檔案是 5MB ),安裝上也很容易,只需打開 NuGet,搜尋 Dapper 後直接安裝即可
 
Dapper 執行速度的評價也是獲得很多使用者的認同,網路上也可以找到各種ORM框架的執行速度比較資料,如下圖:
 
 
 
 
 
那我們就先建立一個新的 Console 應用程式專案,搭配 Northwind 資料庫來操作看看。先將專案透過 NuGet 加入 Dapper 套件
 
 
 
 
 
建立一個 class  作為對應至 Customers 資料表的 entity。程式碼如下:
 
 
 
 
 
首先要知道的是,Dapper 不管理資料庫連線的開啟和關閉——你得自行管理連線。了解這點,就可以開始用它來存取資料了。
 
接下來在程式碼當中引用 Dapper 命名空間,然後就跟使用傳統 ADO.NET API 的步驟類似:取得連線字串、建立連線、然後執行查詢命令。 Dapper 提供了一組擴充方法,讓實作 IDbConnection 介面的物件都增加了額外的功能。
 
範例一:查詢結果為自定義的物件
這裡使用泛型版本的 Query 方法,以便將查詢結果自動對應至先前定義好的 Customer 物件的屬性。程式碼如下:
 
 
 
 
 
執行結果如下:
 
 
  
 
 
下圖是 Customers 這個 table 的所有欄位,雖然我們語法的 select 是*把全部欄位都撈出來,對應到 Customer 物件只有其中5個欄位,但只要欄位名稱相同, Dapper 就可以把對應的內容塞回 Customer 物件,欄位數量不同也不會出錯
 
 
 
 
 
範例二:使用回傳值為 dynamic 型別的 Query 方法
使用此方法的時候,因為回傳型別為 dynamic ,故無法支援 IntelliSense ,也無法透過 IDE 檢查相關的編譯錯誤,故輸入時需自行注意有沒有打錯字
 
使用回傳 dynamic 型別的 Query 方法。程式碼如下:
 
(因執行結果的內容不是此篇文章的重點,故接下來的範例就不顯示輸出部分的程式碼及執行結果)
 
 
 
 
 
範例三:使用匿名型別參數查詢
只要匿名型別物件的屬性名稱與 sql 語法的參數名稱相同,即可自動 mapping
 
將查詢參數塞入匿名型別物件,指給 Query 方法的第二個參數即可使用參數查詢。程式碼如下:
 
 
 
 
 
範例四:where in查詢
一樣直接使用匿名型別物件,將屬性名稱與 sql 語法的參數命名相同,再將 in 的多個條件以陣列方式指給匿名型別即可
 
過去有寫過 where in 多條件的查詢語法的人就知道,碰到此情況在組 sql 語法的時候真的非常麻煩,常常都要跑迴圈,一邊塞 SqlParameter 物件,一邊組 sql ,但 Dapper 只需短短幾行就能搞定,真是好吃又不黏牙XDDDD
 
程式碼如下:
 
 
 
 
 
除了上述我們看到的 Query 查詢方法外,Dapper 跟我們用 Lambda 查詢非常相似,也提供了下列的查詢方式,使用上不需花費太多時間精神就能馬上上手
以上就是查詢部分的介紹
 
 
Bruce Hou