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]() NULL,
[uLoginPWD] [nvarchar]() NULL,
[uRealName] [nvarchar]() 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 = "",
uStatus = ,
uRealName = "小小",
uRemark = "Test01",
uCreateTime = DateTime.Now
};
DapperHelper helper = new DapperHelper();
int i = helper.UserInsert(user);
if (i > )
{
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 = "",uStatus = ,uRealName = "小虎", uRemark = "Test01",uCreateTime = DateTime.Now},
new UserInfo(){uLoginName = "yangyang", uLoginPWD = "",uStatus = ,uRealName = "杨杨", uRemark = "Test01",uCreateTime = DateTime.Now},
};
DapperHelper helper = new DapperHelper();
int i = helper.MultInsertUser(ulist);
if (i > )
{
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 = ;
int i = helper.UserDelete(uid);
if (i > )
{
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=},
new UserInfo(){uID=},
};
DapperHelper helper = new DapperHelper();
int i = helper.MultDeleteUser(ulist);
if (i > )
{
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[] { , };
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的新手更好的入门和把自己所学的东西归纳总结,如果能够帮到大家最好。
ORM之轻量级框架--Dapper的更多相关文章
- .NET轻量级ORM框架Dapper入门精通
一.课程介绍 本次分享课程包含两个部分<.NET轻量级ORM框架Dapper修炼手册>和<.NET轻量级ORM框架Dapper葵花宝典>,阿笨将带领大家一起领略轻量级ORM框架 ...
- FluentData,一个轻量级开源的.NET ORM数据持久化框架
FluentData:一种使用Fluent API的新型轻量级ORM模型 FluentData 是微型 ORM(micro-ORM)家族的一名新成员,旨在比大型 ORM(full ORM)更加易用. ...
- c# 国内外ORM 框架 dapper efcore sqlsugar freesql hisql sqlserver数据常规插入测试性能对比
c# 国内外ORM 框架 dapper efcore sqlsugar freesql hisql sqlserver数据常规插入测试性能对比对比 在6.22 号发布了 c# sqlsugar,his ...
- FluentData,它是一个轻量级框架,关注性能和易用性。
http://www.cnblogs.com/zengxiangzhan/p/3250105.html FluentData,它是一个轻量级框架,关注性能和易用性. 下载地址:FlunenData.M ...
- Net系列框架-Dapper+简单三层架构
Net系列框架-Dapper+简单三层架构 工作将近6年多了,工作中也陆陆续续学习和搭建了不少的框架,后续将按由浅入深的方式,整理出一些框架源码,所有框架源码本人都亲自调试通过,如果有问题,欢迎联系我 ...
- Net系列框架-Dapper+AutoFac 基于接口
Net系列框架-Dapper+AutoFac 基于接口 工作将近6年多了,工作中也陆陆续续学习和搭建了不少的框架,后续将按由浅入深的方式,整理出一些框架源码,所有框架源码本人都亲自调试通过,如果有问题 ...
- 初步了解学习flask轻量级框架,
关于flask我有话说 flask作为一个轻量级框架,它里面有好多扩展包需要下载,比较麻烦,而且有的时候flask需要在虚拟环境下运行,但是他的优点还是有滴 ,只要是用过Django的人,都会觉得fl ...
- DDD实战进阶第一波(四):开发一般业务的大健康行业直销系统(搭建支持DDD的轻量级框架三)
上一篇文章我们讲了经典DDD架构对比传统三层架构的优势,以及经典DDD架构每一层的职责后,本篇文章将介绍基础结构层中支持DDD的轻量级框架的主要代码. 这里需要说明的是,DDD轻量级框架能够体现DDD ...
- DDD实战进阶第一波(三):开发一般业务的大健康行业直销系统(搭建支持DDD的轻量级框架二)
了解了DDD的好处与基本的核心组件后,我们先不急着进入支持DDD思想的轻量级框架开发,也不急于直销系统需求分析和具体代码实现,我们还少一块, 那就是经典DDD的架构,只有了解了经典DDD的架构,你才能 ...
随机推荐
- UML语言中五大视图和九种图形纵览
UML语言纵览 视图 UML语言中的视图大致分为如下5种: 1.用例视图.用例视图强调从系统的外部参与者(主要是用户)的角度看到的或需要的系统功能. 2.逻辑视图.逻辑视图从系统的静态结构和动态行为角 ...
- SEO概念及SEO相关优化
SEO是英文Search Engine Optimization的缩写, 中文意译为“搜索引擎优化”. 简单地说, SEO是指从自然搜索结果获得网站流量的技术和过程. http://www.imooc ...
- zookeeper应用场景-java
声明,本文是复制别人的文章,感觉还行,原文:http://www.cnblogs.com/xymqx/p/4465610.html 本人热爱技术,跪求有好的技术文章希望大家多多分享,谢谢.... Zo ...
- RedHat 7.0及CentOS 7.0禁止Ping的三种方法
作者:荒原之梦 原文链接:http://zhaokaifeng.com/?p=538 前言: "Ping"属于ICMP协议(即"Internet控制报文协议") ...
- js算法初窥02(排序算法02-归并、快速以及堆排序)
上一篇,我们讲述了一些简单的排序算法,其实说到底,在前端的职业生涯中,不涉及node.不涉及后台的情况下,我目前还真的没想到有哪些地方可以用到这些数据结构和算法,但是我在前面的文章也说过了.或许你用不 ...
- Java VisualVM无法检测到本地java程序 的 解决办法
win10系统下启动jvisualvm应用,报"VisualVM无法检测到本地java程序"的错误!在网上查了一些方法, 大概原因有2种: 1.操作系统的临时文件目录所在的磁盘格式 ...
- Python反序列化 pickle
# 若需要处理更复杂的数据, 用pickle. pickle只有在Python里能用, 其它语言不行. # 序列化. import pickle def sayhi(name): print('hel ...
- selenium 定位元素成功, 但是输入失败 (textarea)
问题描述 UI页面功能测试中, 定位元素并输入(通过sendKey()方法输入), 显示输入失败. 根本原因 为了修复一个bug, 这个元素从input改成了textarea, 而textarea是有 ...
- Django中模板过滤器总结
一.形式:小写: {{ name | lower }} 二.串联:先转义文本到HTML,再转换每行到 <p> 标签: {{ my_text|escape|linebreaks } 三.过滤 ...
- ios swift版 sqlite3详解
iOS中的SQLite3的封装与详细应用 SQLite是一个开源的嵌入式关系数据库,特点是易使用.高效.安全可靠.可移植性强. iOS中的本地持久化存储 NSUserDefault:一般用于存储小规模 ...