Dapper 是基于 ADO.NET 的轻量级 ORM,提供 LINQ 风格 SQL 查询与自动对象映射,不替代 ADO.NET 而是封装其连接与执行能力,支持单对象查询、多结果集、增删改及事务管理,强调手写 SQL、类型安全与连接可控。

Dapper 是一个极简、高性能的 .NET 对象关系映射(ORM)库,它不替代 ADO.NET,而是在其之上提供一层轻量封装,让你用 LINQ 风格写 SQL 查询,同时几乎不损失原生 ADO.NET 的性能。 它不是全自动 ORM(比如 EF Core 那样能自动生成表、跟踪变更),而是“你掌控 SQL,它帮你映射”,所以快、可控、无魔法。
安装与基础配置
在项目中通过 NuGet 安装 Dapper:
- 打开包管理器控制台,运行:Install-Package Dapper
- 确保已引用 System.Data 和对应数据库驱动(如 Microsoft.Data.SqlClient for SQL Server)
- Dapper 是扩展方法库,所有功能都挂在 IDbConnection 上,所以你得先有打开的连接
最简查询:单对象映射
假设你有数据库表 Users(Id, Name, Email) 和对应类:
public class User { public int Id { get; set; } public string Name { get; set; } public string Email { get; set; } }查询单个用户只需三步:
- 创建并打开数据库连接(推荐用 using 确保释放)
- 调用 QueryFirstOrDefault
执行带参数的 SQL - Dapper 自动按属性名匹配列名(大小写不敏感)
示例代码:
using (var conn = new SqlConnection(connectionString))
{
conn.Open();
var user = conn.QueryFirstOrDefault("SELECT * FROM Users WHERE Id = @id", new { id = 1 });
// user 就是映射好的对象
}
批量操作与多结果集
Dapper 支持一次执行多个 SQL 并返回不同类型的多个结果集,用 QueryMultiple:
- 适合主从表(如订单 + 订单明细)一次性查出,避免 N+1
- 用 Read
() 分别读取每个结果集 - 注意:SQL 中用分号分隔多个语句,且必须按顺序读取
示例:
using (var conn = new SqlConnection(connectionString))
{
conn.Open();
using var multi = conn.QueryMultiple(
"SELECT * FROM Orders WHERE UserId = @uid; SELECT * FROM OrderItems WHERE OrderId IN (SELECT Id FROM Orders WHERE UserId = @uid)",
new { uid = 123 });
var orders = multi.Read().ToList();
var items = multi.Read().ToList();
}
插入、更新、删除与事务
Dapper 不提供 SaveChanges 类机制,增删改都用 Execute 方法:
- Execute() 返回影响行数(int),适合 INSERT/UPDATE/DELETE
- 事务需手动管理:用 BeginTransaction() + Commit()/Rollback()
- 批量插入可用 Execute 配合循环,或搭配 SqlMapper.AddTypeHandler 自定义类型处理
插入示例:
using (var conn = new SqlConnection(connectionString))
{
conn.Open();
using var tx = conn.BeginTransaction();
try
{
conn.Execute("INSERT INTO Users (Name, Email) VALUES (@name, @email)",
new { name = "张三", email = "zhang@example.com" }, tx);
tx.Commit();
}
catch
{
tx.Rollback();
throw;
}
}
基本上就这些。Dapper 的核心理念是:**写 SQL,不绕弯;信类型,不猜映射;控连接,不交托管**。上手快、踩坑少、性能稳——尤其适合中大型项目里对数据层有明确诉求、不愿被 ORM 抽象绑架的团队。











