查漏补缺系列之dapper初体验

什么是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语句或者存储过程传递参数,也可以很灵活的转换类型。

原文地址:https://www.cnblogs.com/chen-jie/p/dapper.html