当前位置: 移动技术网 > IT编程>开发语言>.net > ORM之轻量级框架--Dapper

ORM之轻量级框架--Dapper

2018年12月01日  | 移动技术网IT编程  | 我要评论

一、什么是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的新手更好的入门和把自己所学的东西归纳总结,如果能够帮到大家最好。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网