什么是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语句或者存储过程传递参数,也可以很灵活的转换类型。

查漏补缺系列之dapper初体验的更多相关文章

  1. Go语言知识查漏补缺|基本数据类型

    前言 学习Go半年之后,我决定重新开始阅读<The Go Programing Language>,对书中涉及重点进行全面讲解,这是Go语言知识查漏补缺系列的文章第二篇,前一篇文章则对应书 ...

  2. 【Android面试查漏补缺】之事件分发机制详解

    前言 查漏补缺,查漏补缺,你不知道哪里漏了,怎么补缺呢?本文属于[Android面试查漏补缺]系列文章第一篇,持续更新中,感兴趣的朋友可以[关注+收藏]哦~ 本系列文章是对自己的前段时间面试经历的总结 ...

  3. CSS基础面试题,快来查漏补缺

    本文大部分问题来源:50道CSS基础面试题(附答案),外加一些面经. 我对问题进行了分类整理,并给了自己的回答.大部分知识点都有专题链接(来源于本博客相关文章),用于自己前端CSS部分的查漏补缺.虽作 ...

  4. 《CSS权威指南》基础复习+查漏补缺

    前几天被朋友问到几个CSS问题,讲道理么,接触CSS是从大一开始的,也算有3年半了,总是觉得自己对css算是熟悉的了.然而还是被几个问题弄的"一脸懵逼"... 然后又是刚入职新公司 ...

  5. oracle 12c 学习系列(1)–12c初体验

    详见原文博客链接地址: oracle 12c 学习系列(1)–12c初体验

  6. js基础查漏补缺(更新)

    js基础查漏补缺: 1. NaN != NaN: 复制数组可以用slice: 数组的sort.reverse等方法都会改变自身: Map是一组键值对的结构,Set是key的集合: Array.Map. ...

  7. Entity Framework 查漏补缺 (一)

    明确EF建立的数据库和对象之间的关系 EF也是一种ORM技术框架, 将对象模型和关系型数据库的数据结构对应起来,开发人员不在利用sql去操作数据相关结构和数据.以下是EF建立的数据库和对象之间关系 关 ...

  8. 2019Java查漏补缺(一)

    看到一个总结的知识: 感觉很全面的知识梳理,自己在github上总结了计算机网络笔记就很累了,猜想思维导图的方式一定花费了作者很大的精力,特共享出来.原文:java基础思维导图 自己学习的查漏补缺如下 ...

  9. 20165223 week1测试查漏补缺

    week1查漏补缺 经过第一周的学习后,在蓝墨云班课上做了一套31道题的小测试,下面是对测试题中遇到的错误的分析和总结: 一.背记题 不属于Java后继技术的是? Ptyhon Java后继技术有? ...

随机推荐

  1. 在Python中数据类型转换的注意事项

    在学习Python的过程接触到了数据类型转化这一过程,在实践的过程中我发现了一个小问题,我们在平常的使用中要一定注意 在str型转换成int型的过程中,str内的内容必须是整数不然会报错 如图: 在转 ...

  2. 201521123006 《java程序设计》 第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) **1.2 ...

  3. java课程设计——猜数游戏

    1.团队课程设计博客链接 http://www.cnblogs.com/springbreezemiles/p/7064135.html 2.个人负责模块或任务说明 本人任务: 编写主界面以及排行榜代 ...

  4. 二分求最长上升子序列 二分LIS

    #include <iostream> #include <cstring> #define N 50010 using namespace std; int n; int n ...

  5. Elasticsearch 的分页报错 result window is too large

    检查自己分页查询的代码 Pageable pageable = new PageRequest(0, 10000); searchQuery.setPageable(pageable); // 分页效 ...

  6. webpack2进阶之多文件,DLL,以及webpack-merge

    本需要对webpack已有一定的了解,如果你没接触过webpack或者刚刚接触webpack,可以考虑先看一下我的这篇教程. 入门教程 1.打包多文件 之前,当需要打包多个而文件时,我是这么写的: m ...

  7. 用vue开发一个app(2,main.js)

    昨天跟着vue的官网搭建了vue的一个脚手架,我也是第一次用VUE一切都在摸索阶段. 今天试着看下里面脚手架里面有点什么东西 先看看main.js 导入了3个模块 一个vue,一个app,还有rout ...

  8. js 倒计时(服务器时间同步)

    首先说一下,为什么要服务器时间同步, 因为服务器时间和本地电脑时间存在一定的时间差.有些对时效性要求非常高的应用,例如时时彩开奖,是不能容忍这种时间差存在的. 方案1:每次倒计时去服务端请求时间 // ...

  9. C的函数指针与指针函数

    1.函数指针 指向函数的指针.本质是一个指针. 指针变量可以指向变量的地址.数组.字符串.动态分配地址,同时也可指向一个函数,每个函数在编译的时候,系统会分配给该函数一个入口地址,函数名表示这个入口地 ...

  10. Opengl4.5 中文手册—E

    索引 A      B    C      D     E     F     G H      I     J      K     L     M     N O      P    Q      ...