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 将是你不二的选择。

访问量不大的项目可以考虑用EF写数据库操作,因为EF除了速度上慢以外,但开发效率极快,省略了很多sql写法,并能很方便的调用外键、集合等信息,用EF写项目最爽的事。

不过有些项目网站要考虑运行速度,这时不得不用其它的ORM框架,比如用dapper,因为它效果快,而且写sql非常灵活。

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
  7. Dapper语法十分简单。并且无须迁就数据库的设计

2、以Dapper(4.0)为例

先通过NuGet进行安装Dapper

PM> Install-Package Dapper -Version 1.40.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.RoleNameFROM   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/li150dan/p/9713285.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. 隔空操作之简单的模拟三种行为
  2. java 支付宝h5网页支付接口,移动端h5网页调用支付宝支付接口
  3. feign.RetryableException null executing post
  4. [攻防世界 pwn]——level2
  5. 解决Error: undefined reference to `__android_log_print'
  6. oracle 压缩导出 导入,EXP直接导出压缩问津,IMP直接导入压缩文件的方法
  7. android新材料设计,android - 如何实现新材料BottomAppBar为BottomNavigationView - SO中文参考 - www.soinside.com...
  8. ggplot2中显示坐标轴_qplot()——ggplot2的快速绘图
  9. aotu.js 动态运行脚本_素材丨一键生成动态LOGO,3000+个样式随你选!
  10. php100的阶乘代码while语句,编写PHP程序,使用while循环计算4096是2的几次方,然后输出结果...
  11. mongodb driver c#语法
  12. c++ pipe 同步 互斥_LiteOS内核教程04 | 信号量(任务同步)
  13. java 操作rtsp/rtmp视频流生成
  14. 京东移动端URL自动跳转PC端URL插件
  15. 在线框架引用|bootstrap|jq|jqmobile|CSS框架_无需整理
  16. 基于C#.NET Remoting技术的全球文字聊天室
  17. 5个月的精华:Spring/SpringBoot扩展点手册:手册在手,编码无忧:全网独一份 - 第451篇
  18. c语言改变图片颜色,用c语言把bmp格式的彩色图片转换成黑白的
  19. MacBook到底该怎么选?
  20. 微信定位精灵 android,微信定位精灵安卓版下载

热门文章

  1. 代码块_Dynamo?Get 7.1 什么是代码块
  2. TCP和UDP协议的特点和区别详解
  3. 八种常用排序算法参考
  4. bzoj 4631: 踩气球(线段树)
  5. [Python] 矩阵拼接 np.c_[a,b]和np.r_[a,b]
  6. js系列教程11-json、ajax(XMLHttpRequest)、comet、SSE、WebSocket全解
  7. 图像处理九:拟合曲线
  8. VIM常用的编辑操作
  9. 贺利坚老师汇编课程49笔记:call和ret
  10. MySQL(一)面试集合