Loading

Dapper简介(一)

一、什么是Dapper?

  Dapper是一个用于.NET的简单的映射器,由Stack Overflow背后的团队创建的一个micro-ORM,在速度方面上有着micro-ORM之王的称号。ORM是一个对象关系映射器,负责在数据库和编程语言之间进行映射。

  • Dapper是一个流行、开源的对象关系映射(ORM)库。
  • 通过将对象映射到数据库中的表,可以轻松地处理应用程序中的数据。
  • Dapper快速、可靠。
  • 使用简单,并且具有许多特性。

 

二、Dapper如何工作的?

  Dapper提供了一种简单而简洁的方式来管理数据模型,不需要编写大量代码。容易使用,代码干净易读。

  Dapper通过提供有用的扩展方法来扩展IDbConnection接口以查询数据库。它使用动态方法生成,使其能够直接从查询结果扩展POCOs。此外,它允许您将数据库列直接映射到POCO上的属性。

  在使用Dapper时,您只需要一个连接字符串和一个POCO,然后是一个三步过程。

  • 创建一个IDbConnection对象。
  • 编写一个查询来执行CRUD操作。 
  • 将查询作为参数传递到任何Execute或query方法中。 

 

三、Dapper的安装

  1、使用Nuget包管理工具下载,直接点击安装就完事

  2.或者下载github上的Dapper项目:https://github.com/DapperLib/Dapper

 

四、Dapper有哪些方法?

  • Execute:  执行一个命令一次或多次。
  • ExecuteReader: 它可以执行命令并返回读取器。
  • Executescalar: 它可以执行一个命令并返回一个标量值。
  • Query: 用于从数据库中获取数据。
  • QueryFirst: 它可以执行查询并映射第一个结果。
  • QueryFirstOrDefault: 它可以执行查询并映射第一个结果,如果序列不包含元素,则使用默认值。
  • QuerySingle: 它可以执行查询并映射第一个结果,如果序列中恰好没有一个元素,则抛出异常。
  • QuerySingleOrDefault: 它可以执行查询并映射第一个结果,或者如果序列为空则使用默认值;如果序列中有多个元素,此方法将引发异常。
  • QueryMultiple: 它可以在同一个命令中执行多个查询并映射结果。

  举个栗子:

string sqlOrderDetails = "SELECT TOP 5 * FROM OrderDetails;";
string sqlOrderDetail = "SELECT * FROM OrderDetails WHERE OrderDetailID = @OrderDetailID;";
string sqlCustomerInsert = "INSERT INTO Customers (CustomerName) Values (@CustomerName);";

using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
{
    var orderDetails = connection.Query<OrderDetail>(sqlOrderDetails).ToList();
    var orderDetail = connection.QueryFirstOrDefault<OrderDetail>(sqlOrderDetail, new {OrderDetailID = 1});
    var affectedRows = connection.Execute(sqlCustomerInsert,  new {CustomerName = "Mark"});

    Console.WriteLine(orderDetails.Count);
    Console.WriteLine(affectedRows);

    FiddleHelper.WriteTable(orderDetails);
    FiddleHelper.WriteTable(new List<OrderDetail>() { orderDetail });
}

 

五、Dapper支持的参数类型

  • Anonymous: 对于不需要创建单独的类来表示数据的简单查询非常有用。
  • Dynamic: 在需要创建参数的动态列表或需要动态更改参数的值时非常有用。
  • List: 这允许您通过使用列表在IN子句中指定多个参数。
  • String: 在使用接受varchar输入参数的SQL Server存储过程时非常有用。

  举个栗子:

// Anonymous
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,
    parameter,
    commandType: CommandType.StoredProcedure);

int rowCount = parameter.Get<int>("@RowCount");

// 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: 允许您以匿名类型存储SQL查询的结果。
  • Strongly Typed: 允许您以强类型方式存储SQL查询的结果。
  • Multi-Mapping: 将结果映射到具有关系的强类型列表。
  • Multi-Result: 在同一个命令中执行多个查询并映射结果
  • Multi-Type: 执行查询并将结果映射到不同类型的列表。

  举个栗子:

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

using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
{
    var anonymousList = connection.Query(sqlOrderDetails).ToList();
    var orderDetails = connection.Query<OrderDetail>(sqlOrderDetails).ToList();

    Console.WriteLine(anonymousList.Count);
    Console.WriteLine(orderDetails.Count);

    FiddleHelper.WriteTable(orderDetails);

    FiddleHelper.WriteTable(connection.Query(sqlOrderDetails).FirstOrDefault());
}

 

七、其他更多功能

  此外,为了能够在到服务器的一次往返中执行多条语句,Dapper还提供了一些额外的功能,可以在某些场景中极大地提高性能。

  • Async: Dapper还提供扩展方法的Async(异步)版本
  • Buffered: 缓冲查询一次返回整个阅读器
  • Transaction: 支持事务和TransactionScope
  • 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);

 

 

 

以上内容全部抄自https://dapper-tutorial.net/dapper

posted @ 2022-11-14 16:00  六弦汤姆  阅读(109)  评论(0编辑  收藏  举报