Dapper是一个用于.NET的简单的对象映射,并且在速度上有着轻ORM之王的称号。

Dapper扩展IDbConnection,提供有用的扩展方法来查询数据库。

那么Dapper是怎样工作的呢?

总共三步:

  • 创建一个IDbConnection对象
  • 写一个语句来执行CRUD操作
  • 传递语句作为Execute方法的一个参数

因为这篇文章主要是为了学习其中一些方法的使用,所以,这里不再叙述安装等的一些使用,有需要的同学可以参考:https://dapper-tutorial.net/dapper

1.Execute

Execute是可以被IDbConnection类型的任何对象调用的扩展方法。它可以执行一个命令一次或者很多次,并且返回受影响的行数。

这个方法可以用于执行:

  • 存储过程(Stored Procedure)
  • 插入语句(INSERT statement)
  • 更新语句(UPDATE statement)
  • 删除语句(DELETE statement)

下面的表格,展示了Execute方法的参数

这里给出一个实现代码的示例,其余部分直接在官网上的示例上面记录学习。

using Dapper;
using System;
using System.Data.SqlClient;
using System.Runtime.Serialization; namespace Dapper_Demo
{ public class Customer
{
public int ID { get; set; } public string Name { get; set; } public string About { get; set; } public DateTime UpdateDate { get; set; } }
class Program
{
private static readonly string connectionString = @"Data Source = 127.0.0.1;Initial Catalog = DapperDemo;User Id = sa;Password = 111111;";
static void Main(string[] args)
{
Console.WriteLine("Hello World!"); var customer = new Customer { ID = , Name = "jack", About = "jack hh", UpdateDate = DateTime.Now }; var Insertsql = @"insert into Customer values(@ID,@Name,@About,@UpdateDate)"; using(var connection=new System.Data.SqlClient.SqlConnection(connectionString))
{
var affectedRows = connection.Execute(Insertsql,customer);
Console.WriteLine(affectedRows);
} Console.ReadKey();
}
}
}

注意,在使用之前,可以nuget程序集引入Dapper和System.Data.SqlClient

下面的部分是官方代码记录学习。

 1.1 执行存储过程

单次(Single)

执行一次存储过程

string sql = "Invoice_Insert";

using (var connection = My.ConnectionFactory())
{
var affectedRows = connection.Execute(sql,
new {Kind = InvoiceKind.WebInvoice, Code = "Single_Insert_1"},
commandType: CommandType.StoredProcedure); My.Result.Show(affectedRows);
}

多次(Many)

执行存储过程多次。数组列表中的每个对象执行一次

string sql = "Invoice_Insert";

using (var connection = My.ConnectionFactory())
{
var affectedRows = connection.Execute(sql,
new[]
{
new {Kind = InvoiceKind.WebInvoice, Code = "Many_Insert_1"},
new {Kind = InvoiceKind.WebInvoice, Code = "Many_Insert_2"},
new {Kind = InvoiceKind.StoreInvoice, Code = "Many_Insert_3"}
},
commandType: CommandType.StoredProcedure
); My.Result.Show(affectedRows);
}

1.2 执行插入

单次(Single)

执行一次插入语句

string sql = "INSERT INTO Customers (CustomerName) Values (@CustomerName);";

using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
{
var affectedRows = connection.Execute(sql, new {CustomerName = "Mark"}); Console.WriteLine(affectedRows); var customer = connection.Query<Customer>("Select * FROM CUSTOMERS WHERE CustomerName = 'Mark'").ToList(); FiddleHelper.WriteTable(customer);
}

多次(Many)

执行多次插入语句。数组列表中的每个对象执行一次

string sql = "INSERT INTO Customers (CustomerName) Values (@CustomerName);";

