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

Dapper 本身不提供“内置”的增删改查方法,而是通过扩展方法(如 Query、Execute)配合原生 SQL 实现高效、轻量的 CRUD 操作。它不做 ORM 映射层抽象,但用极简方式把 SQL 执行和对象映射封装得非常自然。
查询(Read):用 Query 获取单条或多条数据
Query
- 查多条: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 去执行和映射,就是它最稳的用法。










