ESP32-S3通用嵌入式开发板设计与工程实践
2026/3/20 3:45:26
【免费下载链接】Dapper项目地址: https://gitcode.com/gh_mirrors/dapper3/Dapper
还在为传统ORM的复杂配置和性能瓶颈而烦恼?Dapper作为Stack Overflow团队开发的轻量级ORM解决方案,以其极简设计和卓越性能,正在重新定义.NET数据访问体验。本文将带你从实际痛点出发,通过完整实战案例,掌握Dapper的高效应用技巧。
传统ORM框架虽然功能强大,但在高并发场景下往往面临以下挑战:
Dapper正是为解决这些问题而生,它通过扩展ADO.NET连接,提供直观的SQL操作接口,让数据库访问回归本质。
Dapper的核心优势在于其轻量级架构,直接操作SQL语句,避免了传统ORM的额外抽象层。根据性能测试数据:
| 操作类型 | Dapper响应时间 | 传统ORM响应时间 | 性能提升 |
|---|---|---|---|
| 单条查询 | 133.73 μs | 265.45 μs | 约98% |
| 批量插入 | 450.21 μs | 1200.50 μs | 约166% |
| 复杂映射 | 280.15 μs | 550.30 μs | 约96% |
Dapper提供直观的查询方法,大幅降低学习成本:
// 基础查询示例 using var connection = new SqlConnection(connectionString); var users = connection.Query<User>("SELECT * FROM Users WHERE Active = @Active", new { Active = true });需求场景:处理用户注册、登录验证和资料查询
public class UserService { private readonly string _connectionString; public UserService(string connectionString) { _connectionString = connectionString; } // 用户注册 - 异步操作 public async Task<int> RegisterUserAsync(User user) { using var connection = new SqlConnection(_connectionString); var sql = @"INSERT INTO Users (Username, Email, PasswordHash, CreatedAt) VALUES (@Username, @Email, @PasswordHash, @CreatedAt); SELECT CAST(SCOPE_IDENTITY() as int)"; return await connection.QuerySingleAsync<int>(sql, user); } // 用户登录验证 public async Task<User> AuthenticateUserAsync(string username, string password) { using var connection = new SqlConnection(_connectionString); var sql = @"SELECT * FROM Users WHERE Username = @Username AND PasswordHash = @PasswordHash"; return await connection.QueryFirstOrDefaultAsync<User>(sql, new { Username = username, PasswordHash = HashPassword(password) }); } }需求场景:实现文章列表分页、详情查看和关联作者信息
public class ArticleService { // 分页查询文章列表 public async Task<(List<Article> Articles, int TotalCount)> GetArticlesPagedAsync(int page, int pageSize) { using var connection = new SqlConnection(_connectionString); // 使用QueryMultiple处理多结果集 using var results = await connection.QueryMultipleAsync(@" SELECT COUNT(*) FROM Articles WHERE Status = 'Published'; SELECT * FROM Articles WHERE Status = 'Published' ORDER BY PublishDate DESC OFFSET @Offset ROWS FETCH NEXT @PageSize ROWS ONLY", new { Offset = (page - 1) * pageSize, PageSize = pageSize }); var totalCount = await results.ReadSingleAsync<int>(); var articles = (await results.ReadAsync<Article>()).ToList(); return (articles, totalCount); } // 多表关联查询 - 文章详情含作者信息 public async Task<ArticleDetail> GetArticleDetailAsync(int articleId) { using var connection = new SqlConnection(_connectionString); var sql = @" SELECT a.*, u.Username, u.DisplayName, u.AvatarUrl FROM Articles a INNER JOIN Users u ON a.AuthorId = u.Id WHERE a.Id = @ArticleId"; return await connection.QueryFirstOrDefaultAsync<ArticleDetail>(sql, new { ArticleId = articleId }); } }// 动态参数构建 - 支持复杂条件 public async Task<List<Product>> SearchProductsAsync(ProductSearchCriteria criteria) { using var connection = new SqlConnection(_connectionString); var parameters = new DynamicParameters(); var whereClauses = new List<string>(); if (!string.IsNullOrEmpty(criteria.Keyword)) { whereClauses.Add("(Name LIKE @Keyword OR Description LIKE @Keyword)"); parameters.Add("Keyword", $"%{criteria.Keyword}%"); } if (criteria.MinPrice.HasValue) { whereClauses.Add("Price >= @MinPrice"); parameters.Add("MinPrice", criteria.MinPrice.Value); } if (criteria.CategoryIds?.Any() == true) { whereClauses.Add("CategoryId IN @CategoryIds"); parameters.Add("CategoryIds", criteria.CategoryIds); } var sql = $"SELECT * FROM Products {string.Join(" AND ", whereClauses)}"; return (await connection.QueryAsync<Product>(sql, parameters)).ToList(); }// 批量插入优化 - 避免循环单条插入 public async Task BulkInsertOrdersAsync(List<Order> orders) { using var connection = new SqlConnection(_connectionString); // 使用事务确保数据一致性 using var transaction = await connection.BeginTransactionAsync(); try { var sql = @"INSERT INTO Orders (UserId, TotalAmount, OrderDate) VALUES (@UserId, @TotalAmount, @OrderDate)"; await connection.ExecuteAsync(sql, orders, transaction); await transaction.CommitAsync(); } catch { await transaction.RollbackAsync(); throw; } }// 自定义缓存控制 public class CustomDapperSettings { public static void Configure() { // 设置命令超时时间 SqlMapper.Settings.CommandTimeout = 30; // 定期清理缓存 Task.Run(async () => { while (true) { await Task.Delay(TimeSpan.FromMinutes(30)); SqlMapper.PurgeQueryCache(); } }); } }错误做法:
// 直接拼接IN条件 - 存在SQL注入风险 var ids = string.Join(",", productIds); var sql = $"SELECT * FROM Products WHERE Id IN ({ids})";正确解决方案:
// Dapper自动处理IN查询参数化 var products = connection.Query<Product>( "SELECT * FROM Products WHERE Id IN @ProductIds", new { ProductIds = productIds });错误做法:
// 一次性加载所有数据 var allProducts = connection.Query<Product>("SELECT * FROM Products").ToList();正确解决方案:
// 使用非缓冲查询 var products = connection.Query<Product>("SELECT * FROM LargeProductsTable", buffered: false);错误做法:
// 手动处理复杂映射关系 // 代码冗长且易出错正确解决方案:
// 使用Dapper的多重映射功能 var sql = @" SELECT p.*, c.* FROM Products p LEFT JOIN Categories c ON p.CategoryId = c.Id"; var products = connection.Query<Product, Category, Product>( sql, (product, category) => { product.Category = category; return product; }, splitOn: "Id");通过本文的10个性能优化秘诀,你已经掌握了Dapper在实际项目中的应用精髓。总结Dapper的核心优势:
立即实践以下步骤,让你的数据访问层性能得到质的提升:
Dapper不仅是技术工具,更是提升开发效率和系统性能的战略选择。开始你的Dapper优化之旅,体验高效数据访问带来的技术红利!
【免费下载链接】Dapper项目地址: https://gitcode.com/gh_mirrors/dapper3/Dapper
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考