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的架构,你才能 ...
随机推荐
- 深入理解SpringBoot之自动装配
SpringBoot的自动装配是拆箱即用的基础,也是微服务化的前提.其实它并不那么神秘,我在这之前已经写过最基本的实现了,大家可以参考这篇文章.这次主要的议题是,来看看它是怎么样实现的,我们透过源代码 ...
- 易用性测试、本地化测试、部署测试、无障碍测试、回归测试、冒烟测试、A/B测试
1.易用性定义: 易用性测试是指测试用户使用软件时是否感觉方便,是否能保证用户使用的测试类型2.本地化测试: ·定义:针对软件的本地化版本实施的针对性测试 ·测试内容: (1)语言,书写习惯 (2)时 ...
- 浅谈通信网络(三)——TCP/IP协议
简介 Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议.In ...
- jmeter接口测试报java.net.SocketException: Socket closed错误。
如题,jmeter报出java.net.SocketException: Socket closed,我查询了下,服务器是正常的,可以返回数据,基本确定问题出在我这边jmeter.查询原因,看到有人说 ...
- python+selenium实现登录账户
selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并行处理(Selenium Gr ...
- Java NIO Channel通道
原文链接:http://tutorials.jenkov.com/java-nio/channels.html Java NIO Channel通道和流非常相似,主要有以下几点区别: 通道可以读也可以 ...
- Spark2.1.0——Spark初体验
学习一个工具的最好途径,就是使用它.这就好比<极品飞车>玩得好的同学,未必真的会开车,要学习车的驾驶技能,就必须用手触摸方向盘.用脚感受刹车与油门的力道.在IT领域,在深入了解一个系统的原 ...
- anguments
anguments是一个对象,长得很像数组的对象,但不是数组,而是伪数组. arguments的内容是函数运行时的实参列表 (function(d, e, f) { console.log(argum ...
- 安装vmtools之后任然不能在虚拟机和主机之间复制粘贴的问题
安装vmtools之后任然不能在虚拟机和主机之间复制粘贴的问题 都是因为这个进程没有启动起来,你只需要在启动后在终端输入 "/usr/bin /vmware-user" 就可以手动 ...
- maven国内镜像(国内oschina的maven服务器关了)
Maven是官方的库在国外,连下载速度很慢.国内oschina的maven服务器很早之前就关了.今天发现阿里云的一个中央仓库,亲测可用. 找到E:\maven\apache-maven-3.5.2\c ...