apper
查漏補(bǔ)缺系列之dapper初體驗(yàn)
什么是dapper
在維護(hù)一些較老的項(xiàng)目的時(shí)候,往往我們會(huì)用很多sql那么這個(gè)時(shí)候我們要考慮優(yōu)化這些項(xiàng)目的時(shí)候,我們就可以使用dapper
dapper是一款輕量級(jí)的ORM框架,它的優(yōu)勢(shì)很多輕量級(jí),速度快,而且還支持不同的數(shù)據(jù)庫(kù),github地址如下:
https://github.com/StackExchange/Dapper
準(zhǔn)備工作
本次為了演示,我們引用NUnit做單測(cè),通過(guò)SQL Server Profiler來(lái)監(jiān)控生成的sql語(yǔ)句。
dapper引用也特別方面我們可以通過(guò)NuGet下載引用dapper程序包,然后我們?cè)陬惱镆胾sing Dapper;就可以了。
數(shù)據(jù)庫(kù)表結(jié)構(gòu)如下:
另外我們還要?jiǎng)?chuàng)建一個(gè)名為DapperTestModel的實(shí)體
public class DapperTestModel
{
public int Id { get; set; }
public string Message { get; set; }
}
讓我們準(zhǔn)備好鏈接字符串開(kāi)始本次演示吧
private string connString =
System.Configuration.ConfigurationManager.ConnectionStrings["sqlConnectionString"].ConnectionString;
編輯
編輯代碼如下,我們把新增和修改的方法寫在一起,通過(guò)判斷ID是否為0來(lái)覺(jué)得是新增還是修改。首先我們演示新增方法
[Test]
public void Edit()
{
int ID = 0;
string sql = "insert into dappertest([Message])values(@Message)";
using (IDbConnection conn = new SqlConnection(connString))
{
if (ID > 0)
{
sql = "update dappertest set [Message]=@Message where Id=@ID";
conn.Execute(sql, new {ID = ID, Message = "修改這句話"});
}
else
{
conn.Execute(sql, new { Message = "添加一句話" });
}
}
}
這里我們看到dapper很方便的一點(diǎn)就是我們可以使對(duì)象來(lái)代替參數(shù),這里我們就可以通過(guò)匿名對(duì)象來(lái)傳遞參數(shù)
好了我們執(zhí)行單測(cè),看看數(shù)據(jù)庫(kù)中執(zhí)行的語(yǔ)句
exec sp_executesql N'insert into dappertest([Message])values(@Message)',N'@Message nvarchar(4000)',@Message=N'添加一句話'
我們?cè)谌?shù)據(jù)庫(kù)中查看一下數(shù)據(jù)
接著我們?nèi)バ薷腎D來(lái)看看修改方法
exec sp_executesql N'update dappertest set [Message]=@Message where Id=@ID',N'@ID int,@Message nvarchar(4000)',@ID=10,@Message=N'修改這句話'
我們?cè)偃?shù)據(jù)庫(kù)中查看一下數(shù)據(jù)情況
查詢
dapper的查詢功能也很靈活,比如我們需要獲取一個(gè)list列表,如果換成使用DBHelper類,我們可能需要先查詢一個(gè)DateSet然后再將其轉(zhuǎn)成list,那么使用dapper我們可以直接轉(zhuǎn)成list,我們來(lái)看看具體的實(shí)現(xiàn)代碼
[Test]
public void GetList()
{
using (IDbConnection conn = new SqlConnection(connString))
{
string sql = "select ID,[Message] from dappertest";
List<DapperTestModel> dapperList = conn.Query<DapperTestModel>(sql).ToList();
}
}
我們?cè)诳纯磾?shù)據(jù)庫(kù)中的執(zhí)行情況
select ID,[Message] from dappertest
刪除
刪除和新增修改的方式一致,代碼如下
[Test]
public void Delete()
{
int ID = 10;
using (IDbConnection conn = new SqlConnection(connString))
{
int retrunCount = 0;
string sql = "delete from dappertest where id=@ID";
retrunCount = conn.Execute(sql, new { ID = ID });
}
}
同樣的我們看看數(shù)據(jù)庫(kù)中的執(zhí)行語(yǔ)句
exec sp_executesql N'delete from dappertest where id=@ID',N'@ID int',@ID=10
我們?cè)俨樵兛纯?/p>
存儲(chǔ)過(guò)程
我們?cè)賮?lái)看看存儲(chǔ)過(guò)程的調(diào)用,首先我們?cè)跀?shù)據(jù)庫(kù)中添加一個(gè)簡(jiǎn)單的存儲(chǔ)過(guò)程
CREATE PROCEDURE DapperInsert
@Message nvarchar(200)
AS
insert into dappertest([message])
values(@Message)
然后我們?nèi)フ{(diào)用這個(gè)存儲(chǔ)過(guò)程
[Test]
public void PInsert()
{
using (IDbConnection conn = new SqlConnection(connString))
{
conn.Execute("DapperInsert",new {Message="這是存儲(chǔ)過(guò)程新增的"}, null, null,CommandType.StoredProcedure);
}
}
同樣的我們看看數(shù)據(jù)庫(kù)中的執(zhí)行情況
exec DapperInsert @Message=N'這是存儲(chǔ)過(guò)程新增的'
事務(wù)
在平常的業(yè)務(wù)系統(tǒng)中,我們或多或少會(huì)用到事務(wù),那么接下來(lái)我們演示一下在dapper中事務(wù)的調(diào)用
[Test]
public void Insert()
{
using (IDbConnection conn = new SqlConnection(connString))
{
conn.Open();
//開(kāi)始事務(wù)
IDbTransaction transaction = conn.BeginTransaction();
try
{
string sql = "insert into dappertest([Message])values(@Message)";
string sql2 = "insert into dappertest([Message])values(@Message)";
conn.Execute(sql, new { Message ="再次新增一句話" }, transaction);
conn.Execute(sql2, new { Message=""}, transaction);
//提交事務(wù)
transaction.Commit();
}
catch (Exception ex)
{
//出現(xiàn)異常,事務(wù)Rollback
transaction.Rollback();
throw new Exception(ex.Message);
}
}
}
我們故意使其在第二次新增的時(shí)候報(bào)錯(cuò)
我們看看數(shù)據(jù)庫(kù)中的執(zhí)行情況,這里數(shù)據(jù)庫(kù)會(huì)執(zhí)行了兩次
第一次
exec sp_executesql N'insert into dappertest([Message])values(@Message)',N'@Message nvarchar(4000)',@Message=N'再次新增一句話'
第二次
insert into dappertest([Message])values()
這里我們失敗回滾了,我們?cè)诳纯磾?shù)據(jù)庫(kù)中的情框
我們看到數(shù)據(jù)庫(kù)中果然沒(méi)有新增數(shù)據(jù),我們目的也達(dá)到了。
總結(jié)
本次我給大家?guī)?lái)了一些dapper的簡(jiǎn)單應(yīng)用包括簡(jiǎn)單邏輯調(diào)用存儲(chǔ)過(guò)程的調(diào)用,以及事務(wù)的調(diào)用,從我們的簡(jiǎn)單示例中我們看到,dapper是一款十分優(yōu)秀的輕量級(jí)的ORM框架,如果我們需要維護(hù)那種sql語(yǔ)句特別多的項(xiàng)目時(shí),可以考慮使用dapper,使用dapper我們可以通過(guò)對(duì)象很靈活的去給我們的sql語(yǔ)句或者存儲(chǔ)過(guò)程傳遞參數(shù),也可以很靈活的轉(zhuǎn)換類型。
總結(jié)
- 上一篇: solidity基础知识
- 下一篇: (1) 设计表结构