Dapper.NET使用

本文目录

  • Dapper.NET使用
  • 1、为什么选择Dapper
  • 2、以Dapper(4.0)为例。
  • 2.1 在数据库中建立几张表。
  • 2.2实体类。
  • 3.使用方法
  • 3.1  一对一映射
  • 3.2 一对多映射
  • 3.3 插入实体
  • 3.4 执行存储过程

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 在数据库中建立几张表。

CREATE TABLE [dbo].[CICUser]
([UserId]                [int] IDENTITY(1, 1) PRIMARY KEY NOT NULL,[Username]              [nvarchar](256) NOT NULL,[PasswordHash]          [nvarchar](500) NULL,[Email]                 [nvarchar](256) NULL,[PhoneNumber]           [nvarchar](30) NULL,[IsFirstTimeLogin]      [bit] DEFAULT(1) NOT NULL,[AccessFailedCount]     [int] DEFAULT(0) NOT NULL,[CreationDate]          [datetime] DEFAULT(GETDATE()) NOT NULL,[IsActive]              [bit] DEFAULT(1) NOT NULL
)CREATE TABLE [dbo].[CICRole]
([RoleId]       [int] IDENTITY(1, 1) PRIMARY KEY NOT NULL,[RoleName]     [nvarchar](256) NOT NULL,
)CREATE TABLE [dbo].[CICUserRole]
([Id]   [int] IDENTITY(1, 1) PRIMARY KEY NOT NULL,[UserId]  [int] FOREIGN KEY REFERENCES [dbo].[CICUser] ([UserId]) NOT NULL,[RoleId]  [int] FOREIGN KEY REFERENCES [dbo].[CICRole] ([RoleId]) NOT NULL
)

2.2实体类。

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

public class User{public User(){Role = new List<Role>();}public int UserId { get; set; }public string UserName { get; set; }       public string Password { get; set; }public string Email { get; set; }public string PhoneNumber { get; set; }public bool IsFirstTimeLogin { get; set; }public int AccessFailedCount { get; set; }public DateTime CreationDate { get; set; }public bool IsActive { get; set; }public List<Role> Role { get; set; }}public class Role{public int RoleId { get; set; }public string RoleName { get; set; }}public class Customer{public int UserId { get; set; }public string UserName { get; set; }       public string Password { get; set; }public string Email { get; set; }public string PhoneNumber { get; set; }public bool IsFirstTimeLogin { get; set; }public int AccessFailedCount { get; set; }public DateTime CreationDate { get; set; }public bool IsActive { get; set; }public Role Role { get; set; }}    

3.使用方法

