dapper.net 转载
Dapper.NET——轻量ORM
Dapper.NET使用
Dapper是一款轻量级ORM工具(Github)。如果你在小的项目中,使用Entity Framework、NHibernate 来处理大数据访问及关系映射,未免有点杀鸡用牛刀。你又觉得ORM省时省力,这时Dapper 将是你不二的选择。
1、为什么选择Dapper
- 轻量。只有一个文件(SqlMapper.cs),编译完成之后只有120k(好象是变胖了)
- 速度快。Dapper的速度接近与IDataReader,取列表的数据超过了DataTable。
- 支持多种数据库。Dapper可以在所有Ado.net Providers下工作,包括sqlite, sqlce, firebird, oracle, MySQL, PostgreSQL and SQL Server
- 可以映射一对一,一对多,多对多等多种关系。
- 性能高。通过Emit反射IDataReader的序列队列,来快速的得到和产生对象,性能不错。
- 支持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 cr
- ON cr.UserId = c.UserId
- LEFT JOIN CICRole r
- ON 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();
- }

dapper.net 转载的更多相关文章
- SQL 横转竖 、竖专横 (转载) 使用Dapper.Contrib 开发.net core程序,兼容多种数据库 C# 读取PDF多级书签 Json.net日期格式化设置 ASPNET 下载共享文件 ASPNET 文件批量下载 递归,循环,尾递归 利用IDisposable接口构建包含非托管资源对象 《.NET 进阶指南》读书笔记2------定义不可改变类型
SQL 横转竖 .竖专横 (转载) 普通行列转换 问题:假设有张学生成绩表(tb)如下: 姓名 课程 分数 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 ...
- windows server 证书的颁发与IIS证书的使用 Dapper入门使用,代替你的DbSQLhelper Asp.Net MVC中Action跳转(转载)
windows server 证书的颁发与IIS证书的使用 最近工作业务要是用服务器证书验证,在这里记录下一. 1.添加服务器角色 [证书服务] 2.一路下一步直到证书服务安装完成; 3.选择圈选 ...
- Asp.Net Core + Dapper + Repository 模式 + TDD 学习笔记
0x00 前言 之前一直使用的是 EF ,做了一个简单的小项目后发现 EF 的表现并不是很好,就比如联表查询,因为现在的 EF Core 也没有啥好用的分析工具,所以也不知道该怎么写 Linq 生成出 ...
- 轻量级ORM框架初探-Dapper与PetaPoco的基本使用
一.EntityFramework EF是传统的ORM框架,也是一个比较重量级的ORM框架.这里仍然使用EF的原因在于为了突出轻量级ORM框架的性能,所谓有对比才有更优的选择. 1.1 准备一张数据库 ...
- Dapper简明教程
Dapper是一款轻量级的ORM框架,有关Dapper优缺点的文章网上一大堆,这里小编就不再赘述啦.下面直接进入正题: 使用前准备 添加对Dapper的引用 在使用Dapper之前,我们要首先添加对D ...
- Dapper连接Oracle
Dapper连接Oracle去年写过了篇博客,名字叫:让dapper支持Oracle 网址:http://www.cnblogs.com/ushou/archive/2012/09/28/270690 ...
- dapper+linq+json+ztree构建树
dapper获取实体的集合 /// <summary> /// 获取表tb_sys_zhuowei所有数据 /// </summary> public IEnumerable& ...
- .Net Framework下对Dapper二次封装迁移到.Net Core2.0遇到的问题以及对Dapper的封装介绍
今天成功把.Net Framework下使用Dapper进行封装的ORM成功迁移到.Net Core 2.0上,在迁移的过程中也遇到一些很有意思的问题,值得和大家分享一下.下面我会还原迁移的每一个过程 ...
- Dapper结合Repository模式的应用
Dapper结合Repository模式的应用,包括如何在数据访问层(DAL)使用Dapper组件. Dapper在真实项目中使用,扩展IDbConnection的功能,支持Oracle.MS SQL ...
随机推荐
- jquery编辑插件tinyMCE的使用方法
jquery编辑插件tinyMCE是一个非常容易集成到您系统的一个html编辑插件,它不像FckEditor那样需要针对专门的后台语言集成,tinyMCE既能做到轻松集成asp.net,php,jav ...
- flutter初探
这两天看了下flutter,感觉这两年可能会爆发,所以尝试在mac和win10上面跑了下hello world... 移动技术简介 原生开发 跨平台技术简介 H5+原生(Cordova.Ionic.微 ...
- Qt5布局管理(二)——QDockWidget停靠窗口类
转载:LeeHDsniper 停靠窗口类QDockWidget 实例效果 如右图所示,左半部分MainWindow是该窗口的中心窗口,右边的最下面两个停靠窗口可以跳出该窗口: 但是第一个停靠窗口只能停 ...
- TraceLog.cs 累积 C#
using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Dia ...
- Linux Shell脚本编程--Linux特殊符号大全
Linux Shell脚本编程--Linux特殊符号大全 linux_shell 特殊符号的介绍 2011
- 第13章 TCP编程(3)_基于自定义协议的多进程模型
5. 自定义协议编程 (1)自定义协议:MSG //自定义的协议(TLV:Type length Value) typedef struct{ //协议头部 ];//TLV中的T unsigned i ...
- 一个PHPer的规划
前言:学PHP过时了吗?PHP开发人员如何快速成长?怎么进行职业规划?特别是近几年非常火热的人工智能,机器学习,区块链技术等等,这多少会带动一些人盲目跟风,迷茫等,下面是PHP大牛魏永强带来的一篇根据 ...
- python判断变量是否为int、字符串、列表、元组、字典等方法
在实际写程序中,经常要对变量类型进行判断,除了用type(变量)这种方法外,还可以用isinstance方法判断: #!/usr/bin/env pythona = 1b = [1,2,3,4]c = ...
- 使用for...of 优点,代替for...in,forEach和for循环
来自阮一峰ES6标准: http://es6.ruanyifeng.com/#docs/iterator
- Postman的基础使用
postman的基础功能,官方文档介绍的是相当啰嗦,所以笔者这里先简单介绍一下主界面,入门功能就都提到了.稍后我们再一一介绍基础功能的使用方法. Collections:在Postman中,Colle ...