apper
什么是dapper
在维护一些较老的项目的时候,往往我们会用很多sql那么这个时候我们要考虑优化这些项目的时候,我们就可以使用dapper
dapper 是一款轻量级的ORM框架,它的优势很多轻量级,速度快,而且还支持不同的数据库,github地址如下:
https://github.com/StackExchange/Dapper
准备工作
本次为了演示,我们引用NUnit做单测,通过SQL Server Profiler来监控生成的sql语句。
dapper引用也特别方面我们可以通过NuGet下载引用dapper程序包,然后我们在类里引用using Dapper;就可以了。
数据库表结构如下:

另外我们还要创建一个名为DapperTestModel的实体
public class DapperTestModel
{
public int Id { get; set; }
public string Message { get; set; }
}
让我们准备好链接字符串开始本次演示吧
private string connString =
System.Configuration.ConfigurationManager.ConnectionStrings["sqlConnectionString"].ConnectionString;
编辑
编辑代码如下,我们把新增和修改的方法写在一起,通过判断ID是否为0来觉得是新增还是修改。首先我们演示新增方法
[Test]
public void Edit()
{
int ID = 0;
string sql = "insert into dappertest([Message])values(@Message)";
using (IDbConnection conn = new SqlConnection(connString))
{
if (ID > 0)
{
sql = "update dappertest set [Message]=@Message where Id=@ID";
conn.Execute(sql, new {ID = ID, Message = "修改这句话"});
}
else
{
conn.Execute(sql, new { Message = "添加一句话" });
}
}
}
这里我们看到dapper很方便的一点就是我们可以使对象来代替参数,这里我们就可以通过匿名对象来传递参数
好了我们执行单测,看看数据库中执行的语句
exec sp_executesql N'insert into dappertest([Message])values(@Message)',N'@Message nvarchar(4000)',@Message=N'添加一句话'
我们在去数据库中查看一下数据

接着我们去修改ID来看看修改方法
exec sp_executesql N'update dappertest set [Message]=@Message where Id=@ID',N'@ID int,@Message nvarchar(4000)',@ID=10,@Message=N'修改这句话'
我们再去数据库中查看一下数据情况

查询
dapper的查询功能也很灵活,比如我们需要获取一个list列表,如果换成使用DBHelper类,我们可能需要先查询一个DateSet然后再将其转成list,那么使用dapper我们可以直接转成list,我们来看看具体的实现代码
[Test]
public void GetList()
{
using (IDbConnection conn = new SqlConnection(connString))
{
string sql = "select ID,[Message] from dappertest";
List<DapperTestModel> dapperList = conn.Query<DapperTestModel>(sql).ToList();
}
}
我们在看看数据库中的执行情况
select ID,[Message] from dappertest

删除
删除和新增修改的方式一致,代码如下
[Test]
public void Delete()
{
int ID = 10;
using (IDbConnection conn = new SqlConnection(connString))
{
int retrunCount = 0;
string sql = "delete from dappertest where id=@ID";
retrunCount = conn.Execute(sql, new { ID = ID });
}
}
同样的我们看看数据库中的执行语句
exec sp_executesql N'delete from dappertest where id=@ID',N'@ID int',@ID=10
我们再查询看看

存储过程
我们再来看看存储过程的调用,首先我们在数据库中添加一个简单的存储过程
CREATE PROCEDURE DapperInsert
@Message nvarchar(200)
AS
insert into dappertest([message])
values(@Message)
然后我们去调用这个存储过程
[Test]
public void PInsert()
{
using (IDbConnection conn = new SqlConnection(connString))
{
conn.Execute("DapperInsert",new {Message="这是存储过程新增的"}, null, null,CommandType.StoredProcedure);
}
}
同样的我们看看数据库中的执行情况
exec DapperInsert @Message=N'这是存储过程新增的'

