告别ORM臃肿!2025年最实用的Dapper实战教程
【免费下载链接】Dapper 项目地址: https://gitcode.com/gh_mirrors/dappe/dapper-dot-net
还在为ORM框架的性能问题发愁?Dapper作为轻量级ORM框架,以其卓越性能和简洁API成为.NET开发者的首选。本文精选实战教程,从基础查询到高级事务,助你掌握Dapper核心技能,代码量减少40%,性能提升3倍。
1. 快速入门:10分钟搭建Dapper环境
安装与配置
通过NuGet安装Dapper核心包:
Install-Package Dapper -Version 2.1.35
基础查询示例:
using (var connection = new SqlConnection("Server=.;Database=Test;Trusted_Connection=True;"))
{
var users = connection.Query<User>("SELECT * FROM Users").ToList();
}
核心代码位于Dapper/SqlMapper.cs,支持.NET Standard 2.0及以上版本。
2. CRUD操作:使用Dapper.Rainbow简化数据访问
Dapper.Rainbow提供开箱即用的CRUD接口,定义实体类后自动映射数据库操作:
public class MyDatabase : Database<MyDatabase>
{
public Table<User> Users { get; set; }
public Table<Post> Posts { get; set; }
}
// 插入数据
var db = new MyDatabase { Connection = connection };
var userId = db.Users.Insert(new User { Name = "用户名称", Email = "user@example.com" });
完整教程见Dapper.Rainbow/readme.md,支持SQL Server、MySQL等主流数据库。
3. 动态SQL构建:使用SqlBuilder拼接复杂查询
处理多条件筛选时,SqlBuilder可安全拼接SQL片段:
var builder = new SqlBuilder()
.Where("CreateTime > @Start", new { Start = DateTime.Now.AddDays(-7) })
.OrderBy("ViewCount DESC");
if (!string.IsNullOrEmpty(keyword))
{
builder.AndWhere("Title LIKE @Keyword", new { Keyword = $"%{keyword}%" });
}
var template = builder.AddTemplate("SELECT * FROM Articles /**where**/ /**orderby**/");
var articles = connection.Query<Article>(template.RawSql, template.Parameters);
实现代码位于Dapper.SqlBuilder/SqlBuilder.cs,自动处理参数化防止SQL注入。
4. 多表关联:使用Multi-Mapping映射复杂对象
一次查询关联多个实体:
var sql = @"
SELECT p.*, u.*
FROM Posts p
JOIN Users u ON p.UserId = u.Id";
var posts = connection.Query<Post, User, Post>(
sql,
(post, user) => { post.Author = user; return post; },
splitOn: "Id"
).ToList();
支持1对1、1对多关系映射,示例测试代码见tests/Dapper.Tests/MultiMapTests.cs。
5. 事务处理:确保数据一致性
使用事务包装多步操作:
using (var transaction = connection.BeginTransaction())
{
try
{
var orderId = connection.ExecuteScalar<int>(
"INSERT INTO Orders (UserId) VALUES (@UserId); SELECT SCOPE_IDENTITY()",
new { UserId = 1 },
transaction
);
connection.Execute(
"INSERT INTO OrderItems (OrderId, ProductId, Quantity) VALUES (@OrderId, @ProductId, @Quantity)",
new List<OrderItem> { /* 订单项列表 */ },
transaction
);
transaction.Commit();
}
catch
{
transaction.Rollback();
throw;
}
}
事务测试案例见tests/Dapper.Tests/TransactionTests.cs。
6. 批量操作:使用Execute方法高效插入数据
批量插入1000条记录仅需30ms:
var products = Enumerable.Range(1, 1000).Select(i => new Product {
Name = $"商品{i}",
Price = i * 10.0m
}).ToList();
var affectedRows = connection.Execute(
"INSERT INTO Products (Name, Price) VALUES (@Name, @Price)",
products
);
性能测试数据显示,Dapper批量插入速度是EF Core的5倍以上(见benchmarks/Dapper.Tests.Performance/Benchmarks.cs)。
7. 存储过程调用:与现有数据库架构集成
执行存储过程并处理输出参数:
var p = new DynamicParameters();
p.Add("@UserId", 1);
p.Add("@TotalOrders", dbType: DbType.Int32, direction: ParameterDirection.Output);
connection.Execute("GetUserOrderStats", p, commandType: CommandType.StoredProcedure);
var totalOrders = p.Get<int>("@TotalOrders");
支持输入/输出参数、返回值等完整功能,示例见tests/Dapper.Tests/ProcedureTests.cs。
8. 类型处理:自定义数据类型映射
实现JSON字段与对象的自动转换:
public class JsonTypeHandler<T> : SqlMapper.TypeHandler<T>
{
public override void SetValue(IDbDataParameter parameter, T value)
{
parameter.Value = JsonSerializer.Serialize(value);
parameter.DbType = DbType.String;
}
public override T Parse(object value)
{
return JsonSerializer.Deserialize<T>((string)value);
}
}
// 注册处理器
SqlMapper.AddTypeHandler(new JsonTypeHandler<Dictionary<string, object>>());
内置支持Geometry、Xml等特殊类型,见Dapper.EntityFramework/Handlers.cs。
9. 异步操作:提升应用响应性能
所有核心API均提供异步版本:
// 异步查询
var users = await connection.QueryAsync<User>("SELECT * FROM Users");
// 异步执行
var affected = await connection.ExecuteAsync(
"UPDATE Users SET LastLogin = @Now WHERE Id = @Id",
new { Now = DateTime.Now, Id = 1 }
);
异步实现位于Dapper/SqlMapper.Async.cs,遵循.NET异步编程最佳实践。
10. 性能优化:缓存与批处理策略
启用查询缓存减少重复编译开销:
// 全局启用缓存
SqlMapper.Settings.CacheProvider = new DefaultCacheProvider();
// 单次查询启用缓存
var products = connection.Query<Product>(
"SELECT * FROM Products WHERE CategoryId = @CategoryId",
new { CategoryId = 5 },
commandFlags: CommandFlags.NoCache // 禁用特定查询缓存
);
缓存实现见Dapper/SqlMapper.CacheInfo.cs,支持自定义缓存提供器。
学习资源与社区支持
- 官方文档:Readme.md
- 单元测试示例:tests/Dapper.Tests/
- 性能基准数据:benchmarks/Dapper.Tests.Performance/
- 社区讨论:Stack Overflow "dapper"标签
掌握这些技能后,你将能以最低的性能损耗处理各种数据访问场景。收藏本文,关注项目更新,下期将带来"分布式事务与Dapper的集成方案"。
【免费下载链接】Dapper 项目地址: https://gitcode.com/gh_mirrors/dappe/dapper-dot-net
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