using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
{
connection.Open(); var affectedRows = connection.Execute(sql,
new[]
{
new {CustomerName = "John"},
new {CustomerName = "Andy"},
new {CustomerName = "Allan"}
}
); Console.WriteLine(affectedRows);

1.3 执行更新

单次(Single)

执行一次更新语句

string sql = "UPDATE Categories SET Description = @Description WHERE CategoryID = @CategoryID;";

using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
{
var affectedRows = connection.Execute(sql,new {CategoryID = , Description = "Soft drinks, coffees, teas, beers, mixed drinks, and ales"}); Console.WriteLine(affectedRows);
}

多次(Many)

执行多次更新语句。数组列表中的每个对象执行一次

string sql = "UPDATE Categories SET Description = @Description WHERE CategoryID = @CategoryID;";

using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
{
var affectedRows = connection.Execute(sql,
new[]
{
new {CategoryID = , Description = "Soft drinks, coffees, teas, beers, mixed drinks, and ales"},
new {CategoryID = , Description = "Cheeses and butters etc."}
}
); Console.WriteLine(affectedRows);

1.4 执行删除

单次(Single)

执行一次删除语句

string sql = "DELETE FROM Customers WHERE CustomerID = @CustomerID";

using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
{
var affectedRows = connection.Execute(sql, new {CustomerID = }); Console.WriteLine(affectedRows);
}

多次(Many)

执行多次删除语句。数组列表中的每个对象执行一次

string sql = "DELETE FROM OrderDetails WHERE OrderDetailID = @OrderDetailID";

using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
{
var affectedRows = connection.Execute(sql,
new[]
{
new {OrderDetailID = },
new {OrderDetailID = },
new {OrderDetailID = }
}
); Console.WriteLine(affectedRows);

1.5 场景说明

对于上面的execute方法在执行少量数据时,比较合适;但是如果执行数据量太大,速度就会很慢,就不适用了。下面会有对于大数据量的操作方法。

下面给出使用excute在执行批量插入数据时的一些结果。

代码如下:

 using Dapper;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Runtime.Serialization; namespace Dapper_Demo
{ public class Customer
{
public int ID { get; set; } public string Name { get; set; } public string About { get; set; } public DateTime UpdateDate { get; set; } }
class Program
{
private static readonly string connectionString = @"Data Source = 127.0.0.1;Initial Catalog = DapperDemo;User Id = sa;Password = 111111;";
static void Main(string[] args)
{
Console.WriteLine("Hello World!"); var list = new List<Customer>();
for(int i = ; i < ; i++)
{
var customer = new Customer { ID = i, Name = "jack"+i, About = "jack hh"+i, UpdateDate = DateTime.Now };
list.Add(customer);
} var Insertsql = @"insert into Customer values(@ID,@Name,@About,@UpdateDate)"; var stopWatch = new Stopwatch();
stopWatch.Start();
using(var connection=new System.Data.SqlClient.SqlConnection(connectionString))
{
var affectedRows = connection.Execute(Insertsql,list);
Console.WriteLine(affectedRows);
}
stopWatch.Stop();
Console.WriteLine("花费的时间:" + stopWatch.ElapsedMilliseconds); Console.ReadKey();
}
}
}

插入100条数据

插入500条数据

插入1000条数据

可以看出当数据量逐渐增大时,execute方法就不太适用了。

2. Query 

这个方法使用来执行查询和映射结果的。

它的结果可以映射到:

  • Anonymous
  • Strongly Typed
  • Multi-Mapping(One to One)
  • Multi-Mapping(One to Many)
  • Multi-Type

可以执行的参数

2.1 Query Anonymous

Query方法可以执行原生 SQL 查询并且映射结果到动态集合

string sql = "SELECT TOP 10 * FROM OrderDetails";

using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
{
var orderDetail = connection.Query(sql).FirstOrDefault(); FiddleHelper.WriteTable(orderDetail);
}

2.2 Query Strongly Typed

Query方法可以执行原生 SQL 查询并且映射结果到强类型集合

string sql = "SELECT TOP 10 * FROM OrderDetails";

using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
{
var orderDetails = connection.Query<OrderDetail>(sql).ToList(); Console.WriteLine(orderDetails.Count); FiddleHelper.WriteTable(orderDetails);
}

2.3 Query Multi-Mapping(One to One)

Query方法可以执行原生 SQL 查询并且用一对一的关系映射结果到强类型集合

string sql = "SELECT * FROM Invoice AS A INNER JOIN InvoiceDetail AS B ON A.InvoiceID = B.InvoiceID;";

using (var connection = My.ConnectionFactory())
{
connection.Open(); var invoices = connection.Query<Invoice, InvoiceDetail, Invoice>(
sql,
(invoice, invoiceDetail) =>
{
invoice.InvoiceDetail = invoiceDetail;
return invoice;
},
splitOn: "InvoiceID")
.Distinct()
.ToList();
}

2.4 Query Multi-Mapping (One to Many)

Query方法可以执行原生 SQL 查询并且用一对多的关系映射结果到强类型集合

string sql = "SELECT TOP 10 * FROM Orders AS A INNER JOIN OrderDetails AS B ON A.OrderID = B.OrderID;";

using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
{
var orderDictionary = new Dictionary<int, Order>(); var list = connection.Query<Order, OrderDetail, Order>(
sql,
(order, orderDetail) =>
{
Order orderEntry; if (!orderDictionary.TryGetValue(order.OrderID, out orderEntry))
{
orderEntry = order;
orderEntry.OrderDetails = new List<OrderDetail>();
orderDictionary.Add(orderEntry.OrderID, orderEntry);
} orderEntry.OrderDetails.Add(orderDetail);
return orderEntry;
},
splitOn: "OrderID")
.Distinct()
.ToList(); Console.WriteLine(list.Count); FiddleHelper.WriteTable(list);
FiddleHelper.WriteTable(list.First().OrderDetails);
}

2.5 Query Multi-Type

Query方法可以执行原生 SQL 查询并且映射结果到有多个类型的集合

string sql = "SELECT * FROM Invoice;";

using (var connection = My.ConnectionFactory())
{
connection.Open(); var invoices = new List<Invoice>(); using (var reader = connection.ExecuteReader(sql))
{
var storeInvoiceParser = reader.GetRowParser<StoreInvoice>();
var webInvoiceParser = reader.GetRowParser<WebInvoice>(); while (reader.Read())
{
Invoice invoice; switch ((InvoiceKind) reader.GetInt32(reader.GetOrdinal("Kind")))
{
case InvoiceKind.StoreInvoice:
invoice = storeInvoiceParser(reader);
break;
case InvoiceKind.WebInvoice:
invoice = webInvoiceParser(reader);
break;
default:
throw new Exception(ExceptionMessage.GeneralException);
} invoices.Add(invoice);
}
} My.Result.Show(invoices);
}

Dapper学习(一)之Execute和Query的更多相关文章

  1. Dapper学习(三)之其他用法

    这里说的其他用法,是指 Async,Buffered,Transaction,Stored Procedure. 1. 首先 dapper支持异步 ExecuteAsync, QueryAsync, ...

  2. dapper 学习

    上一篇, 提到Query<Test>查询的时候, 如果Test中包含自定义class, Dapper不会给自定义class完成映射, 而是直接给null, 其实是可以实现的, 答案就在下面 ...

  3. [React + GraphQL] Use useLazyQuery to manually execute a query with Apollo React Hooks

    When using useQuery from Apollo React Hooks, the request will be sent automatically after the compon ...

  4. Dapper学习(二)之Query相关

    0. FIrst , Single & Default 使用这个方法时要小心,First 和 Single 是不同的. 这里,对这个表做下说明: 如果使用 First , 当没有查到元素时,会 ...

  5. .net Dapper 学习系列(1) ---Dapper入门

    目录 写在前面 为什么选择Dapper 在项目中安装Dapper 在项目中使用Dapper 在项目中使用Dapper 进行单表增删改数据操作 总结 写在前面 Dapper 是一款轻量级ORM架构.为解 ...

  6. .net Dapper 学习系列(2) ---Dapper进阶

    目录 写在前面 前期准备 Dapper 单表批量添加 在Dapper 多表查询 在Dapper 调用存储过程 在Dapper 使用QueryMultiple进行多表查询 在Dapper 使用事务进行多 ...

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

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

  8. Dapper学习 - Dapper的基本用法(二) - 存储过程/函数

    上一篇貌似少介绍了自定义函数和存储过程, 因为这两个也可以使用查询的方式来实现功能, 这一篇就补上 一.自定义函数的创建和调用 (mysql的) Delimiter $$ drop function ...

  9. [C#]Dapper学习笔记

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

随机推荐

  1. Django Windows+IIS+wfastcgi 环境下部署

    教程基于 Windows 10专业版 + Python3.6 + IIS + wfastcgi 之上部署Django2.2的,同样适用于Windows server2012服务器和Windows7及以 ...

  2. Alpha2项目的测试

    这个作业属于哪个课程 课程的链接 这个作业的要求在哪里 作业要求的链接 团队名称 西柚三剑客 这个作业的目标 -测试其他团队的作品,并进行体验总结 姓名 学号 团队名称 段小刚 20173106231 ...

  3. XLM论文原理解析

    1. 前言 近一年来,NLP领域发展势头强劲,从ELMO到LSTM再到去年最牛叉的Google Bert,在今年年初,Facebook又推出了XLM模型,在跨语言预训练领域表现抢眼.实验结果显示XLM ...

  4. Rust中的Vector类型

    常用类型操作, 如python中的list,turple,dictory等, 更方常编程常用数据的处理. fn main() { let v = vec![, , , , ]; let third: ...

  5. 什么是微信小程序?简单介绍

    1.微信小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有色的使用体验. 2.手机端App的另外一种新的展现形式 3.无需下载过多占用手机内存的app,小程序直接打开 ...

  6. Nginx内置变量以及日志格式变量

    $args #请求中的参数值$query_string #同 $args$arg_NAME #GET请求中NAME的值$is_args #如果请求中有参数,值为"?",否则为空字符 ...

  7. python预科前三天:计算器知识、Python下载和安装、Pycharm下载安装激活设置、解释型和编译型、git、思维导图、显示隐藏文件、隐藏已知文件扩展名、创建组织、创建项目、提交作业、排BUG技巧

    1.计算机组成结构:CPU.硬盘.内存.输入输出设备.主板.电源. 2.硬件之间的协作关系:是CPU运算完后给操作系统.专业术语叫指令. 3.键盘输入a之后发生的事情:键盘-CPU-操作系统-显卡-显 ...

  8. Spring Cloud微服务安全实战_4-2_常见的微服务安全整体架构

    这个图适用于中小公司的微服务架构 微服务:SpringBoot 写的Rest服务 服务注册与发现:微服务所必备的.每个微服务都会到上边去注册.不管是微服务之间的调用,还是服务网关到微服务的转发,都是通 ...

  9. Apex 小知识:SOQL 在循环中的应用

    两种在循环中引用 SOQL 的方法 第一种方法: List<Account> accounts = [SELECT Id FROM Account WHERE NumberOfEmploy ...

  10. vue动画效果出现重叠,并且出现滚动条

    背景 使用 vue 结合 animated css 第三方动画样式,简单地给页面组件加上切换时的 fade 淡入/淡出动画效果 当调试效果时发现,展示效果出现了问题,并且出现滚动条 原因 退场动画还没 ...