asp.net core系列 66 Dapper介紹--Micro-ORM

一.概述

目前對于.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方法猫缭。 “注意緩沖不是緩存”葱弟。

dapper buffer/cache

(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ò)展包勿侯。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拓瞪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子助琐,更是在濱河造成了極大的恐慌祭埂,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兵钮,死亡現(xiàn)場離奇詭異蛆橡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)掘譬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進(jìn)店門泰演,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人葱轩,你說我怎么就攤上這事睦焕∶晡眨” “怎么了?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵垃喊,是天一觀的道長趾疚。 經(jīng)常有香客問我赎线,道長同衣,這世上最難降的妖魔是什么皆刺? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任妇蛀,我火速辦了婚禮耕突,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘评架。我一直安慰自己眷茁,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布纵诞。 她就那樣靜靜地躺著上祈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪浙芙。 梳的紋絲不亂的頭發(fā)上登刺,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天,我揣著相機(jī)與錄音嗡呼,去河邊找鬼纸俭。 笑死,一個胖子當(dāng)著我的面吹牛南窗,可吹牛的內(nèi)容都是我干的揍很。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼万伤,長吁一口氣:“原來是場噩夢啊……” “哼窒悔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起敌买,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤简珠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后虹钮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體北救,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年芜抒,在試婚紗的時候發(fā)現(xiàn)自己被綠了珍策。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡宅倒,死狀恐怖攘宙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤蹭劈,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布疗绣,位于F島的核電站,受9級特大地震影響铺韧,放射性物質(zhì)發(fā)生泄漏多矮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一哈打、第九天 我趴在偏房一處隱蔽的房頂上張望塔逃。 院中可真熱鬧,春花似錦料仗、人聲如沸湾盗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽格粪。三九已至,卻和暖如春氛改,著一層夾襖步出監(jiān)牢的瞬間帐萎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工胜卤, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留吓肋,地道東北人。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓瑰艘,卻偏偏與公主長得像是鬼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子紫新,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容