Dapper.NET——轻量ORM

 

Dapper.NET使用

Dapper是一款轻量级ORM工具(Github)。如果你在小的项目中,使用Entity Framework、NHibernate 来处理大数据访问及关系映射,未免有点杀鸡用牛刀。你又觉得ORM省时省力,这时Dapper 将是你不二的选择。

1、为什么选择Dapper

  1. 轻量。只有一个文件(SqlMapper.cs),编译完成之后只有120k(好象是变胖了)
  2. 速度快。Dapper的速度接近与IDataReader,取列表的数据超过了DataTable。
  3. 支持多种数据库。Dapper可以在所有Ado.net Providers下工作,包括sqlite, sqlce, firebird, oracle, MySQL, PostgreSQL and SQL Server
  4. 可以映射一对一,一对多,多对多等多种关系。
  5. 性能高。通过Emit反射IDataReader的序列队列,来快速的得到和产生对象,性能不错。
  6. 支持FrameWork2.0,3.0,3.5,4.0,4.5

2、以Dapper(4.0)为例。

2.1 在数据库中建立几张表。

  1. CREATE TABLE [dbo].[CICUser]
  2. (
  3. [UserId] [int] IDENTITY(1, 1) PRIMARY KEY NOT NULL,
  4. [Username] [nvarchar](256) NOT NULL,
  5. [PasswordHash] [nvarchar](500) NULL,
  6. [Email] [nvarchar](256) NULL,
  7. [PhoneNumber] [nvarchar](30) NULL,
  8. [IsFirstTimeLogin] [bit] DEFAULT(1) NOT NULL,
  9. [AccessFailedCount] [int] DEFAULT(0) NOT NULL,
  10. [CreationDate] [datetime] DEFAULT(GETDATE()) NOT NULL,
  11. [IsActive] [bit] DEFAULT(1) NOT NULL
  12. )
  13.  
  14. CREATE TABLE [dbo].[CICRole]
  15. (
  16. [RoleId] [int] IDENTITY(1, 1) PRIMARY KEY NOT NULL,
  17. [RoleName] [nvarchar](256) NOT NULL,
  18. )
  19.  
  20. CREATE TABLE [dbo].[CICUserRole]
  21. (
  22. [Id] [int] IDENTITY(1, 1) PRIMARY KEY NOT NULL,
  23. [UserId] [int] FOREIGN KEY REFERENCES [dbo].[CICUser] ([UserId]) NOT NULL,
  24. [RoleId] [int] FOREIGN KEY REFERENCES [dbo].[CICRole] ([RoleId]) NOT NULL
  25. )

2.2实体类。

在创建实体类时,属性名称一定要与数据库字段一一对应。

  1. public class User
  2. {
  3. public User()
  4. {
  5. Role = new List<Role>();
  6. }
  7. public int UserId { get; set; }
  8. public string UserName { get; set; }
  9. public string Password { get; set; }
  10. public string Email { get; set; }
  11. public string PhoneNumber { get; set; }
  12. public bool IsFirstTimeLogin { get; set; }
  13. public int AccessFailedCount { get; set; }
  14. public DateTime CreationDate { get; set; }
  15. public bool IsActive { get; set; }
  16. public List<Role> Role { get; set; }
  17. }
  18. public class Role
  19. {
  20. public int RoleId { get; set; }
  21. public string RoleName { get; set; }
  22. }
  23. public class Customer
  24. {
  25. public int UserId { get; set; }
  26. public string UserName { get; set; }
  27. public string Password { get; set; }
  28. public string Email { get; set; }
  29. public string PhoneNumber { get; set; }
  30. public bool IsFirstTimeLogin { get; set; }
  31. public int AccessFailedCount { get; set; }
  32. public DateTime CreationDate { get; set; }
  33. public bool IsActive { get; set; }
  34. public Role Role { get; set; }
  35. }

3.使用方法

3.1  一对一映射

  1. private static void OneToOne(string sqlConnectionString)
  2. {
  3. List<Customer> userList = new List<Customer>();
  4. using (IDbConnection conn = GetSqlConnection(sqlConnectionString))
  5. {
  6. string sqlCommandText = @"SELECT c.UserId,c.Username AS UserName,
  7. c.PasswordHash AS [Password],c.Email,c.PhoneNumber,c.IsFirstTimeLogin,c.AccessFailedCount,
  8. c.CreationDate,c.IsActive,r.RoleId,r.RoleName
  9. FROM dbo.CICUser c WITH(NOLOCK)
  10. INNER JOIN CICUserRole cr ON cr.UserId = c.UserId
  11. INNER JOIN CICRole r ON r.RoleId = cr.RoleId";
  12. userList = conn.Query<Customer, Role, Customer>(sqlCommandText,
  13. (user, role) => { user.Role = role; return user; },
  14. null,
  15. null,
  16. true,
  17. "RoleId",
  18. null,
  19. null).ToList();
  20. }
  21.  
  22. if (userList.Count > 0)
  23. {
  24. userList.ForEach((item) => Console.WriteLine("UserName:" + item.UserName +
  25. "----Password:" + item.Password +
  26. "-----Role:" + item.Role.RoleName +
  27. "\n"));
  28.  
  29. Console.ReadLine();
  30. }
  31. }

