ORM之轻量级框架--Dapper

摘要:
Dapper是一个轻量级的Orm框架。它是半自动的。它不同于EntityFramework和NHibernate。它只有一个文件,没有非常复杂的配置。如果您喜欢本机Sql语句和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。

ORM之轻量级框架--Dapper第1张

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包,然后点击安装就可以了。

ORM之轻量级框架--Dapper第6张

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
复制代码

ORM之轻量级框架--Dapper第11张

ORM之轻量级框架--Dapper第12张

上面两张图中已经显示我们数据插入成功,接着我们来看看插入多条数据。

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
复制代码

接着我们来看看执行结果和数据库中的结果:

ORM之轻量级框架--Dapper第17张

ORM之轻量级框架--Dapper第18张

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 = 7;
            int i = helper.UserDelete(uid);
            if (i > 0)
            {
                Console.WriteLine("删除成功");
            }
            Console.ReadLine();
            #endregion
复制代码

执行结果和数据库中数据如下:

ORM之轻量级框架--Dapper第23张

ORM之轻量级框架--Dapper第24张

我们可以从数据库中看到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=8},
                new UserInfo(){uID=9},
            };
            DapperHelper helper = new DapperHelper();
            int i = helper.MultDeleteUser(ulist);
            if (i > 0)
            {
                Console.WriteLine("批量删除成功");
            }
            Console.ReadLine();
复制代码

ORM之轻量级框架--Dapper第29张

ORM之轻量级框架--Dapper第30张

我们可以从数据库截图中看到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();

复制代码

ORM之轻量级框架--Dapper第35张

ORM之轻量级框架--Dapper第36张

从数据库图中我们已经可以看到我们已经将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();
复制代码

ORM之轻量级框架--Dapper第41张

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();
复制代码

ORM之轻量级框架--Dapper第46张

四、源码

源码我已经放到了Github上面了,大家有兴趣可以去看看,地址是:https://github.com/xiaoerhao/DapperTest

五、感受

终于写完了,这是我第一次认真去写一篇博客,终于跨出了这一小步,大概花了四个多小时,不过我觉得挺值得的。主要也是为了记录一些自己的所学所收获的东西分享给大家,和大家更好的交流,相互进步,由于自己的能力和水平有限,所以有些地方理解的不够透彻,写出来的东西或许达不到大家的期许,希望大家能够理解和鼓励,不过我的初衷就是希望一些刚上手Dapper的新手更好的入门和把自己所学的东西归纳总结,如果能够帮到大家最好。

免责声明:文章转载自《ORM之轻量级框架--Dapper》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇数据库之ODPS中sql语句指南推荐几款优秀的开源博客系统下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Springboot 在项目启动时将数据缓存到全局变量

有写字典数据不会频繁更新,但是会频繁查询,想要减少数据库链接次数,把内容缓存到项目的全局变量中,提高方法查询速度 import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import java.util.HashMap; import java.util.Li...

轻量级ORMPetaPoco及改进

      PetaPoco描述       PetaPoco是一个微小的,快速的,单个文件的微型ORM,可以运行在.NET和Mono平台上。相对于NHibernate与Entity Framework,PetaPoco有以下几点非常吸引我:           1. 轻量级,高性能;           2. 可同时运行在.net与mono平台上;  ...

winform使用Barcodex控件预览和打印一维码

1、控件下载。   http://files.cnblogs.com/files/masonblog/barcodex.zip 。   包含barcodex.ocx控件、barcodex帮助文档、两个winform控件的dll文件。 2、控件的注册。 (1)检测控件是否注册(方法不唯一)。   本例使用的是判断注册表中 HKEY_CLASSES_ROOTT...

@ConfigurationProperties 配置详解

文章转自 https://blog.csdn.net/qq_26000415/article/details/78942494 前言新的一年到了,在这里先祝大家新年快乐.我们在上一篇spring boot 源码解析12-servlet容器的建立 中 分析 ServerProperties时,发现其类上有@ConfigurationProperties 注解...

ArcGIS API For Android离线地图的实现

今天搞了一个ArcGIS API For Android离线地图的实现。效果如下:Android的版本是2.1main.xml,这里要说明的,初始化范围一定要有,不然会不能显示的。 <?xml version="1.0" encoding="utf-8"?> <com.esri.android.map.MapView xmln...

cJSON 使用详解

由于c语言中,没有直接的字典,字符串数组等数据结构,所以要借助结构体定义,处理json。如果有对应的数据结构就方便一些, 如python中用json.loads(json)就把json字符串转变为内建的数据结构处理起来比较方便。     cjson库文件下载:     sourceforge地址     一个重要概念:         在cjson中,js...