欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ORM之轻量级框架--Dapper

程序员文章站 2022-12-16 10:19:57
一、什么是Dapper? Dapper是一款轻量级Orm框架,它是属于半自动的,它和Entity Framework和NHibernate不同,它只有一个单文件,没有很复杂的配置,如果你喜欢原生Sql语句,而且又是喜欢Orm框架,那么Dapper对于你来说是再适合不过了。 二、Dapper优点我也是 ......

一、什么是dapper?

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

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

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

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

三、例子演示

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

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

ORM之轻量级框架--Dapper

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包,然后点击安装就可以了。

ORM之轻量级框架--Dapper

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

ORM之轻量级框架--Dapper

ORM之轻量级框架--Dapper

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

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

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

ORM之轻量级框架--Dapper

ORM之轻量级框架--Dapper

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

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

ORM之轻量级框架--Dapper

ORM之轻量级框架--Dapper

我们可以从数据库中看到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();

ORM之轻量级框架--Dapper

ORM之轻量级框架--Dapper

我们可以从数据库截图中看到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();

ORM之轻量级框架--Dapper

ORM之轻量级框架--Dapper

从数据库图中我们已经可以看到我们已经将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();

ORM之轻量级框架--Dapper

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();

ORM之轻量级框架--Dapper

四、源码

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

五、感受

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