3.2 一对多映射

  1. private static void OneToMany(string sqlConnectionString)
  2. {
  3. Console.WriteLine("One To Many");
  4. List<User> userList = new List<User>();
  5.  
  6. using (IDbConnection connection = GetSqlConnection(sqlConnectionString))
  7. {
  8.  
  9. string sqlCommandText3 = @"SELECT c.UserId,
  10. c.Username AS UserName,
  11. c.PasswordHash AS [Password],
  12. c.Email,
  13. c.PhoneNumber,
  14. c.IsFirstTimeLogin,
  15. c.AccessFailedCount,
  16. c.CreationDate,
  17. c.IsActive,
  18. r.RoleId,
  19. r.RoleName
  20. FROM dbo.CICUser c WITH(NOLOCK)
  21. LEFT JOIN CICUserRole cr
  22. ON cr.UserId = c.UserId
  23. LEFT JOIN CICRole r
  24. ON r.RoleId = cr.RoleId";
  25.  
  26. var lookUp = new Dictionary<int, User>();
  27. userList = connection.Query<User, Role, User>(sqlCommandText3,
  28. (user, role) =>
  29. {
  30. User u;
  31. if (!lookUp.TryGetValue(user.UserId, out u))
  32. {
  33. lookUp.Add(user.UserId, u = user);
  34. }
  35. u.Role.Add(role);
  36. return user;
  37. }, null, null, true, "RoleId", null, null).ToList();
  38. var result = lookUp.Values;
  39. }
  40.  
  41. if (userList.Count > 0)
  42. {
  43. userList.ForEach((item) => Console.WriteLine("UserName:" + item.UserName +
  44. "----Password:" + item.Password +
  45. "-----Role:" + item.Role.First().RoleName +
  46. "\n"));
  47.  
  48. Console.ReadLine();
  49. }
  50. else
  51. {
  52. Console.WriteLine("No Data In UserList!");
  53. }
  54. }

3.3 插入实体

  1. public static void InsertObject(string sqlConnectionString)
  2. {
  3. string sqlCommandText = @"INSERT INTO CICUser(Username,PasswordHash,Email,PhoneNumber)VALUES(
  4. @UserName,
  5. @Password,
  6. @Email,
  7. @PhoneNumber
  8. )";
  9. using (IDbConnection conn = GetSqlConnection(sqlConnectionString))
  10. {
  11. User user = new User();
  12. user.UserName = "Dapper";
  13. user.Password = "654321";
  14. user.Email = "Dapper@infosys.com";
  15. user.PhoneNumber = "13795666243";
  16. int result = conn.Execute(sqlCommandText, user);
  17. if (result > 0)
  18. {
  19. Console.WriteLine("Data have already inserted into DB!");
  20. }
  21. else
  22. {
  23. Console.WriteLine("Insert Failed!");
  24. }
  25.  
  26. Console.ReadLine();
  27. }
  28. }

3.4 执行存储过程

  1. /// <summary>
  2. /// Execute StoredProcedure and map result to POCO
  3. /// </summary>
  4. /// <param name="sqlConnnectionString"></param>
  5. public static void ExecuteStoredProcedure(string sqlConnnectionString)
  6. {
  7. List<User> users = new List<User>();
  8. using (IDbConnection cnn = GetSqlConnection(sqlConnnectionString))
  9. {
  10. users = cnn.Query<User>("dbo.p_getUsers",
  11. new { UserId = 2 },
  12. null,
  13. true,
  14. null,
  15. CommandType.StoredProcedure).ToList();
  16. }
  17. if (users.Count > 0)
  18. {
  19. users.ForEach((user) => Console.WriteLine(user.UserName + "\n"));
  20. }
  21. Console.ReadLine();
  22. }
  1. /// <summary>
  2. /// Execute StroedProcedure and get result from return value
  3. /// </summary>
  4. /// <param name="sqlConnnectionString"></param>
  5. public static void ExecuteStoredProcedureWithParms(string sqlConnnectionString)
  6. {
  7. DynamicParameters p = new DynamicParameters();
  8. p.Add("@UserName", "cooper");
  9. p.Add("@Password", "123456");
  10. p.Add("@LoginActionType", null, DbType.Int32, ParameterDirection.ReturnValue);
  11. using (IDbConnection cnn = GetSqlConnection(sqlConnnectionString))
  12. {
  13. cnn.Execute("dbo.p_validateUser", p, null, null, CommandType.StoredProcedure);
  14. int result = p.Get<int>("@LoginActionType");
  15. Console.WriteLine(result);
  16. }
  17.  
  18. Console.ReadLine();
  19. }

