Dapper 是一个轻量级的、高效的对象关系映射器(ORM,Object-Relational Mapping)库,由 Stack Overflow 开发并开源。它的设计目标是简单、高效,同时保持灵活性。Dapper 可以显著减少在 .NET 应用程序中操作数据库所需的手动编码量,同时保持高性能。
主要特点
-
轻量级:
- Dapper 的核心功能非常精简,只有几百行代码,因此它的性能非常高。
- 它没有像 Entity Framework 那样的大量元数据和复杂的上下文管理,使得初始化和使用都非常快。
-
高效:
- Dapper 使用编译后的委托来执行 SQL 查询和参数化插入,这使得它的性能非常接近于直接使用 ADO.NET。
- 它支持异步操作,可以在高并发场景下保持良好的性能。
-
灵活:
- Dapper 不强制你使用特定的数据模型或数据库上下文,你可以自由地选择如何管理和操作数据。
- 它支持多种数据库,包括 SQL Server、MySQL、PostgreSQL、SQLite 和 Oracle 等。
-
易用性:
- Dapper 的 API 非常简洁,易于理解和使用。
- 它提供了丰富的扩展方法,可以轻松地执行各种数据库操作。
基本用法
安装 Dapper
你可以通过 NuGet 包管理器安装 Dapper:
dotnet add package Dapper
示例代码
以下是一个简单的示例,展示了如何使用 Dapper 进行数据库操作。
1. 引入命名空间
using Dapper;
using System.Data.SqlClient;
2. 定义数据模型
public class User
{public int Id { get; set; }public string Name { get; set; }public string Email { get; set; }
}
3. 查询数据
public async Task<List<User>> GetUsersAsync()
{using (var connection = new SqlConnection("your_connection_string")){var users = await connection.QueryAsync<User>("SELECT * FROM Users");return users.ToList();}
}
4. 插入数据
public async Task<int> InsertUserAsync(User user)
{using (var connection = new SqlConnection("your_connection_string")){var sql = "INSERT INTO Users (Name, Email) VALUES (@Name, @Email); SELECT SCOPE_IDENTITY();";var id = await connection.ExecuteScalarAsync<int>(sql, user);return id;}
}
5. 更新数据
public async Task UpdateUserAsync(User user)
{using (var connection = new SqlConnection("your_connection_string")){var sql = "UPDATE Users SET Name = @Name, Email = @Email WHERE Id = @Id";await connection.ExecuteAsync(sql, user);}
}
6. 删除数据
public async Task DeleteUserAsync(int userId)
{using (var connection = new SqlConnection("your_connection_string")){var sql = "DELETE FROM Users WHERE Id = @Id";await connection.ExecuteAsync(sql, new { Id = userId });}
}
多表查询
Dapper 还支持多表查询,并且可以自动映射结果到多个对象。
public async Task<List<User>> GetUsersWithOrdersAsync()
{using (var connection = new SqlConnection("your_connection_string")){var sql = @"SELECT u.Id, u.Name, u.Email, o.OrderId, o.OrderDateFROM Users uLEFT JOIN Orders o ON u.Id = o.UserId";var users = new List<User>();var lookup = await connection.QueryAsync<User, Order, User>(sql,(user, order) =>{User u = users.FirstOrDefault(u => u.Id == user.Id) ?? user;if (u.Orders == null){u.Orders = new List<Order>();}if (order != null){u.Orders.Add(order);}return u;},splitOn: "OrderId");users = lookup.Distinct().ToList();return users;}
}
总结
Dapper 是一个非常强大的工具,特别适合那些需要高性能和灵活性的应用程序。它不仅可以显著减少代码量,还可以提高应用程序的性能。如果你正在寻找一个轻量级的 ORM 解决方案,Dapper 绝对值得尝试。