Dapper-小型ORM之王(C#.NET)

ORM:對(duì)象關(guān)系映射器弟跑,它直接將數(shù)據(jù)庫映射到C#對(duì)象灾前。

有很多ORM框架可用,Dapper是其中之一孟辑,被稱為ORM之王哎甲。

下面是Dapper主要的一些功能:

速度快,性能好;

更少的代碼行

對(duì)象映射

靜態(tài)對(duì)象綁定

動(dòng)態(tài)對(duì)象綁定

易于處理Sql語句

易于處理存儲(chǔ)過程

直接操作IDBConnection類扑浸,該類直接向數(shù)據(jù)庫提供平滑性和運(yùn)行查詢烧给,而不是像在EF和ADO.NET中那樣使用各種對(duì)象傳遞數(shù)據(jù)。

多個(gè)查詢支持

支持存儲(chǔ)過程

批量處理數(shù)據(jù)插入

允許基于多個(gè)輸入獲取多個(gè)數(shù)據(jù)

為什么選擇Dapper

Dapper是第二快的ORM

圖片參照:Dapper dotnet.

直接使用IDBConnection對(duì)象執(zhí)行CRUD操作喝噪;

通過數(shù)據(jù)庫提供查詢靜態(tài)和動(dòng)態(tài)數(shù)據(jù);

獲取簡單或復(fù)雜數(shù)據(jù)類型的通用結(jié)果;

Dapper允許同時(shí)存儲(chǔ)批量數(shù)據(jù)指么。

如何安裝Dapper

在Visual Studio中酝惧,創(chuàng)建一個(gè)新的控制臺(tái)項(xiàng)目,并在解決方案資源管理器中右鍵單擊引用伯诬,選擇 “管理Nuget包...”包管理器晚唇,然后搜索Dapper,并使用NuGet包管理器控制臺(tái)命令“install-package Dapper”盗似,這將在項(xiàng)目中安裝Dapper哩陕。

Dapper如何工作

主要包含三個(gè)步驟

第一步:使用連接字符串創(chuàng)建一個(gè)IDBConnection對(duì)象;

第二步:編寫一個(gè)查詢并將其存儲(chǔ)在一個(gè)普通的字符串變量中赫舒;

第三步:調(diào)用db.execute()并傳遞查詢悍及,完成。

在下面的示例中接癌,我們還將探索許多其他的方法心赶。

對(duì)于本例,我有一個(gè)名為“ContactDB”的數(shù)據(jù)庫缺猛,庫中包含一個(gè)名為“Contacts”的表缨叫,讓我們使用Dapper對(duì)Contacts表進(jìn)行CRUD操作。

創(chuàng)建一個(gè)控制臺(tái)應(yīng)用程序并安裝Dapper荔燎,并包含Dapper的命名空間耻姥。


示例1:

獲取所有數(shù)據(jù)并打印到控制臺(tái)

第一步:創(chuàng)建IDbConnection類的對(duì)象和SqlConnection的新實(shí)例。

staticIDbConnection db =newSqlConnection(ConfigurationManager.ConnectionStrings["SqlServerConnString"].ConnectionString);

SqlServerConnString是連接字符串名稱有咨,可以配置在程序中的App.config中琐簇。

第二步:寫一個(gè)查詢,并將其存儲(chǔ)到一個(gè)string類型的變量中

String query ="select * from contacts";

第三步:在db實(shí)例上啟動(dòng)查詢摔吏,并將泛型返回類型轉(zhuǎn)換為聯(lián)系人實(shí)體List

(List)db.Query(query)

只要使用這三個(gè)步驟鸽嫂,我們就可以從Contacts表中檢索出所有的數(shù)據(jù)纵装,可以在需要的地方去填充這些數(shù)據(jù)【菽常可以將整個(gè)列表打印到Winform程序的GridView或者WPF,更或者將整個(gè)列表傳遞給任何外部的WCF.

對(duì)于這個(gè)示例橡娄,我們將其打印到控制臺(tái)

List lstContact= (List)db.Query(query);

? ? ? ? ? ? foreach(varitemin lstContact)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? Console.WriteLine(item.FirstName +""+ item.LastName+"\n");

? ? ? ? ? ? }

? ? ? ? ? ? Console.ReadKey();

結(jié)果:

示例2:

給Contacts表中插入數(shù)據(jù),同樣包含三步

?第一步:創(chuàng)建IDbConnection類的對(duì)象和SqlConnection的新實(shí)例癣籽。

staticIDbConnection db =newSqlConnection(ConfigurationManager.ConnectionStrings["SqlServerConnString"].ConnectionString);

第二步:

stringquery =@"Insert into contacts values (@FirstName, @LastName, @Email, @Company, @Title);?

Select Cast (Scope_Identity() as int)";

在這里挽唉,我們包含兩個(gè)查詢來獲取Contacts表最后插入的id值。

在db實(shí)例上啟動(dòng)查詢筷狼,我們將獲得一個(gè)int類型的返回值瓶籽,因此將其存儲(chǔ)到int變量中,并將contact對(duì)象和查詢語句傳遞過去,如下所示埂材。

