一、基础
1.Dapper代码就一个SqlMapper.cs文件, 前人测试Dapper速度较快 的Orm,读取速度接近IDataReader,超过DataTable。
2.a.下载地址 https://github.com/StackExchange/dapper-dot-net ,包含在线示例 (test project)。b.net 下可以通过 Nuget下载。
3.实体类用NHibernateMappingGenerator生成。
 
二、示例代码
1.sql脚本
USE [FactoryDeal]
GO /****** Object: Table [dbo].[User] Script Date: 06/12/2015 10:57:18 ******/
SET ANSI_NULLS ON
GO SET QUOTED_IDENTIFIER ON
GO CREATE TABLE [dbo].[User](
[Id] [int] IDENTITY(,) NOT NULL,
[LoginNo] [nvarchar]() NOT NULL,
[PassWord] [nvarchar]() NOT NULL,
[PassPort] [nvarchar]() NULL,
[Type] [tinyint] NULL,
[FactoryId] [int] NULL,
[RoleId] [int] NULL,
[TrueName] [nvarchar]() NULL,
[NickName] [nvarchar]() NULL,
[Gender] [tinyint] NULL,
[Company] [nvarchar]() NULL,
[Dept] [nvarchar]() NULL,
[SelfCellphone] [nvarchar]() NULL,
[SelfTellphone] [nvarchar]() NULL,
[Duty] [nvarchar]() NULL,
[Address] [nvarchar]() NULL,
[Legal] [nvarchar]() NULL,
[LinkMan] [nvarchar]() NULL,
[Cellphone] [nvarchar]() NULL,
[Tellphone] [nvarchar]() NULL,
[Fax] [nvarchar]() NULL,
[PostCode] [nvarchar]() NULL,
[Email] [nvarchar]() NULL,
[QQ] [nvarchar]() NULL,
[BusinessImgPath] [nvarchar]() NULL,
[TaxRegImgPath] [nvarchar]() NULL,
[OrgImgPath] [nvarchar]() NULL,
[AuthNo] [nvarchar]() NULL,
[ifAuth] [bit] NULL,
[CreateTime] [datetime] NULL,
[EditeTime] [datetime] NULL,
[EditeMan] [nvarchar]() NULL,
[Status] [tinyint] NULL,
CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] GO USE [FactoryDeal]
GO /****** Object: Table [dbo].[User_Module] Script Date: 06/12/2015 11:00:51 ******/
SET ANSI_NULLS ON
GO SET QUOTED_IDENTIFIER ON
GO CREATE TABLE [dbo].[User_Module](
[UserId] [int] NOT NULL,
[ModuleId] [int] NOT NULL,
CONSTRAINT [PK_User_Module] PRIMARY KEY CLUSTERED
(
[UserId] ASC,
[ModuleId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] GO USE [FactoryDeal]
GO
/****** Object: StoredProcedure [dbo].[usp_insertChatRecord] Script Date: 06/12/2015 11:01:38 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create proc [dbo].[usp_insertChatRecord]
@FromLoginNo [nchar](),
@ToLoginNo [nvarchar](),
@Type [tinyint],
@Message [text],
@SendTime [datetime],
@Status [tinyint]
as
declare @nowYear nvarchar()
declare @sqlstr nvarchar()
set @nowYear=CAST(DATEPART(year,GETDATE()) as nvarchar())
begin if (not exists(select object_id from sys.tables where name='ChatRecord_'+@nowYear))
begin
set @sqlstr= 'CREATE TABLE ChatRecord_'+@nowYear+'(
[Id] [int] IDENTITY(,) NOT NULL,
[FromLoginNo] [nchar]() NOT NULL,
[ToLoginNo] [nvarchar]() NOT NULL,
[Type] [tinyint] NULL),
[Message] [text] NULL,
[SendTime] [datetime] NULL,
[Status] [tinyint] NULL) go'
exec sp_executesql @sqlstr
end ---动态插入数据
set @sqlstr='INSERT INTO ChatRecord_'+@nowYear+'
([FromLoginNo]
,[ToLoginNo]
,[Type]
,[Message]
,[SendTime]
,[Status])
VALUES(@FromLoginNo,@ToLoginNo,@Type,@Message ,@SendTime,@Status)'
exec sp_executesql @sqlstr ,N'@FromLoginNo nchar(32),@ToLoginNo [nvarchar](32),@Type [tinyint],@Message [text],@SendTime [datetime],@Status [tinyint]',
@FromLoginNo,@ToLoginNo,@Type,@Message,@SendTime,@Status end

2.实体类

    public class User
{
public virtual int Id { get; set; }
public virtual string Loginno { get; set; }
public virtual string Password { get; set; }
public virtual string Passport { get; set; }
public virtual byte? Type { get; set; }
public virtual int? Factoryid { get; set; }
public virtual int? Roleid { get; set; }
public virtual string Truename { get; set; }
public virtual string Nickname { get; set; }
public virtual byte? Gender { get; set; }
public virtual string Company { get; set; }
public virtual string Dept { get; set; }
public virtual string Selfcellphone { get; set; }
public virtual string Selftellphone { get; set; }
public virtual string Duty { get; set; }
public virtual string Address { get; set; }
public virtual string Legal { get; set; }
public virtual string Linkman { get; set; }
public virtual string Cellphone { get; set; }
public virtual string Tellphone { get; set; }
public virtual string Fax { get; set; }
public virtual string Postcode { get; set; }
public virtual string Email { get; set; }
public virtual string Qq { get; set; }
public virtual string Businessimgpath { get; set; }
public virtual string Taxregimgpath { get; set; }
public virtual string Orgimgpath { get; set; }
public virtual string Authno { get; set; }
public virtual bool? Ifauth { get; set; }
public virtual DateTime? Createtime { get; set; }
public virtual DateTime? Editetime { get; set; }
public virtual string Editeman { get; set; }
// public virtual byte? Status { get; set; } public int MyProperty { get; set; } public IList<UserModule> Modules { get; set; }
} public class UserModule
{
public virtual int Userid { get; set; }
public virtual int Moduleid { get; set; } public User User { get; set; }
} public class ChatRecord
{
public virtual string Fromloginno { get; set; }
public virtual string Tologinno { get; set; }
public virtual byte? Type { get; set; }
public virtual string Message { get; set; }
public virtual DateTime? Sendtime { get; set; }
public virtual byte? Status { get; set; }
}

3.Dapper方法

  private IList<User> GetAll()
{
string sql = "select * from [user]"; return conn.Query<User>(sql).ToList();
} private User GetSingleById(int id)
{
string sql = "select * from [user] where id=@id"; return conn.Query<User>(sql, param: new {id=id}).FirstOrDefault();
//param 必须是对象项属性 param:id 不正确
} private User Add(User user)
{
string sql = "insert into [user](loginNo,password) OUTPUT inserted.Id values(@loginNo,@password)";
user.Id=(int)conn.ExecuteScalar(sql, user); return user;
}
private bool Update(User user)
{
string sql = "update [user] set loginNo=@loginNo where id=@id"; return conn.Execute(sql, user)>=;
} private bool Delete(int id)
{
string sql = "delete from [user] where id=@id"; return conn.Execute(sql, new { id = id })>=;
} //1-N
private IList<User> GetAllUserWithModules()
{
string sql = "select * from [user] as a left join User_Module as b on a.Id=b.UserId"; //保证join UserModule条数
User user = null; //异常 When using the multi-mapping APIs ensure you set the splitOn param if you have keys other than Id
//必须添加 splitOn 同时查询字段必须包括外键 b.UserId
return conn.Query<User,UserModule, User>(sql, (u, m) => { if (user==null||user.Id!=u.Id)
{
user = u;
} if (m != null)
{
if (user.Modules==null)
{
user.Modules = new List<UserModule>();
}
user.Modules.Add(m);
} return user;
},splitOn:"Id,UserId").Distinct().ToList(); } //1*1
private IList<UserModule> GetAllModuleWithUser()
{
//inner join
string sql = "select * from User_Module a left join [User] b on a.UserId=b.Id "; return conn.Query<UserModule, User, UserModule>(sql,(m, u) =>
{
m.User = u;
return m; },"UserId,Id").ToList();
} //事务
private bool DeleteUserWithModule(int id)
{
string sql1 = "delete from [User] where id=@id";
string sql2 = "delete from User_Module where userId=@userId"; using (conn)
{
conn.Open(); using (var transaction = conn.BeginTransaction())
{
try
{
//Query必须添加 transaction:transaction
conn.Execute(sql1, new { id = id},transaction:transaction);
conn.Execute(sql2, new { userId = id },transaction:transaction);
transaction.Commit(); return true;
}
catch (Exception)
{
transaction.Rollback(); return false;
}
}
}
} private bool AdddChatRecord(ChatRecord chatRecord)
{
conn.Execute("usp_insertChatRecord", param: chatRecord,commandType:System.Data.CommandType.StoredProcedure); return true;
}

三、总结

个人感觉dapper 在处理join实体转换,尤其是1对多方面处理起来比麻烦。有什么好的实现方式,还请各位大虾指点....

Dapper 学习笔记的更多相关文章

  1. Dapper学习笔记(1)-开始

    Dapper是一款开源的轻量级ORM工具,源代码下载地址为https://github.com/StackExchange/dapper-dot-net,其具有以下特点: 1.Dapper是一个轻型的 ...

  2. Dapper学习笔记(一)

    https://github.com/StackExchange/dapper-dot-net Dapper是对IDbConnection的扩展,需要使用Dapper提供的扩展只需要把SqlMappe ...

  3. Dapper学习笔记(4)-事务

    Dapper中对事务的处理也非常简单,如下代码所示: private void DapperTransaction() { using (IDbConnection con = OpenConnect ...

  4. Dapper学习笔记(2)-链接引用

    在研究Dapper源码时发现Dapper NET45类库中的SqlMapper.cs文件前面有个蓝色的箭头图标,发现在Dapper NET45文件夹下根本不存在SqlMapper.cs文件,其文件属性 ...

  5. [C#]Dapper学习笔记

    1.安装,直接用nuget搜索Dapper就行,不过只支持框架4.5.1 2.数据库测试表 CREATE TABLE [dbo].[Student]( [ID] [bigint] NULL, ) NU ...

  6. Dapper学习笔记

    听说有个轻量化的orm Dapper,我就去了解下.试着对Sql Server和Mysql进行增删改查,体验不错.它不如EF臃肿,也比一般的封装灵活,比如我们封装了一个映射类.利用反射,在Execut ...

  7. Dapper学习笔记(5)-存储过程

    一.无参存储过程 第一步:创建一个不带参数的存储过程,代码如下: CREATE PROCEDURE [dbo].[QueryRoleNoParms] AS BEGIN SELECT * FROM T_ ...

  8. Dapper学习笔记(3)-增、删、改、查

    一.建表 在数据库中建立如下三张表: CREATE TABLE [dbo].[T_User] ( , ) PRIMARY KEY NOT NULL, ) NOT NULL, ) NULL, ) NUL ...

  9. 一起学ASP.NET Core 2.0学习笔记(二): ef core2.0 及mysql provider 、Fluent API相关配置及迁移

    不得不说微软的技术迭代还是很快的,上了微软的船就得跟着她走下去,前文一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx.superviso ...

随机推荐

  1. Computer Science: the Big Picture

    1.课程PPTMIT OpenCourseWarehttp://ocw.mit.edu/courses/; Courses  Stanfordhttp://cs.stanford.edu/course ...

  2. IOS OAuth授权分析

    一.黑马微博 ---> 用户的微博数据1.成为新浪的开发者(加入新浪微博的开发阵营)* 注册一个微博帐号,登录http://open.weibo.com帐号:643055866@qq.com密码 ...

  3. MHA 日常维护命令集

    MHA 日常维护命令集 1.查看ssh登陆是否成功 masterha_check_ssh --global_conf=/etc/masterha/masterha_default.conf --con ...

  4. POJ-2002 Squares---绕点旋转+Hash

    题目链接: https://vjudge.net/problem/POJ-2002 题目大意: 有一堆平面散点集,任取四个点,求能组成正方形的不同组合方式有多少. 相同的四个点,不同顺序构成的正方形视 ...

  5. POJ-3126 Prime Path---BFS+素数打表

    题目链接: https://vjudge.net/problem/POJ-3126 题目大意: 给两个四位数a,b 每次改变a中的一位而且改动之后的必须是素数,问最少改动几次可以到b?(永远达不到b就 ...

  6. 2017.9.17 HTML学习总结---table标签

    接上: 2.1.3  HTML表单标签与表单设计 表单是用户与服务器交互的主要方法,用户在表单中输入数据,提交给服务器程序来处理. (1)表单的组成: 文本框(text),密码框(password), ...

  7. css隐藏元素的六类13种方法

    隐藏元素的方法 隐藏元素的方法可以总结为六类:直接隐藏.对溢出内容隐藏.对元素透明度进行调整.将元素移除当前屏幕.对元素的层级关系进行调整.对元素进行裁剪 只有对元素的透明度进行调整才可以点击,其余都 ...

  8. HDU.2561 第二小整数(water)

    题目来源:2561 题意分析:找出一堆数中第二小的整数,和题目说的一样 我的思路:冒泡或者sort()一下就ok了,但是我因为没看到多个测试用例还是吃了几记WA . ┭┮﹏┭┮ 完整代码: #incl ...

  9. js中document的用法小结

    document常用属性: document.title//设置文档标题,与HTNL中的title标签等价 document.bgColor//设置页面背景颜色 document.fgColor//设 ...

  10. 网页弹出[Object HTMLDivElement],怎么取值?

    使用innerHTML方法,可以得到文本值