什么是dapper
在维护一些较老的项目的时候,往往我们会用很多sql那么这个时候我们要考虑优化这些项目的时候,我们就可以使用dapper
dapper 是一款轻量级的ORM框架,它的优势很多轻量级,速度快,而且还支持不同的数据库,github地址如下:
准备工作
本次为了演示,我们引用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"; ListdapperList = conn.Query (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)ASinsert 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语句或者存储过程传递参数,也可以很灵活的转换类型。