3.1  一对一映射

 private static void OneToOne(string sqlConnectionString){List<Customer> userList = new List<Customer>();using (IDbConnection conn = GetSqlConnection(sqlConnectionString)){string sqlCommandText = @"SELECT c.UserId,c.Username AS UserName,
c.PasswordHash AS [Password],c.Email,c.PhoneNumber,c.IsFirstTimeLogin,c.AccessFailedCount,
c.CreationDate,c.IsActive,r.RoleId,r.RoleName FROM dbo.CICUser c WITH(NOLOCK)
INNER JOIN CICUserRole cr ON cr.UserId = c.UserId
INNER JOIN CICRole r ON r.RoleId = cr.RoleId";userList = conn.Query<Customer, Role, Customer>(sqlCommandText, (user, role) => { user.Role = role; return user; },null,null,true, "RoleId", null,null).ToList();}if (userList.Count > 0){userList.ForEach((item) => Console.WriteLine("UserName:" + item.UserName +"----Password:" + item.Password + "-----Role:" + item.Role.RoleName +"\n"));Console.ReadLine();}}

3.2 一对多映射

private static void OneToMany(string sqlConnectionString){Console.WriteLine("One To Many");List<User> userList = new List<User>();using (IDbConnection connection = GetSqlConnection(sqlConnectionString)){string sqlCommandText3 = @"SELECT c.UserId,c.Username      AS UserName,c.PasswordHash  AS [Password],c.Email,c.PhoneNumber,c.IsFirstTimeLogin,c.AccessFailedCount,c.CreationDate,c.IsActive,r.RoleId,r.RoleName
FROM   dbo.CICUser c WITH(NOLOCK)LEFT JOIN CICUserRole crON  cr.UserId = c.UserIdLEFT JOIN CICRole rON  r.RoleId = cr.RoleId";var lookUp = new Dictionary<int, User>();userList = connection.Query<User, Role, User>(sqlCommandText3,(user, role) =>{User u;if (!lookUp.TryGetValue(user.UserId, out u)){lookUp.Add(user.UserId, u = user);}u.Role.Add(role);return user;}, null, null, true, "RoleId", null, null).ToList();var result = lookUp.Values;}if (userList.Count > 0){userList.ForEach((item) => Console.WriteLine("UserName:" + item.UserName +"----Password:" + item.Password +"-----Role:" + item.Role.First().RoleName +"\n"));Console.ReadLine();}else{Console.WriteLine("No Data In UserList!");}}

3.3 插入实体

 public static void InsertObject(string sqlConnectionString){string sqlCommandText = @"INSERT INTO CICUser(Username,PasswordHash,Email,PhoneNumber)VALUES(@UserName,@Password,@Email,@PhoneNumber
)";using (IDbConnection conn = GetSqlConnection(sqlConnectionString)){User user = new User();user.UserName = "Dapper";user.Password = "654321";user.Email = "Dapper@infosys.com";user.PhoneNumber = "13795666243";int result = conn.Execute(sqlCommandText, user);if (result > 0){Console.WriteLine("Data have already inserted into DB!");}else{Console.WriteLine("Insert Failed!");}Console.ReadLine();}}

3.4 执行存储过程

         /// <summary>/// Execute StoredProcedure and map result to POCO/// </summary>/// <param name="sqlConnnectionString"></param>public static void ExecuteStoredProcedure(string sqlConnnectionString){List<User> users = new List<User>();using (IDbConnection cnn = GetSqlConnection(sqlConnnectionString)){users = cnn.Query<User>("dbo.p_getUsers", new { UserId = 2 },null, true, null, CommandType.StoredProcedure).ToList();}if (users.Count > 0){users.ForEach((user) => Console.WriteLine(user.UserName + "\n"));}Console.ReadLine();}

        /// <summary>/// Execute StroedProcedure and get result from return value/// </summary>/// <param name="sqlConnnectionString"></param>public static void ExecuteStoredProcedureWithParms(string sqlConnnectionString){DynamicParameters p = new DynamicParameters();p.Add("@UserName", "cooper");p.Add("@Password", "123456");p.Add("@LoginActionType", null, DbType.Int32, ParameterDirection.ReturnValue);using (IDbConnection cnn = GetSqlConnection(sqlConnnectionString)){cnn.Execute("dbo.p_validateUser", p, null, null, CommandType.StoredProcedure);int result = p.Get<int>("@LoginActionType");Console.WriteLine(result);}Console.ReadLine();}

转载于:https://www.cnblogs.com/BrokenIce/p/5706435.html

Dapper.NET——轻量ORM相关推荐

  1. Dapper.NET—轻量ORM

    Dapper.NET使用 本文目录 Dapper.NET使用 1.为什么选择Dapper 2.以Dapper(4.0)为例. 2.1 在数据库中建立几张表. 2.2实体类. 3.使用方法 3.1  一 ...

  2. [.Net]轻量ORM——Dapper

    Dapper只有一个代码文件,完全开源,你可以放在项目里的任何位置,来实现数据到对象的ORM操作,体积小速度快. 使用ORM的好处是增.删.改很快,不用自己写sql,因为这都是重复技术含量低的工作,还 ...

  3. SqlSugar轻量ORM

    蓝灯软件数据股份有限公司项目,代码开源. SqlSugar是一款轻量级的MSSQL ORM ,除了具有媲美ADO的性能外还具有和EF相似简单易用的语法. 学习列表 0.功能更新 1.SqlSugar基 ...

  4. DataRabbit 轻量的数据访问框架(13)--DataRabbit 3.0 ORM性能大幅度提升!

       DataRabbit 3.0重写了DataRabbit 2.0的ORM实现的内核,性能提升了90倍左右,结果是DataRabbit 3.0的ORM性能与直接使用ADO.NET的性能已经非常接近. ...

  5. orm jdbc_Spring Data JDBC通用DAO实现–迄今为止最轻量的ORM

    orm jdbc 我很高兴宣布Spring Data JDBC存储库项目的第一个版本. 这个开源库的目的是为基于Spring框架中 JdbcTemplate关系数据库提供通用,轻量且易于使用的DAO实 ...

  6. Spring Data JDBC通用DAO实现–迄今为止最轻量的ORM

    我很高兴宣布Spring Data JDBC存储库项目的第一个版本. 这个开放源代码库的目的是为基于Spring框架中 JdbcTemplate关系数据库提供通用,轻量且易于使用的DAO实现,与项目的 ...

  7. 轻量型互联网应用架构方式

    点击上方 Java后端,选择 设为星标 优质文章,及时送达 作者 | 天如 链接 | http://suo.im/4qRPkj 一.前言 说到互联网应用架构,就绕不开微服务,当下(2019)最热门的微 ...

  8. 基于Vue, Vuex 和 ElementUI 构建轻量单页Hexo主题Lite

    Hexo Theme Lite Keep Calm, Lite and Writing. light single page blog application theme, using Vue, Vu ...

  9. 买个云服务器有啥用_如何用阿里云轻量应用服务器配置一个WordPress网站?

    轻量应用服务器是面向单机应用场景的新一代计算服务,提供精品应用一键部署,支持一站式的域名.网站.安全.运维.应用管理等服务,极大优化搭建简单应用的体验,降低了入门级用户使用云计算产品的门槛. 那么,我 ...

最新文章

  1. java.io与网络通信
  2. puppet开源的软件自动化配置和部署工具——本质就是CS,服务端统一管理配置...
  3. kafka中controller的作用_Kafka 常见问题汇总
  4. cnn卷积神经网络_5分钟内卷积神经网络(CNN)
  5. java 随机化快速排序,JS实现随机化快速排序的实例代码
  6. 字符编码乱码问题(servlet底层 编码大揭秘)
  7. SendMessage 设置TMemo组件的边界
  8. Selenium3元素定位详解与封装
  9. 六星经典CSAPP-笔记(7)加载与链接(上)
  10. matlab 输入矩形序列,从python调用Matlab函数:“初始值设定项必须是矩形嵌套序列”...
  11. pytest框架学习
  12. C#获取汉字的区位码的方法
  13. OpenPose的使用
  14. astrolog php,如何在苹果MAC上使用Astrolog32 zet9等占星软件
  15. key位置 win10生成的ssh_WIN 10生成SSH密钥教程
  16. “双月”数据集的生成
  17. 《C++ 笔记》 Part5 C++ 资源大全中文版
  18. 统计本段话的高频词汇——报错:KeyError
  19. 5G安全的全球统一认证体系和标准演进
  20. 简易电子章制作小模块(VBA)

热门文章

  1. 如何快速完成整理笔记?
  2. 在很多很多事情都要的情况下,最重要的东西是什么?
  3. 管理心得之学术,交通,作息,心态
  4. canvas的特别棒的feature:badge!!!
  5. 【转】UGUI研究院之缓存策略让UI打开更快(三十)
  6. Java开发学习--MongoDB
  7. HTML里的哪一部分Javascript 会在页面加载的时候被执行?
  8. vue 组件之间的传值
  9. IT部门的服务工作方式、工作内容有了彻底的改变——安徽移动通信有限责任公司...
  10. ios开发人员mac空间不够用的解决办法