Dapper如何实现增删改查 Dapper CRUD操作完整指南

18次阅读

Dapper通过Query、Execute等扩展方法配合原生sql实现CRUD,不提供ORM抽象但支持参数化查询、自动对象映射、事务控制及自增ID获取;需注意sql注入防护、影响行数校验与事务一致性。

Dapper如何实现增删改查 Dapper CRUD操作完整指南

Dapper 本身不提供“内置”的增删改查方法,而是通过扩展方法(如 Query、Execute)配合原生 SQL 实现高效、轻量的 CRUD 操作。它不做 ORM 映射层抽象,但用极简方式把 SQL 执行和对象映射封装得非常自然。

查询(Read):用 Query 获取单条或多条数据

Query 是最常用的方法,支持参数化查询,自动映射列名到对象属性(大小写不敏感,支持 [column] 特性)。

  • 查多条:var users = conn.Query(“SELECT * FROM Users WHERE Age > @age”, new { age = 18 });
  • 查单条:var user = conn.QueryFirstOrDefault(“select * FROM Users WHERE Id = @id”, new { id = 1 });
  • 查标量值(如 count):var count = conn.ExecuteScalar(“SELECT COUNT(*) FROM Users”);

插入(Create):用 Execute 执行 INSERT 并获取自增 ID

Execute 返回受影响行数;若主键是数据库自增(如 SQL Server 的 IDENTITY),可用 SCOPE_IDENTITY() 获取刚插入的 ID。

  • 普通插入:conn.Execute(“INSERT intO Users (Name, Email) VALUES (@name, @email)”, new { name = “张三”, email = “zhang@example.com” });
  • 带返回 ID:var id = conn.QuerySingle(“INSERT INTO Users (Name, Email) VALUES (@name, @email); SELECT CAST(SCOPE_IDENTITY() as int)”, new { name = “李四”, email = “li@example.com” });

更新与删除(Update / delete):统一用 Execute + 参数化 SQL

Update 和 Delete 都属于“执行无结果集”的操作,全部走 Execute 方法,强调参数安全和影响行数校验。

  • 更新:int rows = conn.Execute(“UPDATE Users SET Name = @name WHERE Id = @id”, new { name = “王五”, id = 1 }); if (rows == 0) throw new InvalidOperationException(“未找到要更新的记录”);
  • 删除:int deleted = conn.Execute(“DELETE FROM Users WHERE Id = @id”, new { id = 1 });
  • 软删除建议:UPDATE Users SET IsDeleted = 1 WHERE Id = @id —— Dapper 不管业务逻辑,只负责执行你写的 SQL。

批量操作与事务:用 Transaction 包裹多个 CRUD

Dapper 不封装批量插入(如 BulkInsert),但可轻松结合事务保证一致性。SQL Server 可搭配 sqlserverBulkCopy,或用 union ALL / 表值参数等原生方式。

  • 事务示例:using var tx = conn.BeginTransaction(); try { conn.Execute(“INSERT…”, new {…}, tx); conn.Execute(“UPDATE…”, new {…}, tx); tx.Commit(); } catch { tx.Rollback(); throw; }
  • 批量插入技巧(非 Dapper 原生):拼接多值 INSERT(适合几百条以内),或用 DataTable + SqlBulkCopy(需额外引用 System.Data.SqlClient 或 microsoft.Data.SqlClient)。

基本上就这些。Dapper 的 CRUD 不复杂但容易忽略细节——比如不加参数化易被注入,不检查 Execute 返回值可能掩盖更新失败,不配事务导致数据不一致。写清楚 SQL,交给 Dapper 去执行和映射,就是它最稳的用法。

text=ZqhQzanResources