• ORM之轻量级框架--Dapper


    一、什么是Dapper?

    Dapper是一款轻量级Orm框架,它是属于半自动的,它和Entity Framework和NHibernate不同,它只有一个单文件,没有很复杂的配置,如果你喜欢原生Sql语句,而且又是喜欢Orm框架,那么Dapper对于你来说是再适合不过了。

    二、Dapper优点
    我也是刚开始学习Dapper,让我自己去总结它的优点,可能也就还没真正去体验到带来的好。所以我也是抱着学习的态度,去参考一些大佬给它总结的优点:

    1、轻量级、单文件。
    2、支持多数据,而且性能优越。

    3、Dapper原理通过Emit反射IDataReader的序列队列,来快速的得到和产生对象。

    三、例子演示

    下面我们通过一个简单的例子来学习Dapper。

    1、我们通过VS2017 创建一个控制台程序来进行我们的学习,首先我们创建一个项目,命名为DapperTest。

    2、首先我们先建立一张UserInfo表,我使用的是Sql Server创建。

    CREATE TABLE [dbo].[UserInfo](
    [uID] [int] NOT NULL,
    [uLoginName] [nvarchar](60) NULL,
    [uLoginPWD] [nvarchar](60) NULL,
    [uRealName] [nvarchar](60) NULL,
    [uStatus] [int] NOT NULL,
    [uRemark] [nvarchar](max) NULL,
    [uCreateTime] [datetime] NOT NULL,
    CONSTRAINT [PK_dbo.sysUserInfo] PRIMARY KEY CLUSTERED 
    (
    [uID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    
    GO

    3、接下来我们创建一个数据表对应的实体对象。

     public class UserInfo
        {
            //uID, uLoginName, uLoginPWD, uRealName, uStatus, uRemark, uCreateTime
           /// <summary>
           /// 主键
           /// </summary>
            public int uID { get; set; }
            /// <summary>
            /// 用户名
            /// </summary>
            public string uLoginName { get; set; }
            /// <summary>
            /// 密码
            /// </summary>
            public string uLoginPWD { get; set; }
            /// <summary>
            /// 真实名字
            /// </summary>
            public string uRealName { get; set; }
            /// <summary>
            /// 状态,0表示正常,1表示删除
            /// </summary>
            public int uStatus { get; set; }
            /// <summary>
            /// 备注
            /// </summary>
            public string uRemark { get; set; }
            /// <summary>
            /// 创建时间
            /// </summary>
            public DateTime uCreateTime { get; set; }
        }

    3、我们需要在我们项目中添加Dapper  Nuget包,然后点击安装就可以了。

    4、我们需要编写一个增删查改帮助类,大家也可以不用按照我那样。(我是为了不要把那些操作数据库和业务逻辑代码全部放到一起)

    public class DapperHelper
        {

    }

    5.1新增,插入一条数据。

    先看DapperHelper中代码:
     string sqlConnstr= "Data Source=.;Initial Catalog=TestDb;User Id=sa;Password=123";
            /// <summary>
            /// 新增
            /// </summary>
            /// <param name="user"></param>
            /// <returns></returns>
            public int UserInsert(UserInfo user)
            {
                using (var db=new SqlConnection(sqlConnstr))
                {
                    //uID, uLoginName, uLoginPWD, uRealName, uStatus, uRemark, uCreateTime
                    string query = "INSERT INTO USERINFO VALUES(@uLoginName, @uLoginPWD, @uRealName, @uStatus, @uRemark, @uCreateTime)";
                    return db.Execute(query, user);
                }
            }

    接下来我们来看看调用代码和调用结果。

      #region 1.0插入数据
                UserInfo user = new UserInfo
                {
                    uLoginName = "xiaoxiao",
                    uLoginPWD = "123",
                    uStatus = 0,
                    uRealName = "小小",
                    uRemark = "Test01",
                    uCreateTime = DateTime.Now
                };
                DapperHelper helper = new DapperHelper();
                int i = helper.UserInsert(user);
                if (i > 0)
                {
                    Console.WriteLine("插入成功");
                }
                Console.ReadLine();
                #endregion

    上面两张图中已经显示我们数据插入成功,接着我们来看看插入多条数据。

    5.2批量插入

    先看DapperHelper中代码:
     /// <summary>
            /// 批量插入数据
            /// </summary>
            /// <param name="ulist"></param>
            /// <returns></returns>
            public int MultInsertUser(List<UserInfo> ulist)
            {
                using (var db = new SqlConnection(sqlConnstr))
                {
                    string query = "INSERT INTO USERINFO VALUES(@uLoginName, @uLoginPWD, @uRealName, @uStatus, @uRemark, @uCreateTime)";
                    return db.Execute(query,ulist);
                }
            }

    接着我们来看看调用的代码

     #region 2.0批量插入
                List<UserInfo> ulist = new List<UserInfo> {
                    new UserInfo(){uLoginName = "xiaohu", uLoginPWD = "555",uStatus = 0 ,uRealName = "小虎", uRemark = "Test01",uCreateTime = DateTime.Now},
                    new UserInfo(){uLoginName = "yangyang", uLoginPWD = "888",uStatus = 0 ,uRealName = "杨杨", uRemark = "Test01",uCreateTime = DateTime.Now},
                };
                DapperHelper helper = new DapperHelper();
                int i = helper.MultInsertUser(ulist);
                if (i > 0)
                {
                    Console.WriteLine("批量数据插入成功");
                }
                Console.ReadLine();
                #endregion

    接着我们来看看执行结果和数据库中的结果:

    5.3接着我们来看看删除一条数据

    先看DapperHelper中代码:
      /// <summary>
            /// 删除
            /// </summary>
            /// <param name="Uid"></param>
            /// <returns></returns>
            public int UserDelete(int Uid)
            {
                using (var db=new SqlConnection(sqlConnstr))
                {
                    string query = "DELETE  USERINFO WHERE uID=@Uid";
                    var param = new DynamicParameters();
                    param.Add("Uid", Uid);
                    return db.Execute(query,param);
    
                }
            }

    接着看看调用代码:

        #region 3.0删除数据
                DapperHelper helper = new DapperHelper();
                int uid = 7;
                int i = helper.UserDelete(uid);
                if (i > 0)
                {
                    Console.WriteLine("删除成功");
                }
                Console.ReadLine();
                #endregion

    执行结果和数据库中数据如下:

    我们可以从数据库中看到uID=7的数据已经被删除。

    5.4接着我们来看看批量删除操作:

    先看DapperHelper中代码:
      public int MultDeleteUser(List<UserInfo> ulist)
            {
                using (var db=new SqlConnection(sqlConnstr))
                {
                    string query = "DELETE  USERINFO WHERE uID=@Uid";
                    return db.Execute(query, ulist);
                }
            }

    接着看看调用代码:

     List<UserInfo> ulist = new List<UserInfo> {
                    new UserInfo(){uID=8},
                    new UserInfo(){uID=9},
                };
                DapperHelper helper = new DapperHelper();
                int i = helper.MultDeleteUser(ulist);
                if (i > 0)
                {
                    Console.WriteLine("批量删除成功");
                }
                Console.ReadLine();

    我们可以从数据库截图中看到uID=8和uID=9的数据已经被删除。

    5.5接下来我们来看看修改的操作。

    先看DapperHelper代码

     public int UserUpdate(UserInfo user)
            {
                //uID, uLoginName, uLoginPWD, uRealName, uStatus, uRemark, uCreateTime
                using (var db=new SqlConnection(sqlConnstr))
                {
                    string query= "UPDATE USERINFO SET uLoginName=@uLoginName,uLoginPWD=@uLoginPWD,uRealName=@uRealName,uStatus=@uStatus,uRemark=@uRemark,uCreateTime=@uCreateTime WHERE uID=@uID";return db.Execute(query, user);
                }
            }

    接下来看看调用代码:

    UserInfo user = new UserInfo
    {
    uID = 2,
    uLoginName = "xiaomogu",
    uLoginPWD = "555555",
    uStatus = 0,
    uRealName = "蘑菇",
    uRemark = "测试",
    uCreateTime = DateTime.Now
    };
    DapperHelper helper = new DapperHelper();
    int i = helper.UserUpdate(user);
    if (i > 0)
    {
    Console.WriteLine("修改成功");
    }
    Console.ReadLine();

    从数据库图中我们已经可以看到我们已经将uID=2的数据修改成功。

    5.6接下来我们来看看查询所有数据操作。

    先看DapperHelper代码

     public List<UserInfo> GetAll()
            {
                using (var db = new SqlConnection(sqlConnstr))
                {
                    string query = "SELECT * FROM USERINFO";
                    return db.Query<UserInfo>(query).ToList();
    
                }
            }

    接着我们来看看调用的代码和执行结果:

     DapperHelper helper = new DapperHelper();
                var list = helper.GetAll();
                foreach (var item in list)
                {
                    Console.WriteLine("用户名:{0},密码:{1}", item.uLoginName, item.uLoginPWD);
                }
                Console.ReadLine();

    5.7最后我们来看看查询多条指定数据的操作:

    先看看DapperHelper代码:

      /// <summary>
            /// 查询多条指定的数据
            /// </summary>
            /// <param name="uids">查询条件</param>
            /// <returns></returns>
            public List<UserInfo> GetAllIn(int[] uids)
            {
                using (var db=new SqlConnection(sqlConnstr))
                {
                    string query = "SELECT * FROM USERINFO WHERE uID IN @uids";
                    return db.Query<UserInfo>(query, new { uids= uids }).ToList();
                }
            }

    接着我们来看看调用代码和执行结果。

     int[] ids = new int[] { 10, 11 };
                DapperHelper helper = new DapperHelper();
                var list = helper.GetAllIn(ids);
                foreach (var item in list)
                {
                    Console.WriteLine("用户名:{0},密码:{1}", item.uLoginName, item.uLoginPWD);
                }
                Console.ReadLine();

    四、源码

    源码我已经放到了Github上面了,大家有兴趣可以去看看,地址是:https://github.com/xiaoerhao/DapperTest

    五、感受

    终于写完了,这是我第一次认真去写一篇博客,终于跨出了这一小步,大概花了四个多小时,不过我觉得挺值得的。主要也是为了记录一些自己的所学所收获的东西分享给大家,和大家更好的交流,相互进步,由于自己的能力和水平有限,所以有些地方理解的不够透彻,写出来的东西或许达不到大家的期许,希望大家能够理解和鼓励,不过我的初衷就是希望一些刚上手Dapper的新手更好的入门和把自己所学的东西归纳总结,如果能够帮到大家最好。

  • 相关阅读:
    邮件发送携带附件
    两个文件内容同行合并操作
    re模块,判断某行/某字符是否存在
    企业微信公众号告警Python脚本
    CodeForces 371D. Vessels 题解
    免安装 mysql
    kibana dev tools 操作 Elasticsearch
    win10 强制关掉被占用的端口
    值传递与引用传递
    微服务网关 soul
  • 原文地址:https://www.cnblogs.com/Erhao/p/10042808.html
Copyright © 2020-2023  润新知