事务
在平常的业务系统中,我们或多或少会用到事务,那么接下来我们演示一下在dapper中事务的调用
[Test]
public void Insert()
{
using (IDbConnection conn = new SqlConnection(connString))
{
conn.Open();
//开始事务
IDbTransaction transaction = conn.BeginTransaction();
try
{
string sql = "insert into dappertest([Message])values(@Message)";
string sql2 = "insert into dappertest([Message])values(@Message)";
conn.Execute(sql, new { Message ="再次新增一句话" }, transaction);
conn.Execute(sql2, new { Message=""}, transaction);
//提交事务
transaction.Commit();
}
catch (Exception ex)
{
//出现异常,事务Rollback
transaction.Rollback();
throw new Exception(ex.Message);
}
}
}
我们故意使其在第二次新增的时候报错
我们看看数据库中的执行情况,这里数据库会执行了两次
第一次
exec sp_executesql N'insert into dappertest([Message])values(@Message)',N'@Message nvarchar(4000)',@Message=N'再次新增一句话'
第二次
insert into dappertest([Message])values()
这里我们失败回滚了,我们在看看数据库中的情框
我们看到数据库中果然没有新增数据,我们目的也达到了。
总结
本次我给大家带来了一些dapper的简单应用包括简单逻辑调用存储过程的调用,以及事务的调用,从我们的简单示例中我们看到,dapper是一款十分优秀的轻量级的ORM框架,如果我们需要维护那种sql语句特别多的项目时,可以考虑使用dapper,使用dapper我们可以通过对象很灵活的去给我们的sql语句或者存储过程传递参数,也可以很灵活的转换类型。
apper的更多相关文章
- DOM example
一:DOM简介: 文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口.在网页上,组织页面(或文档)的对象被组织在一个树形结构中, ...
- Docker生产环境实践指南
技术栈:1. 构建系统2. 镜像仓库3. 宿主机管理4. 配置管理5. 部署6. 编排7. 日志8. 监控 镜像:1. 如果用户像往常一样运行包安装命令,这些永远也用不上的缓存包文件将会永远地成为镜像 ...
- VMware12 安装 CentOS 6.5 64位
前言:本人在配置Hadoop的过程中,需要搭建Cent OS 64 环境,借此,顺便将Cent OS 64 的安装在此记录,方便自己,也方便大家学习.本次是在VM12虚拟机中实现Cent OS 64 ...
- hadoop streaming 编程
概况 Hadoop Streaming 是一个工具, 代替编写Java的实现类,而利用可执行程序来完成map-reduce过程.一个最简单的程序 $HADOOP_HOME/bin/hadoop jar ...
- C++ Primer 学习笔记_76_模板与泛型编程 --模板定义[续]
模板与泛型编程 --模板定义[续] 四.模板类型形參 类型形參由keywordclass或 typename后接说明符构成.在模板形參表中,这两个keyword具有同样的含义,都指出后面所接的名字表示 ...
- Spring_Springmvc_mybatis一般配置
web.xml配置 <?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi=&quo ...
- [LeetCode#136, 137]Single Number, Single Number 2
The question: Single Number Given an array of integers, every element appears twice except for one. ...
- [转载]Android相关开发网站
my: Android 开发官方文档国内镜像-踏得网: http://wear.techbrood.com/index.html 转载自: http://my.oschina.net/luforn/b ...
- C++ Primer 学习笔记_76_模板和泛型编程 --模板定义[继续]
模板和泛型编程 --模板定义[续] 四.模板类型形參 类型形參由keywordclass或 typename后接说明符构成.在模板形參表中,这两个keyword具有同样的含义,都指出后面所接的名字表示 ...
随机推荐
- app 设计原则 ,步骤
原则1:用户没精力研究你的应用.假设一開始不能非常清楚地了解某个应用,不能非常快上手应用.用户就要丢弃这个应用了 原则2:要让用户一眼就知道应用的核心功能和用法 原则3:减少认知负荷,千万不能让客户去 ...
- POJ 2226 二分图最小覆盖
题意: 思路: 把横着的连通块放在一个集合 竖着的放在一个集合 如果有交 就连边 求最小覆盖即可 (数值上等于最大匹配) //By SiriusRen #include <cstdio> ...
- Impala储存与分区
不多说,直接上干货! hive的元数据存储在/user/hadoop/warehouse Impala的内部表也在/user/hadoop/warehouse. 那两者怎么区分,看前面的第一列. 下面 ...
- Kinect 开发 —— WaveHand
基本注释都写了,就不废话了 <Window x:Class="KinectBasicHandTrackingFrameworkTest.MainWindow" xmlns=& ...
- 教你win7解除阻止程序运行怎么操作
教你win7解除阻止程序运行怎么操作 来源:http://www.windows7en.com/jiaocheng/27594.html 有时候我下载的软件,被win7系统禁止了运行了时软件不能使用, ...
- Hirens Boot DVD 15.2 功能恢复版 v1.1 -- 制作U盘启动盘
Hirens Boot DVD 15.2 功能恢复版 v1.1 这个版本比 Hirens Boot DVD 15.2 功能要多,在正式版本中缺少的商业工具这个版本都包含了,所以这个应用程序被称为恢复版 ...
- read()方法读取的是一个字节,为什么返回是int,而不是byte
因为字节输入流可以操作任意类型的文件,比如图片音频等,这些文件底层都是以二进制形式的存储的,如果每次读取都返回byte,有可能在读到中间的时候遇到111111111 那 ...
- ReactJs 入门DEMO(转自别人)
附件是分享的一些他人的ReactJs入门DEMO,以前版本使用的是JSXTransformer.js,新版的用browser.min.js替代了. DEMO 下载地址:http://files.cnb ...
- 使用缓存Memcache存储更新微信access token
关键字:Memcache access_token 更新 存储 7200 本文介绍如何使用缓存Memcache存储及更新 access token的方法. 一.Access Token access_ ...
- JS / CSS 实现的便签记录本
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...