dapper.net 转载的更多相关文章

  1. SQL 横转竖 、竖专横 (转载) 使用Dapper.Contrib 开发.net core程序,兼容多种数据库 C# 读取PDF多级书签 Json.net日期格式化设置 ASPNET 下载共享文件 ASPNET 文件批量下载 递归,循环,尾递归 利用IDisposable接口构建包含非托管资源对象 《.NET 进阶指南》读书笔记2------定义不可改变类型

    SQL 横转竖 .竖专横 (转载)   普通行列转换 问题:假设有张学生成绩表(tb)如下: 姓名 课程 分数 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 ...

  2. windows server 证书的颁发与IIS证书的使用 Dapper入门使用,代替你的DbSQLhelper Asp.Net MVC中Action跳转(转载)

    windows server 证书的颁发与IIS证书的使用   最近工作业务要是用服务器证书验证,在这里记录下一. 1.添加服务器角色 [证书服务] 2.一路下一步直到证书服务安装完成; 3.选择圈选 ...

  3. Asp.Net Core + Dapper + Repository 模式 + TDD 学习笔记

    0x00 前言 之前一直使用的是 EF ,做了一个简单的小项目后发现 EF 的表现并不是很好,就比如联表查询,因为现在的 EF Core 也没有啥好用的分析工具,所以也不知道该怎么写 Linq 生成出 ...

  4. 轻量级ORM框架初探-Dapper与PetaPoco的基本使用

    一.EntityFramework EF是传统的ORM框架,也是一个比较重量级的ORM框架.这里仍然使用EF的原因在于为了突出轻量级ORM框架的性能,所谓有对比才有更优的选择. 1.1 准备一张数据库 ...

  5. Dapper简明教程

    Dapper是一款轻量级的ORM框架,有关Dapper优缺点的文章网上一大堆,这里小编就不再赘述啦.下面直接进入正题: 使用前准备 添加对Dapper的引用 在使用Dapper之前,我们要首先添加对D ...

  6. Dapper连接Oracle

    Dapper连接Oracle去年写过了篇博客,名字叫:让dapper支持Oracle 网址:http://www.cnblogs.com/ushou/archive/2012/09/28/270690 ...

  7. dapper+linq+json+ztree构建树

    dapper获取实体的集合 /// <summary> /// 获取表tb_sys_zhuowei所有数据 /// </summary> public IEnumerable& ...

  8. .Net Framework下对Dapper二次封装迁移到.Net Core2.0遇到的问题以及对Dapper的封装介绍

    今天成功把.Net Framework下使用Dapper进行封装的ORM成功迁移到.Net Core 2.0上,在迁移的过程中也遇到一些很有意思的问题,值得和大家分享一下.下面我会还原迁移的每一个过程 ...

  9. Dapper结合Repository模式的应用

    Dapper结合Repository模式的应用,包括如何在数据访问层(DAL)使用Dapper组件. Dapper在真实项目中使用,扩展IDbConnection的功能,支持Oracle.MS SQL ...

随机推荐

  1. jquery编辑插件tinyMCE的使用方法

    jquery编辑插件tinyMCE是一个非常容易集成到您系统的一个html编辑插件,它不像FckEditor那样需要针对专门的后台语言集成,tinyMCE既能做到轻松集成asp.net,php,jav ...

  2. flutter初探

    这两天看了下flutter,感觉这两年可能会爆发,所以尝试在mac和win10上面跑了下hello world... 移动技术简介 原生开发 跨平台技术简介 H5+原生(Cordova.Ionic.微 ...

  3. Qt5布局管理(二)——QDockWidget停靠窗口类

    转载:LeeHDsniper 停靠窗口类QDockWidget 实例效果 如右图所示,左半部分MainWindow是该窗口的中心窗口,右边的最下面两个停靠窗口可以跳出该窗口: 但是第一个停靠窗口只能停 ...

  4. TraceLog.cs 累积 C#

    using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Dia ...

  5. Linux Shell脚本编程--Linux特殊符号大全

    Linux Shell脚本编程--Linux特殊符号大全 linux_shell 特殊符号的介绍 2011

  6. 第13章 TCP编程(3)_基于自定义协议的多进程模型

    5. 自定义协议编程 (1)自定义协议:MSG //自定义的协议(TLV:Type length Value) typedef struct{ //协议头部 ];//TLV中的T unsigned i ...

  7. 一个PHPer的规划

    前言:学PHP过时了吗?PHP开发人员如何快速成长?怎么进行职业规划?特别是近几年非常火热的人工智能,机器学习,区块链技术等等,这多少会带动一些人盲目跟风,迷茫等,下面是PHP大牛魏永强带来的一篇根据 ...

  8. python判断变量是否为int、字符串、列表、元组、字典等方法

    在实际写程序中,经常要对变量类型进行判断,除了用type(变量)这种方法外,还可以用isinstance方法判断: #!/usr/bin/env pythona = 1b = [1,2,3,4]c = ...

  9. 使用for...of 优点,代替for...in,forEach和for循环

    来自阮一峰ES6标准: http://es6.ruanyifeng.com/#docs/iterator

  10. Postman的基础使用

    postman的基础功能,官方文档介绍的是相当啰嗦,所以笔者这里先简单介绍一下主界面,入门功能就都提到了.稍后我们再一一介绍基础功能的使用方法. Collections:在Postman中,Colle ...