Dapper实用教程

简介: Dapper是什么?  Dpper是一款.Net平台简单(Simple)的对象映射库,并且Dapper拥有着“微型ORM之王”的称号。就速度而言与手写ADO.NET SqlDateReader相同。ORM是Object Relational Mapper的缩写,代表着数据库与编程语言之间的映射。

Dapper是什么?

  Dpper是一款.Net平台简单(Simple)的对象映射库,并且Dapper拥有着“微型ORM之王”的称号。就速度而言与手写ADO.NET SqlDateReader相同。ORM是Object Relational Mapper的缩写,代表着数据库与编程语言之间的映射。

  Dapper的基本特性是通过扩展IDbConnection 接口,并为其提供查询数据库的方法。

Dapper是如何工作的?

  将大象装冰箱总共分三步,Dapper也是如此。

  1. 创建IDBConnection对象(例如:SqlConnection)
  2. 编写用于CRUD的Sql语句
  3. 将Sql语句当作参数纯如执行操作的方法

安装

  通过NuGet安装:https://www.nuget.org/packages/Dapper

  PM> Install-Package Dapper

方法表

  Dapper会用多个方法去扩展IDBConnection接口

  • Execute
  • Query
  • QueryFirst
  • QueryFirstOrDefault
  • QuerySingle
  • QuerySingleOrDefault
  • QueryMultiple
string sqlInvoices = "SELECT * FROM Invoice;";
string sqlInvoice = "SELECT * FROM Invoice WHERE InvoiceID = @InvoiceID;";
string sp = "EXEC Invoice_Insert";

using (var connection = My.ConnectionFactory())
{
    var invoices = connection.Query<Invoice>(sqlInvoices).ToList();
    var invoice = connection.QueryFirstOrDefault(sqlInvoice, new {InvoiceID = 1});
    var affectedRows = connection.Execute(sp, new { Param1 = "Single_Insert_1" }, commandType: CommandType.StoredProcedure);
}

参数表

  有多种不同的方式给“查询(例如:select)”和“执行(例如:delete、update、insert)”方法传递参数

  • Anonymous
  • Dynamic
  • List
  • String
// 匿名类对象(相对比较常用)
var affectedRows = connection.Execute(sql,
                    new {Kind = InvoiceKind.WebInvoice, Code = "Single_Insert_1"},
                    commandType: CommandType.StoredProcedure);

// Dynamic
DynamicParameters parameter = new DynamicParameters();

parameter.Add("@Kind", InvoiceKind.WebInvoice, DbType.Int32, ParameterDirection.Input);
parameter.Add("@Code", "Many_Insert_0", DbType.String, ParameterDirection.Input);
parameter.Add("@RowCount", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);

connection.Execute(sql,
    new {Kind = InvoiceKind.WebInvoice, Code = "Single_Insert_1"},
    commandType: CommandType.StoredProcedure);

// List
connection.Query<Invoice>(sql, new {Kind = new[] {InvoiceKind.StoreInvoice, InvoiceKind.WebInvoice}}).ToList();

// String
connection.Query<Invoice>(sql, new {Code = new DbString {Value = "Invoice_1", IsFixedLength = false, Length = 9, IsAnsi = true}}).ToList();

结果集

  查询方法的返回值可以映射成多种类型

  • Anonymous
  • Strongly Typed
  • Multi-Mapping
  • Multi-Result
  • Multi-Type
string sql = "SELECT * FROM Invoice;";

using (var connection = My.ConnectionFactory())
{
    connection.Open();

    var anonymousList = connection.Query(sql).ToList();
    var invoices = connection.Query<Invoice>(sql).ToList();
}

Utilities

  • Async
  • Buffered
  • Transaction
  • Stored Procedure
// Async
connection.QueryAsync<Invoice>(sql)

// Buffered
connection.Query<Invoice>(sql, buffered: false)

// Transaction
using (var transaction = connection.BeginTransaction())
{
    var affectedRows = connection.Execute(sql,
        new {Kind = InvoiceKind.WebInvoice, Code = "Single_Insert_1"},
        commandType: CommandType.StoredProcedure,
        transaction: transaction);

    transaction.Commit();
}

// Stored Procedure
var affectedRows = connection.Execute(sql,
    new {Kind = InvoiceKind.WebInvoice, Code = "Single_Insert_1"},
    commandType: CommandType.StoredProcedure);

执行非查询语句

 

描述

你可以从任意实现IDbConnection的类对象中调用Dapper的扩展方法“Execute”。它能够执行一条命令(Command)一次或者多次,并返回受影响的行数。这个方法通常用来执行:

  • Stored Procedure
  • INSERT statement
  • UPDATE statement
  • DELETE statement