intid = db.Query(query, contact).Single();

在這三個(gè)簡單步驟中塑顺,數(shù)據(jù)將被插入到數(shù)據(jù)庫中。

Contact contact =newContact() { FirstName ="yixuan", LastName ="han", Email ="yixuanhan@aaa.com", Company ="BAT", Title ="PE" };

? ? ? ? ? ? stringquery =@"Insert into contacts values (@FirstName, @LastName, @Email, @Company, @Title);?

Select Cast (Scope_Identity() as int)";

? ? ? ? ? ? intid = db.Query(query, contact).Single();

查看數(shù)據(jù)庫多了一條記錄俏险,說明插入成功

示例3:現(xiàn)在严拒,讓我們通過在where子句中傳遞一個(gè)id,從Contacts表中獲取一條記錄

?第一步:創(chuàng)建IDbConnection類的對(duì)象和SqlConnection的新實(shí)例竖独。

static IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlServerConnString"].ConnectionString);

第二步:

stringquery ="select * from contacts where id = @id";

第三步:在db實(shí)例上啟動(dòng)查詢裤唠,我們將獲得一條聯(lián)系人記錄,并將其傳給contact對(duì)象進(jìn)行保存

Contact cont = (Contact)db.Query(query,new{ id =7}).SingleOrDefault();

備注:同樣的方法莹痢,我們可以對(duì)數(shù)據(jù)庫進(jìn)行Update和Delete操作

我們甚至可以用db.Execute()

db.Query()和db.Execute()之間主要的區(qū)別是种蘸,用db.Query()我們可以按照我們的設(shè)計(jì)獲取返回值,因?yàn)樗且粋€(gè)通用的方法竞膳,而db.Execute()不是一個(gè)通用的方法航瞭,因此它只能返回int

進(jìn)一步使用Dapper

我們也會(huì)遇到一次需要處理多個(gè)表的需求,例如一次查詢多個(gè)表或者以外鍵獲取數(shù)據(jù)

我們可以用Dapper同時(shí)訪問多個(gè)表顶猜,并且十分平滑

傳遞對(duì)象列表沧奴,Dapper本事可以識(shí)別出是批量插入

根據(jù)各種參數(shù)獲取數(shù)據(jù),Dapper會(huì)自動(dòng)將數(shù)組轉(zhuǎn)換成CSV,并返回一個(gè)List對(duì)象

示例4:

下面假如說我已經(jīng)有另一張名為“Address”的表

我們將在兩個(gè)表上同時(shí)執(zhí)行CRUD操作长窄,使用相同的ContactId,即Contacts表中的主鍵滔吠,Adress表中的外鍵

現(xiàn)在讓我們通過傳遞Id從Contacts表和Adress表中獲取多條數(shù)據(jù)

第一步和之前所有示例的第一步相同,我們從第二步開始

第二步:

stringquery ="select * from contacts where id = @id ; select * from address where ContactId = @id;";

第三步:db實(shí)例上啟動(dòng)查詢

using(varmultipleresult = db.QueryMultiple(query,new{ id =1 }))

