Dapper.NET - ORM(ibatis.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
- 轻量。只有一个文件(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 一对一映射

{
SqlConnection conn = new SqlConnection(sqlConnectionString);
conn.Open();
return conn;
}
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();
}

GO
/****** Object: StoredProcedure [dbo].[sp_DapperPager] Script Date: 2017/02/10 12:23:40 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Create PROCEDURE [dbo].[sp_DapperPager]
( @TableName VARCHAR(1000), --表名,多表是请使用 tA a inner join tB b On a.AID = b.AID
@PrimaryKey NVARCHAR(100), --主键,可以带表头 a.AID
@Fields NVARCHAR(2000) = '*',--读取字段
@Condition NVARCHAR(3000) = '',--Where条件
@PageIndex INT = 1, --开始页码
@PageSize INT = 10, --页大小
@Order NVARCHAR(200) = '', --排序字段
@TotalItemCount INT = 0 OUT
)
AS
DECLARE @strWhere VARCHAR(2000)
DECLARE @strsql NVARCHAR(3900)
IF @Condition IS NOT NULL AND len(ltrim(rtrim(@Condition)))>0
BEGIN
SET @strWhere = ' WHERE ' + @Condition + ' '
END
ELSE
BEGIN
SET @strWhere = ''
END
IF (charindex(ltrim(rtrim(@PrimaryKey)),@Order)=0)
BEGIN
IF(@Order='')
SET @Order = @PrimaryKey + ' DESC '
ELSE
SET @Order = @Order+ ' , '+@PrimaryKey + ' DESC '
END
SET @strsql = 'SELECT @TotalItemCount = Count(1) FROM ' + @TableName + @strWhere
EXECUTE sp_executesql @strsql ,N'@TotalItemCount INT output',@TotalItemCount OUTPUT
IF @PageIndex = 1 --第一页提高性能
BEGIN
SET @strsql = 'SELECT TOP ' + str(@PageSize) +' '+@Fields
+ ' FROM ' + @TableName + ' ' + @strWhere + ' ORDER BY '+ @Order
END
ELSE
BEGIN
/* Execute dynamic query */
DECLARE @START_ID NVARCHAR(50)
DECLARE @END_ID NVARCHAR(50)
SET @START_ID = CONVERT(NVARCHAR(50),(@PageIndex - 1) * @PageSize + 1)
SET @END_ID = CONVERT(NVARCHAR(50),@PageIndex * @PageSize)
SET @strsql = ' SELECT *
FROM (SELECT ROW_NUMBER() OVER(ORDER BY '+@Order+') AS rownum,
'+@Fields+ '
FROM '+@TableName + @strWhere +') AS XX
WHERE rownum BETWEEN '+@START_ID+' AND ' +@END_ID +' ORDER BY XX.rownum ASC'
END
EXEC(@strsql)
RETURN
Dapper.NET - ORM(ibatis.Net)的更多相关文章
- Dapper小型ORM的使用(随便吐槽下公司)
近来公司又有新项目要做,之前做项目用过蛮多ORM,包括ef,NetTiers,ServiceStack.OrmLite等ROM,每种ORM都有一定的坑(或者说是使用者的问题吧~~).用来用去都觉的有一 ...
- ASP .Net Core 使用 Dapper 轻型ORM框架
一:优势 1,Dapper是一个轻型的ORM类.代码就一个SqlMapper.cs文件,编译后就40K的一个很小的Dll. 2,Dapper很快.Dapper的速度接近与IDataReader,取列表 ...
- Dapper.net ORM
参考链接:https://github.com/StackExchange/dapper-dot-net Dapper - a simple object mapper for .Net Dapper ...
- Use Dapper ORM With ASP.NET Core
Dapper.NET is not just another ORM tool, it's considered as the king of ORM. Because it's fast, easy ...
- 使用轻量级ORM Dapper进行增删改查
项目背景 前一段时间,开始做一个项目,在考虑数据访问层是考虑技术选型,考虑过原始的ADO.NET.微软的EF.NH等.再跟经理讨论后,经理强调不要用Ef,NH做ORM,后期的sql优化不好做,公司 ...
- 轻量级ORM框架Dapper应用一:Dapper安装
一.Dapper简介 Dapper是一款轻量级ORM框架,为解决网站访问流量极高而产生的性能问题而构造,主要通过执行TSQL表达式而实现数据库的CQRS. 如果你在项目中遇到性能访问问题,选择Dapp ...
- ORM之Dapper运用
一.前言 上一篇[分层架构设计]我们已经有了架构的轮廓,现在我们就在这个轮廓里面造轮子.项目要想开始,肯定先得确定ORM框架,目前市面上的ORM框架有很多,对于.net人员来说很容易就想到以ADO.N ...
- Asp.net Core 系列之--2.ORM初探:Dapper实现MySql数据库各类操作
ChuanGoing 2019-09-10 距离上一篇近一个月时间,断断续续才把本篇码完,后面将加快进度,争取年度内把本系列基本介绍完成,同时督促本人持续学习. 本篇学习曲线: 1.初识Dapper ...
- Spring+ibatis动态管理数据源
Spring动态配置多数据源,即在大型应用中对数据进行切分,并且采用多个数据库实例进行管理,这样可以有效提高系统的水平伸缩性.而这样的方案就会不同于常见的单一数据实例的方案,这就要程序在运行时根据当时 ...
随机推荐
- NSArray和NSMutableArray的copy和MutableCopy
NSArray: //main.m #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { ...
- android中如何实现离线缓存
离线缓存就是在网络畅通的情况下将从服务器收到的数据保存到本地,当网络断开之后直接读取本地文件中的数据. 将网络数据保存到本地: 你可以自己写一个保存数据成本地文件的方法,保存在android系统的任意 ...
- Curl之获取外网IP
获取外网IP:curl -s ifconfig.me
- Nhibernate Icreteria 分页查询
1.创建查询条件,条件为一个ICreterion的列表 /// /// 创建Criteria(不含order,因为获取总数的时候,为了性能考虑,不加order) /// ...
- 【笔试】T实习生2014 总结
2014.4.12 是T的广州站,就在本校,很方便.考前一两天,临时抱佛脚,看着HTMLdog上的网页知识.就算考前,还在懊悔自己为什么不好好利用清明假期,多看点,看多点?哎,哎.. 谁知道一拿到试卷 ...
- oracle rac存储安装
oracle rac 10.2 的在 linux 上的存储选项 博客分类: Oracle OracleLinux项目管理配置管理 Oracle 集群需要存储的软件和数据 项目 内容 最少磁盘空间 C ...
- 常用oracle查询总结
--查询表空间使用情况 SELECT UPPER(F.TABLESPACE_NAME) "表空间名", D.TOT_GROOTTE_MB "表空间大小(M)", ...
- puppet重申证书
直接上步骤,由于测试用的是PE3.X版本,在网上搜的命令几乎与PE相关的puppet命令不同了, 1.在PE-Client操作,停止pe-puppet,pe-mcollective资源; puppet ...
- PC-ADSL开机自动拨号方法
方法一:把adsl拨号的快捷方式放到“开始”菜单中“所有程序”中的“启动”中. 再到“控制面板”中的“网络连接”中找到你用的拨号连接,鼠标右键点击选择“属性”.然后,在窗口上部选择“选项”,把“拨号选 ...
- [二]Ajax基本实现
<script text="text/javascript"> function ajax(){ var httpRequest; if(windows.httpReq ...