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/?