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的架构,你才能 ...
随机推荐
- vim快捷键汇总
命令历史 以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令. 启动vim 在命令行窗口中输入以下命令即可 vim 直接启动vim vim filename 打开vim ...
- JS——函数
一.函数的种类 1.无参函数 function showName() { alert("我是无参函数"); } 2.有参函数 在函数中的参数为"形式参数" 形式 ...
- 微信小程序的初窥实践
最近,小程序正式上线,各企业都纷纷开发,本博主看下其中奥秘, 首先得去微信公众平台(https://mp.weixin.qq.com/)注册一个小程序账号(以前注册过公众号的账号不可使用) 备注:注册 ...
- cross-env 兼容跨平台运行脚本
https://www.npmjs.com/package/cross-env 跨平台运行脚本 The problem Most Windows command prompts will choke ...
- mac下nginx安装
一.安装 Nginx 终端执行: brew search nginx brew install nginx 当前版本 1.10.2,通过brew可以把nginx需要的pcre,openssl,zlib ...
- java的Calendar,获取月份少一月的问题及其它注意事项
java的Calendar,获取月份少一月的问题及其它注意事项: import java.util.*; public class DateClass{ public static void main ...
- SSM-MyBatis-11:Mybatis中查询全部用resultmap
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 实体类很普通,四个字段,编号,名字,作者名,价格 在接口中的方法声明如下 //查全部 public List& ...
- U型理论
- Spring Boot整合Quartz实现定时任务表配置
最近有个小项目要做,spring mvc下的task设置一直不太灵活,因此在Spring Boot上想做到灵活的管理定时任务.需求就是,当项目启动的时候,如果有定时任务则加载进来,生成schedule ...
- XML解析的四种方法 建议使用demo4j解析 测试可以用
https://www.cnblogs.com/longqingyang/p/5577937.html 4.DOM4J解析 特征: 1.JDOM的一种智能分支,它合并了许多超出基本XML文档表示的功 ...