参数

下面表格中显示了Execute方法的不同参数

 

名称 描述
sql

要执行的sql语句文本

param

command的参数

transaction

事务

commandTimeout

command超时时间

commandType

command类型

示例:执行存储过程

单次

执行存储过程一次

string sql = "EXEC Invoice_Insert";

using (var connection = My.ConnectionFactory())
{
    connection.Open();

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

    My.Result.Show(affectedRows);
}

多次

执行存储过程多次,数组中的每条数据都执行一次

string sql = "EXEC Invoice_Insert";

using (var connection = My.ConnectionFactory())
{
    connection.Open();

    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); }

示例:执行插入

单次

执行插入语句一次

 

string sql = "INSERT INTO Invoice (Code) Values (@Code);";

using (var connection = My.ConnectionFactory())
{
    connection.Open();

    var affectedRows = connection.Execute(sql, new {Kind = InvoiceKind.WebInvoice, Code = "Single_Insert_1"});

    My.Result.Show(affectedRows);
}

多次

执行多次,数组中的每条数据都执行一次

 

string sql = "INSERT INTO Invoice (Code) Values (@Code);";

using (var connection = My.ConnectionFactory())
{
    connection.Open();

    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"} } ); My.Result.Show(affectedRows); }

示例:执行Update

单次

执行Update语句一次

string sql = "UPDATE Invoice SET Code = @Code WHERE InvoiceID = @InvoiceID";

using (var connection = My.ConnectionFactory())
{
    connection.Open();

    var affectedRows = connection.Execute(sql, new {InvoiceID = 1, Code = "Single_Update_1"});

    My.Result.Show(affectedRows);
}

多次

执行多次,数组中的每条数据都执行一次

string sql = "UPDATE Invoice SET Code = @Code WHERE InvoiceID = @InvoiceID";

using (var connection = My.ConnectionFactory())
{
    connection.Open();

    var affectedRows = connection.Execute(sql,
        new[]
        {
            new {InvoiceID = 1, Code = "Many_Update_1"},
            new {InvoiceID = 2, Code = "Many_Update_2"}, new {InvoiceID = 3, Code = "Many_Update_3"} }); My.Result.Show(affectedRows); }

示例:执行Delete

单次

执行Delete语句一次

string sql = "DELETE FROM Invoice WHERE InvoiceID = @InvoiceID";

using (var connection = My.ConnectionFactory())
{
    connection.Open();

    var affectedRows = connection.Execute(sql, new {InvoiceID = 1});

    My.Result.Show(affectedRows);
}

多次

执行多次,数组中的每条数据都执行一次

string sql = "DELETE FROM Invoice WHERE InvoiceID = @InvoiceID";

using (var connection = My.ConnectionFactory())
{
    connection.Open();

    var affectedRows = connection.Execute(sql,
        new[]
        {
            new {InvoiceID = 1},
            new {InvoiceID = 2}, new {InvoiceID = 3} }); }

 

 Dapper Query查询

介绍

查询方法(Query)是IDbConnection的扩展方法,它可以用来执行查询(select)并映射结果到C#实体(Model、Entity)类

查询结果可以映射成如下类型:

  • Anonymous 匿名类型
  • Strongly Typed 强类型
  • Multi-Mapping (One to One) 多映射 一对一
  • Multi-Mapping (One to Many) 多映射 一对多
  • Multi-Type 多类型

 

参数

下面表格中显示了Query方法的不同参数

 

名称 描述
sql

要执行的sql语句文本

param

command的参数

transaction

事务

buffered

True to buffer readeing the results of the query (default = true).

翻译不来。。。

commandTimeout

command超时时间

commandType

command类型

 

示例 - 匿名查询

Raw SQL query can be executed using Query method and map the result to a dynamic list.

直接执行SQL语句字符串,然后将结果映射成 dynamic类型的List中

string sql = "SELECT * FROM Invoice;";

using (var connection = My.ConnectionFactory())
{
    connection.Open();

    var invoices = connection.Query(sql).ToList();
    
    My.Result.Show(invoices);
}

 

 

示例 - 强类型查询(最常用)

直接执行SQL语句字符串,然后将结果映射成强类型类型的List中

string sql = "SELECT * FROM Invoice;";

using (var connection = My.ConnectionFactory())
{
    connection.Open();

    var invoices = connection.Query<Invoice>(sql).ToList();
    
    My.Result.Show(invoices);
}

示例 - 多映射查询 (One to One)

Raw SQL query can be executed using Query method and map the result to a strongly typed list with a one to one relation.(没太理解)

直接执行SQL语句字符串,然后将结果用一对一的关系映射成强类型类型的List中

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(); My.Result.Show(invoices); }