? ? ? ? ? ? {

? ? ? ? ? ? ? ? varcontact = multipleresult.Read().SingleOrDefault();

? ? ? ? ? ? ? ? varAddresses = multipleresult.Read().ToList();

? ? ? ? ? ? ? ? if(contact !=null&& Addresses !=null)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? contact.Addresses.AddRange(Addresses);

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

以上三步你將 可以從多個(gè)表中獲得多條記錄

示例5:

讓我們使用存儲(chǔ)過程訪問數(shù)據(jù)庫

我有一個(gè)存儲(chǔ)過程挠日,聲明一個(gè)參數(shù)(ID),并且基于ID返回Contact數(shù)據(jù)和Address數(shù)據(jù)

Use ContactDB

SETANSI_NULLSONGOSETQUOTED_IDENTIFIERONGOCREATEPROCEDURE[dbo].[sp_GetContact_Address]@IdintASBEGINselect*fromcontactswhereid=@Id ;? select*fromAddresswhereContactId=@Id; ENDGO

用Dapper調(diào)用存儲(chǔ)過程

第一步同其他示例

在這里我們不需要寫任何的query語句,相反的我們將調(diào)用數(shù)據(jù)庫內(nèi)的存儲(chǔ)過程

在這里我們將做的更改是傳遞一個(gè)存儲(chǔ)過程的名稱而不是查詢語句嚣潜,并傳遞一個(gè)名稱為command type的參數(shù)冬骚。

第二步:在db實(shí)例上啟動(dòng)查詢

using(varmultipleresult = db.QueryMultiple("sp_GetContact_Address",new{ id =1 }, commandType: CommandType.StoredProcedure))

? ? ? ? ? ? {

? ? ? ? ? ? ? ? varcontact = multipleresult.Read().SingleOrDefault();

? ? ? ? ? ? ? ? varAddresses = multipleresult.Read().ToList();

? ? ? ? ? ? ? ? if(contact !=null&& Addresses !=null)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? contact.Addresses.AddRange(Addresses);

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

僅僅兩步只冻,就 可以成功的調(diào)用數(shù)據(jù)庫中的存儲(chǔ)過程

示例6:

當(dāng)我們需要處理運(yùn)行時(shí)對(duì)象時(shí)喜德,還可以將動(dòng)態(tài)對(duì)象或者值傳遞給存儲(chǔ)過程

下面這個(gè)存儲(chǔ)過程會(huì)給Contacts表里增加一條記錄

use ContactDBSETANSI_NULLSONGOSETQUOTED_IDENTIFIERONGOCREATEPROCEDURE[dbo].[SaveContact]@Idint output,

? ? @FirstNamenvarchar(50),

? ? @LastNamenvarchar(50),

? ? @Emailnvarchar(50),

? ? @Companynvarchar(50),

? ? @Titlenvarchar(50)ASBEGININSERTINTO[dbo].[Contacts]?

? ? ? ? ? ([FirstName],[LastName],[Company],[Title],[Email])VALUES?

? ? ? ? ? (@FirstName,@LastName,@Company,@Title,@Email);?

? ? ? ? SET@Id=cast(scope_identity()asint)? ENDGO

下面演示了如何使用Dapper通過傳遞動(dòng)態(tài)參數(shù)調(diào)用存儲(chǔ)過程

第一步同其他示例

第二步:創(chuàng)建一個(gè)動(dòng)態(tài)對(duì)象并將值傳遞給該對(duì)象

varparameter =new DynamicParameters();

? ? ? ? ? ? parameter.Add("@Id", con.Id, dbType: DbType.Int32, direction: ParameterDirection.InputOutput);

? ? ? ? ? ? parameter.Add("@FirstName", con.FirstName);

? ? ? ? ? ? parameter.Add("@LastName", con.LastName);

? ? ? ? ? ? parameter.Add("@Company", con.Company);

? ? ? ? ? ? parameter.Add("@Title", con.Title);

? ? ? ? ? ? parameter.Add("@Email", con.Email);

第三步:用db.Execute()調(diào)用存儲(chǔ)過程

db.Execute("SaveContact",parameter,commandType:CommandType.StoredProcedure);?

? //To get newly created ID back? con.Id = parameter.Get("@Id");

這些是使用c#動(dòng)態(tài)對(duì)象操作數(shù)據(jù)庫的方法。

原文鏈接:https://www.c-sharpcorner.com/UploadFile/e4e3f7/dapper-king-of-micro-orm-C-Sharp-net/?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末饮醇,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子秕豫,更是在濱河造成了極大的恐慌朴艰,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件馁蒂,死亡現(xiàn)場離奇詭異呵晚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)沫屡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來撮珠,“玉大人沮脖,你說我怎么就攤上這事⌒炯保” “怎么了勺届?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長娶耍。 經(jīng)常有香客問我免姿,道長,這世上最難降的妖魔是什么榕酒? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任胚膊,我火速辦了婚禮,結(jié)果婚禮上想鹰,老公的妹妹穿的比我還像新娘紊婉。我一直安慰自己,他們只是感情好辑舷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布喻犁。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪肢础。 梳的紋絲不亂的頭發(fā)上还栓,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音传轰,去河邊找鬼剩盒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛路召,可吹牛的內(nèi)容都是我干的勃刨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼股淡,長吁一口氣:“原來是場噩夢啊……” “哼身隐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起唯灵,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤贾铝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后埠帕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體垢揩,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年敛瓷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了叁巨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡呐籽,死狀恐怖锋勺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情狡蝶,我是刑警寧澤庶橱,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站贪惹,受9級(jí)特大地震影響苏章,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜奏瞬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一枫绅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丝格,春花似錦撑瞧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽订咸。三九已至,卻和暖如春酬诀,著一層夾襖步出監(jiān)牢的瞬間脏嚷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工瞒御, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留父叙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓肴裙,卻偏偏與公主長得像趾唱,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蜻懦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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

  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 31,930評(píng)論 2 89
  • 概述在iOS開發(fā)中UITableView可以說是使用最廣泛的控件甜癞,我們平時(shí)使用的軟件中到處都可以看到它的影子,類似...
    liudhkk閱讀 9,039評(píng)論 3 38
  • 應(yīng)用程序還需要操作存儲(chǔ)在其他數(shù)據(jù)源(如SQL數(shù)據(jù)庫或XML文件)中的數(shù)據(jù)宛乃,甚至通過Web服務(wù)訪問它們悠咱。傳統(tǒng)上,查詢...
    CarlDonitz閱讀 592評(píng)論 0 0
  • pandas dataFrame(數(shù)據(jù)框)是能夠有效表示csv文件內(nèi)容的一種數(shù)據(jù)格式征炼,它是允許每一列屬于不同類型的...
    誰共我醉明月閱讀 127評(píng)論 0 1
  • 最近打算系統(tǒng)學(xué)習(xí)廣論析既,但進(jìn)度總是被瑣事打斷,網(wǎng)上買來二十冊(cè)的全套書谆奥,裝模作樣眼坏,第一本還沒看完。在這樣散漫的狀態(tài)下酸些,...
    Evangelinehu閱讀 201評(píng)論 0 0