一.概述
目前對于.net的數(shù)據(jù)訪問ORM工具很多,EF和EF Core是一個重量級的框架。最近在搭建新的項目架構(gòu),來學(xué)習(xí)一下輕量級的數(shù)據(jù)訪問ORM工具Dapper。Dapper支持SQL Server,MySQL,Sqlite,SqlCE,F(xiàn)irebird等的高性能Micro-ORM(微ORM框架)。最新版本是1.60.16。
Dapper擴(kuò)展了IDbConnection接口,例如實現(xiàn)一個查詢方法,Dapper定義的一個Query查詢方法如下:
public static IEnumerable<T> Query<T>(this IDbConnection cnn, string sql, object param = null, SqlTransaction transaction = null, bool buffered = true)
原生態(tài)ado.net的System.Data.SqlClient也實現(xiàn)了IDbConnection接口,可參考如下:
https://docs.microsoft.com/en-us/dotnet/api/system.data.idbconnection?redirectedfrom=MSDN&view=netframework-4.8
Dapper開源地址:https://github.com/StackExchange/Dapper
Dapper Nuget包: https://www.nuget.org/packages/Dapper/
Dapper的主要特征包括:
(1) 支持強(qiáng)類型。如查詢 Query<T>
(2) 支持動態(tài)對象。在Dapper. Rainbow擴(kuò)展包中有實現(xiàn)
(3) 使用Execute執(zhí)行執(zhí)行T-SQL腳本塊,不返回結(jié)果。
(4) 批量執(zhí)行SQL語句。
(5) “性能”是Dapper的一個亮點。官方列出了查詢(select)與其它的ORM工具性能的對比參數(shù)。
(6) 參數(shù)化查詢
(7) 列表支持
(8) 字面替換
(9) 對于查詢的緩沖與無緩沖,默認(rèn)行為是緩沖將數(shù)據(jù)交給了后端List,獲得數(shù)據(jù)后,就釋放了任何資源(減少了數(shù)據(jù)庫共享鎖等)。對于大量查詢(比如:>100條),需要將緩沖行為關(guān)閉,避免占用太多內(nèi)存,設(shè)置buffered:false的Query方法。 “注意緩沖不是緩存”。
(10) 實體中外鍵關(guān)系表映射。
(11) 允許單個查詢請求,查詢多個表。如:select table1,select table2
(12) 支持程序中數(shù)據(jù)庫事務(wù)處理。
Dapper注意事項:
(1) Dapper緩存用來保存每個查詢的信息,緩存在ConcurrentDictionary對象中,如果不使用參數(shù)的情況下動態(tài)生成sql字符串,則可能會遇到內(nèi)存問題。
(2) Dapper的簡潔性意味著ORM附帶的許多功能都被剝離了。它擔(dān)心95%的情況,并為您提供大多數(shù)時間所需的工具。它并不試圖解決所有問題。
二. Dapper源代碼包
2.1 Dapper.Contrib包
Dapper.Contrib是包含許多用于CURD的輔助方法,Contrib的關(guān)鍵組成部分是它為您的實體提供跟蹤,以確定是否已進(jìn)行更改。與EF一樣GET出來的實現(xiàn),在Update方法時,僅更新已更改的屬性所需的SQL。Dapper.Contrib中的擴(kuò)展方法的完整列表,可以看出方法都是強(qiáng)類型:
T Get<T>(id);
IEnumerable<T> GetAll<T>();
int Insert<T>(T obj);
int Insert<T>(Enumerable<T> list);
bool Update<T>(T obj);
bool Update<T>(Enumerable<T> list);
bool Delete<T>(T obj);
bool Delete<T>(Enumerable<T> list);
bool DeleteAll<T>();
Dapper將自動使用名為“ id”(不區(qū)分大小寫)的屬性作為Key 屬性(所以數(shù)據(jù)表中最好以ID名稱為主鍵), 如果實體不遵循此約定,請使用[Key]或[ExplicitKey]屬性修飾特定屬性。[Key]應(yīng)該用于數(shù)據(jù)庫生成的鍵(例如自動增量列),而[ExplicitKey]應(yīng)該用于代碼中生成的顯式鍵值
public class User
{
[Key]
int TheId { get; set; }
string Name { get; set; }
int Age { get; set; }
}
[Table ("emps")]
public class Employee
{
public int Id { get; set; }
public string Name { get; set; }
}
[Write(true/false)] - 這個屬性是(不)可寫的
[Computed] - 此屬性已計算,不應(yīng)作為更新的一部分
具體參考https://github.com/StackExchange/Dapper/tree/master/Dapper.Contrib
2.2 Dapper.EntityFramework包
Dapper.EntityFramework和Dapper.EntityFramework.StrongName依賴了entityframework 6.1.3 的DbGeography類和Microsoft.SqlServer.Types的SqlGeography類, 從數(shù)據(jù)庫中讀取幾何和地理值時,我們需要明確指定SRID以將其保留在DbGeometry / DbGeography類型中。
2.3 Dapper. Rainbow包
Rainbow是一個Abstract類,可以將其用作Dapper類的基類,實現(xiàn)CURD的方法,以Dynamic為主的動態(tài)類型用于插入、更新、以及查詢參數(shù)的實現(xiàn),輸出返回強(qiáng)類型。Rainbow希望你的所有表都有一個名為“Id”的標(biāo)識列,在Dapper源代碼解決方案下沒有Dapper. Rainbow組件的測試案例。
Contrib和Rainbow之間的主要區(qū)別在于:一個跟蹤您實體的變化,另一個不跟蹤:
(1) 如果希望能夠跟蹤實體中的更改,請使用Contrib。
(1) 當(dāng)您想要使用更符合標(biāo)準(zhǔn)ADO.NET方法的內(nèi)容時,請使用Rainbow。
2.4 Dapper.SqlBuilder包
Dapper.SqlBuilder組件,用于動態(tài)構(gòu)建SQL查詢。
2.5 Dapper.StrongName與Dapper包
StrongName包下的所有類文件都是來源于Dapper包中的類,支持SQL Server,MySQL,Sqlite,SqlCE,F(xiàn)irebird等的高性能Micro-ORM, 用于強(qiáng)名稱,使用SqlMapper來實現(xiàn)ADO.NET的輕量級對象映射器。
三.其它擴(kuò)展包
3.1 Dapper. SimpleCRUD
SimpleCRUD是一個簡單CRUD助手,可以選擇更改數(shù)據(jù)庫方言。默認(rèn)為Microsoft SQL Server,但可以更改為PostgreSQL或MySQL。放棄了.Net Core版本的SQLite支持(在新項目中實用)。
3.2 Dapper.Extensions.NetCore
Dapper是一個簡單的CRUD助手。在Nuget上還有其它Dapper.Extensions.xx的擴(kuò)展包。