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的新手更好的入门和把自己所学的东西归纳总结,如果能够帮到大家最好。
推荐阅读
-
golang常用库之操作数据库的orm框架-gorm基本使用详解
-
Python ORM框架SQLAlchemy学习笔记之数据查询实例
-
Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍
-
Python ORM框架SQLAlchemy学习笔记之关系映射实例
-
用 Composer构建自己的 PHP 框架之使用 ORM_php实例
-
Python ORM框架SQLAlchemy学习笔记之数据查询实例
-
Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
-
Python ORM框架SQLAlchemy学习笔记之关系映射实例
-
Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例
-
Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