示例 - 查询多映射 (One to Many)

Raw SQL query can be executed using Query method and map the result to a strongly typed list with a one to many relations.

直接执行SQL语句字符串,然后将结果用一对多的关系映射成强类型类型的List中

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

using (var connection = My.ConnectionFactory())
{
    connection.Open();

    var invoiceDictionary = new Dictionary<int, Invoice>();

    var invoices = connection.Query<Invoice, InvoiceItem, Invoice>(
            sql,
            (invoice, invoiceItem) =>
            {
                Invoice invoiceEntry;
                
                if (!invoiceDictionary.TryGetValue(invoice.InvoiceID, out invoiceEntry)) { invoiceEntry = invoice; invoiceEntry.Items = new List<InvoiceItem>(); invoiceDictionary.Add(invoiceEntry.InvoiceID, invoiceEntry); } invoiceEntry.Items.Add(invoiceItem); return invoiceEntry; }, splitOn: "InvoiceID") .Distinct() .ToList(); My.Result.Show(invoices); }

示例 - Query Multi-Type

Raw SQL query can be executed using Query method and map the result to a list of different types.

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 toturial  http://dapper-tutorial.net/dapper

http://dapper-tutorial.net/query

目录
相关文章
|
Cloud Native Linux Go
如何从开源项目中受益?
如何从开源项目中受益?
82 0
|
6月前
|
安全 项目管理 数据库
"揭开Dify社区版神秘面纱:一键部署,体验开源项目管理的革命性突破!"
【8月更文挑战第20天】Dify社区版是一款开源项目管理工具,集成任务跟踪、文档协作等功能,助力团队高效协作。本文引导快速部署体验。需Linux服务器,安装Docker及Docker Compose,并能访问GitHub。从GitHub克隆源码,配置`docker-compose.yml`如数据库设置,运行`docker-compose up -d`启动服务。通过`http://&lt;服务器IP&gt;`访问Web界面,建议配置HTTPS增强安全。定期`git pull`及`docker-compose`命令实现维护升级。Dify以其实用性和灵活性,正成为项目管理领域的新兴力量。
1077 1
|
9月前
|
存储 人工智能 搜索推荐
【LangChain系列】第六篇:内存管理简介及实践
【5月更文挑战第20天】【LangChain系列】第六篇:内存管理简介及实践
252 0
【LangChain系列】第六篇:内存管理简介及实践
|
9月前
|
自然语言处理
分享开源项目Chatwoot
Chatwoot是一个开源的客户支持平台,它提供了一系列工具,使企业能够通过各种渠道(如电子邮件、社交媒体、网站聊天窗口等)与客户进行沟通。它的目标是为企业提供一个统一的界面,汇总来自不同渠道的客户对话,从而提高客户服务效率和效果。
134 0
|
Web App开发 移动开发 JSON
谈一谈|谷歌插件入门
谈一谈|谷歌插件入门
335 0
|
Dubbo Java 中间件
阿里巴巴有哪些好玩的分布式开源框架?
开源项目起初由国外一些工程师发起,最著名的开源社区及私有软件项目的托管平台GitHub,由国外Chris Wanstrath创办从一个开发者社区变成了一个免费开源代码托管平台;国内越来越多的公司把自研的一些优秀开源框架贡献出来,阿里巴巴、腾讯、百度、网易、当当、携程等公司都有在github上开源一些优秀的项目。其中阿里巴巴的的开源项目很多,几乎国内所有公司都用过阿里巴巴的一些项目,耳熟能详的如:druid、fastjson。分布式流行的当下,阿里也有众多分布式开源项目,今天主要搜罗一下阿里分布式开源项目。
344 0
|
消息中间件 存储 设计模式
聊聊如何学习开源项目
工作几年的程序员同学,有了一定的项目经验,对于编程也有了自己的理解,但他们偶尔也会感到困惑,不知道接下来该如何提升自己。 在笔者看来:"这个阶段的程序员最需要的是提升自身编程能力和视野高度,而学习开源项目是最有效的方法之一"。
聊聊如何学习开源项目
|
网络协议 Dubbo Java
开源项目推荐:主流RPC开源框架及知识科普
开源项目推荐:主流RPC开源框架及知识科普
1077 0
开源项目推荐:主流RPC开源框架及知识科普
|
测试技术 uml 开发者
|
SQL 安全 数据库
【快速入门ORM框架之Dapper】大牛勿进系列
原文:【快速入门ORM框架之Dapper】大牛勿进系列 前言:dapper是什么?Dapper是.NET下一个micro的ORM,它和Entity Framework或Nhibnate不同,属于轻量级的,并且是半自动的。
1567 0

热门文章

最新文章