一、什么是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的更多相关文章

  1. .NET轻量级ORM框架Dapper入门精通

    一.课程介绍 本次分享课程包含两个部分<.NET轻量级ORM框架Dapper修炼手册>和<.NET轻量级ORM框架Dapper葵花宝典>,阿笨将带领大家一起领略轻量级ORM框架 ...

  2. FluentData,一个轻量级开源的.NET ORM数据持久化框架

    FluentData:一种使用Fluent API的新型轻量级ORM模型  FluentData 是微型 ORM(micro-ORM)家族的一名新成员,旨在比大型 ORM(full ORM)更加易用. ...

  3. c# 国内外ORM 框架 dapper efcore sqlsugar freesql hisql sqlserver数据常规插入测试性能对比

    c# 国内外ORM 框架 dapper efcore sqlsugar freesql hisql sqlserver数据常规插入测试性能对比对比 在6.22 号发布了 c# sqlsugar,his ...

  4. FluentData,它是一个轻量级框架,关注性能和易用性。

    http://www.cnblogs.com/zengxiangzhan/p/3250105.html FluentData,它是一个轻量级框架,关注性能和易用性. 下载地址:FlunenData.M ...

  5. Net系列框架-Dapper+简单三层架构

    Net系列框架-Dapper+简单三层架构 工作将近6年多了,工作中也陆陆续续学习和搭建了不少的框架,后续将按由浅入深的方式,整理出一些框架源码,所有框架源码本人都亲自调试通过,如果有问题,欢迎联系我 ...

  6. Net系列框架-Dapper+AutoFac 基于接口

    Net系列框架-Dapper+AutoFac 基于接口 工作将近6年多了,工作中也陆陆续续学习和搭建了不少的框架,后续将按由浅入深的方式,整理出一些框架源码,所有框架源码本人都亲自调试通过,如果有问题 ...

  7. 初步了解学习flask轻量级框架,

    关于flask我有话说 flask作为一个轻量级框架,它里面有好多扩展包需要下载,比较麻烦,而且有的时候flask需要在虚拟环境下运行,但是他的优点还是有滴 ,只要是用过Django的人,都会觉得fl ...

  8. DDD实战进阶第一波(四):开发一般业务的大健康行业直销系统(搭建支持DDD的轻量级框架三)

    上一篇文章我们讲了经典DDD架构对比传统三层架构的优势,以及经典DDD架构每一层的职责后,本篇文章将介绍基础结构层中支持DDD的轻量级框架的主要代码. 这里需要说明的是,DDD轻量级框架能够体现DDD ...

  9. DDD实战进阶第一波(三):开发一般业务的大健康行业直销系统(搭建支持DDD的轻量级框架二)

    了解了DDD的好处与基本的核心组件后,我们先不急着进入支持DDD思想的轻量级框架开发,也不急于直销系统需求分析和具体代码实现,我们还少一块, 那就是经典DDD的架构,只有了解了经典DDD的架构,你才能 ...

随机推荐

  1. Linux Ubuntu 16.04 初次安装使用总结zzz

    装了两天的ubuntu系统终于算是勉强能用了,来来回回装了有三四次,期间出了各种各样的毛病.但是还是被我的Google大法给治好了.为了装这个系统,算是耗了两天的时间,啥事情都没干,干耗在这上面了.所 ...

  2. div布局之面向对象

    栗子之导航条(navbar) http://www.runoob.com/try/try2.php?filename=bootstrap-using-glyphicons-navbar <!DO ...

  3. SSM-SpringMVC-30:SpringMVC中InitBinder的骇客级优化

     ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 上篇博客利用initbinder做了局部的日期类型转换,但是兼容性不要,只支持yyyy-MM-dd这种,所以 ...

  4. Zookeeper vs etcd vs Consul

    Zookeeper vs etcd vs Consul [编者的话]本文对比了Zookeeper.etcd和Consul三种服务发现工具,探讨了最佳的服务发现解决方案,仅供参考. 如果使用预定义的端口 ...

  5. Spring Boot ConfigurationProperties validate

    使用@Query可以在自定义的查询方法上使用@Query来指定该方法要执行的查询语句,比如:@Query("select o from UserModel o where o.uuid=?1 ...

  6. 背景图片蒙上一层颜色(背景图片无法用rgba调整透明度!)

    方法就是在图片上面加一层DIV,将DIV的背景颜色调成rgba(0,0,0,0.3);即可

  7. nodejs模块xml2js解析xml的坑

    在一个项目中,用到nodejs模块xml2js解析xml,xml的数据如下: <xml> <MsgId>6197906553041859764</MsgId> &l ...

  8. Android 5.x Theme 与 ToolBar 实战

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/45303349: 本文出自:[张鸿洋的博客] 1.概述 随着Material D ...

  9. 解决error while loading shared libraries的通用方案

    1. 首先 find / -name libevent-1.4.so.2 找到缺少的链接文件到底在那儿. 2. LD_DEBUG=libs LD_DEBUG=libs /usr/local/bin/f ...

  10. anguments

    anguments是一个对象,长得很像数组的对象,但不是数组,而是伪数组. arguments的内容是函数运行时的实参列表 (function(d, e, f) { console.log(argum ...