ORM之轻量级框架--Dapper

转自:https://www.cnblogs.com/Erhao/p/10042808.html

一、什么是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 [email protected]";
                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 [email protected]";
                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 [email protected],[email protected],[email protected],[email protected],[email protected],[email protected] WHERE [email protected]";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的新手更好的入门和把自己所学的东西归纳总结,如果能够帮到大家最好。

原文地址:https://www.cnblogs.com/zhoufangcheng04050227/p/10237956.html

时间: 2024-07-30 14:58:40

ORM之轻量级框架--Dapper的相关文章

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

一.课程介绍 本次分享课程包含两个部分<.NET轻量级ORM框架Dapper修炼手册>和<.NET轻量级ORM框架Dapper葵花宝典>,阿笨将带领大家一起领略轻量级ORM框架Dapper的魅力. 本次分享课程适合人群范围: 一.<.NET轻量级ORM框架Dapper修炼手册>适合人群如下: 1.我是一个新手,主要工作面向的是MS SQL Server数据库,那么选择修炼手册一定没错. 2.对Dapper从没有过了解或者了解不全面的同学,想通过学习进一步提升对Dappe

.net的轻量级ORM -- PetaPoco/NPOCO框架使用说明

.net的轻量级ORM -- PetaPoco/NPOCO框架使用说明(具体参看:http://www.toptensoftware.com/petapoco/) 从11年就开始尝试使用轻量级ORM:PetaPoco,下文是基本使用方法.另外NPoco是PetaPoco的升级版,是另外一个人维护,原版PetaPoco基本不再维护.NPoco大多数用法和PetaPoco一致,另外有些额外的功能.NPoco我会考虑再写一篇文章介绍. 运行查询 首先定义POCO 注:POCO意思是Plain Old

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

http://www.cnblogs.com/zengxiangzhan/p/3250105.html FluentData,它是一个轻量级框架,关注性能和易用性. 下载地址:FlunenData.Model 利用T4模板,[MultipleOutputHelper.ttinclude]批量生成多文件 基本语法: 1. 初始化:获取MultipleOutputHelper.ttinclude文件模板 在T4模板导入 //导入MultipleOutputHelper.ttinclude文件 路径

java可选轻量级框架

如果怕spring struts hibernate/ibatis太庞大,则可选用下面的一些轻量级框架 jfinal http://www.jfinal.com/ 简介: JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restful. 在拥有Java语言所有优势的同时再拥有ruby .python.php等动态语言的开发效率 JFinal有如下主要特点: 1.MVC架构,设计精巧,使用简单 2.遵循C

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

Net系列框架-Dapper+简单三层架构 工作将近6年多了,工作中也陆陆续续学习和搭建了不少的框架,后续将按由浅入深的方式,整理出一些框架源码,所有框架源码本人都亲自调试通过,如果有问题,欢迎联系我,供大家一起互相学习和探讨,如果你有什么好的意见或建议,欢迎下面留言. 本套框架主要采用asp.net mvc+dapper+简单三层搭建的后端框架 主要技术点: 1.asp.net webapi 基于net技术的webapi 2.dapper 轻量高性能orm框架 3.三层架构,简单实用的DAL,

Mysql limit 优化,百万至千万级快速分页,--复合索引的引用并应用于轻量级框架

MySql 性能到底能有多高?用了php半年多,真正如此深入的去思考这个问题还是从前天开始.有过痛苦有过绝望,到现在充满信心!MySql 这个数据库绝对是适合dba级的高手去玩的,一般做一点1万篇新闻的小型系统怎么写都可以,用xx框架可以实现快速开发.可是数据量到了10万,百万至千 万,他的性能还能那么高吗?一点小小的失误,可能造成整个系统的改写,甚至更本系统无法正常运行!好了,不那么多废话了.用事实说话,看例子: 数据表 collect ( id, title ,info ,vtype) 就这

IOS MJExtension json转模型的轻量级框架的使用(转载)

原文地址 http://www.bubuko.com/infodetail-559696.html 下载地址:https://github.com/makeLaugh/MJExtension 这边主要的一个示例是将一个从web上面取到的json字符窜转化成model的一个流程,开始集成吧. 1)下载解压 2)添加到新的项目中 3)导入头文件后,开始使用这个文件,这边是从web上面取得的一个数据,直接映射成一个model对象 这里只是其中的一个使用方法,更多的方法可以查看其下载文件中的main方便

发现 一个业务管理系统 解决了 orm 和 前端框架 剩下的 是 业务逻辑 了 。 哈

解决了 orm 和 前端框架 剩下的 是 业务逻辑 了 . 哈 还有 各种 aop 组件 呢 . 大家 high 来 准备 用 fluent data  和 mysql 写一个 wcf 的 接口呢. wcf 比 webservice 后出来吧 然后 在 用 web api 写一个 接口呢..

IOS开发中 MJExtension json转模型的轻量级框架的使用

这边主要的一个示例是将一个从web上面取到的json字符窜转化成model的一个流程,开始集成吧. 1)下载解压 2)添加到新的项目中 3)导入头文件后,开始使用这个文件,这边是从web上面取得的一个数据,直接映射成一个model对象 这里只是其中的一个使用方法,更多的方法可以查看其下载文件中的main方便中的更加详细的调用 . ////  main.m//  字典与模型的互转////  Created by MJ Lee on 14-5-21.//  Copyright (c) 2014年 i