什么是dapper
在維護一些較老的項目的時候,往往我們會用很多sql那么這個時候我們要考慮優化這些項目的時候,我們就可以使用dapper
dapper 是一款輕量級的ORM框架,它的優勢很多輕量級,速度快,而且還支持不同的數據庫,github地址如下:
https://github.com/StackExchange/Dapper
准備工作
本次為了演示,我們引用NUnit做單測,通過SQL Server Profiler來監控生成的sql語句。
dapper引用也特別方面我們可以通過NuGet下載引用dapper程序包,然后我們在類里引用using Dapper;就可以了。
數據庫表結構如下:
另外我們還要創建一個名為DapperTestModel
的實體
public class DapperTestModel
{
public int Id { get; set; }
public string Message { get; set; }
}
讓我們准備好鏈接字符串開始本次演示吧
private string connString =
System.Configuration.ConfigurationManager.ConnectionStrings["sqlConnectionString"].ConnectionString;
編輯
編輯代碼如下,我們把新增和修改的方法寫在一起,通過判斷ID是否為0來覺得是新增還是修改。首先我們演示新增方法
[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很方便的一點就是我們可以使對象來代替參數,這里我們就可以通過匿名對象來傳遞參數
好了我們執行單測,看看數據庫中執行的語句
exec sp_executesql N'insert into dappertest([Message])values(@Message)',N'@Message nvarchar(4000)',@Message=N'添加一句話'
我們在去數據庫中查看一下數據
接着我們去修改ID來看看修改方法
exec sp_executesql N'update dappertest set [Message]=@Message where Id=@ID',N'@ID int,@Message nvarchar(4000)',@ID=10,@Message=N'修改這句話'
我們再去數據庫中查看一下數據情況
查詢
dapper的查詢功能也很靈活,比如我們需要獲取一個list列表,如果換成使用DBHelper類,我們可能需要先查詢一個DateSet然后再將其轉成list,那么使用dapper我們可以直接轉成list,我們來看看具體的實現代碼
[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();
}
}
我們在看看數據庫中的執行情況
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 });
}
}
同樣的我們看看數據庫中的執行語句
exec sp_executesql N'delete from dappertest where id=@ID',N'@ID int',@ID=10
我們再查詢看看
存儲過程
我們再來看看存儲過程的調用,首先我們在數據庫中添加一個簡單的存儲過程
CREATE PROCEDURE DapperInsert
@Message nvarchar(200)
AS
insert into dappertest([message])
values(@Message)
然后我們去調用這個存儲過程
[Test]
public void PInsert()
{
using (IDbConnection conn = new SqlConnection(connString))
{
conn.Execute("DapperInsert",new {Message="這是存儲過程新增的"}, null, null,CommandType.StoredProcedure);
}
}
同樣的我們看看數據庫中的執行情況
exec DapperInsert @Message=N'這是存儲過程新增的'
事務
在平常的業務系統中,我們或多或少會用到事務,那么接下來我們演示一下在dapper中事務的調用
[Test]
public void Insert()
{
using (IDbConnection conn = new SqlConnection(connString))
{
conn.Open();
//開始事務
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);
//提交事務
transaction.Commit();
}
catch (Exception ex)
{
//出現異常,事務Rollback
transaction.Rollback();
throw new Exception(ex.Message);
}
}
}
我們故意使其在第二次新增的時候報錯
我們看看數據庫中的執行情況,這里數據庫會執行了兩次
第一次
exec sp_executesql N'insert into dappertest([Message])values(@Message)',N'@Message nvarchar(4000)',@Message=N'再次新增一句話'
第二次
insert into dappertest([Message])values()
這里我們失敗回滾了,我們在看看數據庫中的情框
我們看到數據庫中果然沒有新增數據,我們目的也達到了。
總結
本次我給大家帶來了一些dapper的簡單應用包括簡單邏輯調用存儲過程的調用,以及事務的調用,從我們的簡單示例中我們看到,dapper是一款十分優秀的輕量級的ORM框架,如果我們需要維護那種sql語句特別多的項目時,可以考慮使用dapper,使用dapper我們可以通過對象很靈活的去給我們的sql語句或者存儲過程傳遞參數,也可以很靈活的轉換類型。