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