• 查漏补缺系列之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语句或者存储过程传递参数,也可以很灵活的转换类型。

  • 相关阅读:
    WPF中样式中事件处理
    模板方法
    WPF 中ComboBox绑定DataSet
    装饰模式
    【转帖】c#项目的打包部署教材图文
    WPF中用比例设置长度或宽度
    在WFP中完美使用winform的控件
    一个WPF软件作品新鲜出炉,欢迎拍砖
    建造者模式(生成器模式)
    Windows Presentation Foundation 中的 Pack URI
  • 原文地址:https://www.cnblogs.com/chen-jie/p/dapper.html
Copyright © 2020-2023  润新知