Dapper是一种轻量级的ORM(对象关系映射)工具,它提供了高效且易于使用的方式来执行数据库操作。
Dapper是由Stack Overflow团队开发并维护的,它的主要目标是提供比EF更快、更直接的方式访问数据库。
Dapper的主要特点包括:
基于纯ADO.NET而不是EF,因此性能更高
支持多种数据库,如SQL Server、MySQL、Oracle等
通过使用动态SQL和强类型参数,可以有效地减少代码量
提供了多种简单易用的方法,在大多数情况下,只需一两行代码就可以完成常见的CRUD操作
接下来,我们将详细介绍如何使用Dapper进行数据库操作。
一、安装Dapper:
Dapper可以通过NuGet包管理器安装。打开Visual Studio,选择“项目”菜单下的“管理NuGet程序包”,在搜索栏中输入“Dapper”,然后点击“安装”按钮即可。
你也可以手动在项目中添加以下引用:
using Dapper; using System.Data.SqlClient;
二、连接数据库
在使用Dapper之前,我们需要先连接数据库。Dapper支持多种数据库,本文以SQL Server为例。
创建一个 SqlConnection 对象,然后使用该对象打开数据库连接。
string connectionString = "your connection string"; using (var connection = new SqlConnection(connectionString)) { connection.Open(); // 这里执行数据库操作 }
三、执行查询操作
Dapper提供了多种方法来执行查询操作。其中,最常见的方法是 Query 和 QueryFirstOrDefault。
Query
Query 方法返回一个包含查询结果的 IEnumerable<T>(T为查询结果映射的类型)。
var products = connection.Query<Product>("SELECT * FROM Products"); foreach (var product in products) { // 处理查询结果 }
如果你需要使用参数化查询,可以像下面这样使用命名参数:
var products = connection.Query<Product>("SELECT * FROM Products WHERE CategoryId = @CategoryId", new { CategoryId = 1 }); foreach (var product in products) { // 处理查询结果 }
或者使用匿名对象:
var parameters = new { CategoryId = 1 }; var products = connection.Query<Product>("SELECT * FROM Products WHERE CategoryId = @CategoryId", parameters); foreach (var product in products) { // 处理查询结果 }
QueryFirstOrDefault
QueryFirstOrDefault 方法返回一个单个实体对象,如果未找到任何记录,则返回 null。
var product = connection.QueryFirstOrDefault<Product>("SELECT * FROM Products WHERE Id = @Id", new { Id = 1 }); if (product != null) { // 处理查询结果 }
QueryMultiple
如果你需要一次性执行多个查询语句,可以使用 QueryMultiple 方法。该方法返回一个 SqlMapper.GridReader 对象,通过该对象可以依次获取各个查询语句的结果。
以下示例中,我们首先执行两个查询语句,获取商品和商品分类的数据。然后,我们使用 Read 方法分别获取这两个结果集,并将它们转换为实体对象列表。
var multi = connection.QueryMultiple("SELECT * FROM Products; SELECT * FROM Categories"); var products = multi.Read<Product>().ToList(); var categories = multi.Read<Category>().ToList();
四、执行插入、更新和删除操作
Dapper还提供了多种方法来执行插入、更新和删除操作。其中,最常见的方法是 Execute 和 ExecuteScalar。
Execute
Execute 方法返回受影响行数。
var rowsAffected = connection.Execute("INSERT INTO Products (Name, Price) VALUES (@Name, @Price)", new { Name = "Product 1", Price = 9.99m });
你也可以使用命名参数或匿名对象:
var parameters = new { Name = "Product 1", Price = 9.99m }; var rowsAffected = connection.Execute("INSERT INTO Products (Name, Price) VALUES (@Name, @Price)", parameters);
ExecuteScalar
ExecuteScalar方法返回一个单一的值,通常用于执行插入操作并返回插入记录的主键。
var productId = connection.ExecuteScalar<int>("INSERT INTO Products (Name, Price) VALUES (@Name, @Price); SELECT CAST(SCOPE_IDENTITY() as int)", new { Name = "Product 2", Price = 19.99m });
与 Query 和 Execute 方法一样,你也可以使用命名参数或匿名对象。
对象映射
Dapper支持自动将查询结果映射到实体对象上。在使用Dapper时,我们需要确保查询语句中的列名与实体类的属性名相对应。
以下是一个简单的示例:
public class Product { public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } } // 查询商品数据 var products = connection.Query<Product>("SELECT Id, Name, Price FROM Products");
注意,如果查询语句中的列名与实体类的属性名不匹配,则无法自动映射。此时,你需要手动指定映射关系。
以下是一个手动映射的示例:
public class Product { public int ProductId { get; set; } public string ProductName { get; set; } public decimal ProductPrice { get; set; } } // 查询商品数据 var products = connection.Query<Product>("SELECT Id as ProductId, Name as ProductName, Price as ProductPrice FROM Products");
总结
Dapper是一种简单易用、高效的ORM工具,它提供了多种方法来执行数据库操作,能够满足大多数开发人员的需求。在使用Dapper时,我们需要先连接数据库,然后使用 Query、QueryFirstOrDefault、QueryMultiple、Execute 或 ExecuteScalar 等方法执行相应的数据库 操作。同时,Dapper还支持自动将查询结果映射到实体对象上,从而进一步简化了代码编写。