Dapper是.NET生态中轻量高效的ORM框架,它基于ADO.NET封装,既保留了原生ADO.NET的性能优势,又简化了数据库操作的复杂度,实现增删改查是Dapper最基础也最常用的功能。
Dapper环境准备
使用Dapper前需要先引入对应的NuGet包,在Visual Studio中右键项目选择管理NuGet程序包,搜索Dapper安装即可,当前最新稳定版本适配.NET Framework和.NET Core全系列。
同时需要准备对应的数据库上下文,这里以SQL Server为例,先创建数据库连接对象:
using System.Data; using System.Data.SqlClient; using Dapper; // 数据库连接字符串,实际开发建议放在配置文件中 string connectionString = "Server=127.0.0.1;Database=TestDB;Uid=sa;Pwd=123456;"; // 创建连接对象 IDbConnection connection = new SqlConnection(connectionString);
基础增删改查实现
1. 新增操作(Create)
新增操作可以使用Execute方法,传入插入SQL和对应的参数对象即可,Dapper会自动将对象的属性映射到SQL参数。
首先定义对应的实体类:
public class User
{
public int Id { get; set; }
public string UserName { get; set; }
public int Age { get; set; }
public string Email { get; set; }
}
执行新增的代码:
// 插入单条数据
string insertSql = "INSERT INTO [User] (UserName, Age, Email) VALUES (@UserName, @Age, @Email)";
User newUser = new User
{
UserName = "张三",
Age = 25,
Email = "zhangsan@ipipp.com"
};
// Execute方法返回受影响的行数
int affectedRows = connection.Execute(insertSql, newUser);
Console.WriteLine($"新增成功,受影响行数:{affectedRows}");
// 批量插入
List<User> userList = new List<User>
{
new User { UserName = "李四", Age = 28, Email = "lisi@ipipp.com" },
new User { UserName = "王五", Age = 30, Email = "wangwu@ipipp.com" }
};
int batchAffectedRows = connection.Execute(insertSql, userList);
Console.WriteLine($"批量新增成功,受影响行数:{batchAffectedRows}");
2. 查询操作(Read)
查询操作使用Query或者QueryFirstOrDefault等方法,Dapper会自动将查询结果映射到对应的实体对象。
// 查询所有数据
string queryAllSql = "SELECT Id, UserName, Age, Email FROM [User]";
List<User> allUsers = connection.Query<User>(queryAllSql).ToList();
Console.WriteLine($"总用户数:{allUsers.Count}");
// 根据条件查询单条数据
string queryByIdSql = "SELECT Id, UserName, Age, Email FROM [User] WHERE Id = @Id";
User user = connection.QueryFirstOrDefault<User>(queryByIdSql, new { Id = 1 });
if (user != null)
{
Console.WriteLine($"查询到用户:{user.UserName},年龄:{user.Age}");
}
// 带参数的条件查询
string queryByAgeSql = "SELECT Id, UserName, Age, Email FROM [User] WHERE Age > @MinAge";
List<User> ageUsers = connection.Query<User>(queryByAgeSql, new { MinAge = 25 }).ToList();
Console.WriteLine($"年龄大于25的用户数:{ageUsers.Count}");
3. 修改操作(Update)
修改操作和新增类似,使用Execute方法执行更新SQL即可。
string updateSql = "UPDATE [User] SET UserName = @UserName, Age = @Age, Email = @Email WHERE Id = @Id";
User updateUser = new User
{
Id = 1,
UserName = "张三更新",
Age = 26,
Email = "zhangsan_update@ipipp.com"
};
int updateRows = connection.Execute(updateSql, updateUser);
Console.WriteLine($"修改成功,受影响行数:{updateRows}");
4. 删除操作(Delete)
删除操作同样使用Execute方法,传入删除SQL和对应参数。
// 删除单条数据
string deleteSql = "DELETE FROM [User] WHERE Id = @Id";
int deleteRows = connection.Execute(deleteSql, new { Id = 2 });
Console.WriteLine($"删除成功,受影响行数:{deleteRows}");
// 批量删除
string batchDeleteSql = "DELETE FROM [User] WHERE Age < @MaxAge";
int batchDeleteRows = connection.Execute(batchDeleteSql, new { MaxAge = 20 });
Console.WriteLine($"批量删除成功,受影响行数:{batchDeleteRows}");
进阶用法说明
存储过程调用
Dapper也支持直接调用存储过程,只需要指定命令类型为存储过程即可。
// 调用存储过程查询用户
string procSql = "GetUserByAge";
List<User> procUsers = connection.Query<User>(procSql, new { MinAge = 25 }, commandType: CommandType.StoredProcedure).ToList();
事务处理
如果需要保证多个操作的原子性,可以使用事务,Dapper的事务基于ADO.NET的事务实现。
using (IDbTransaction transaction = connection.BeginTransaction())
{
try
{
string insertSql = "INSERT INTO [User] (UserName, Age, Email) VALUES (@UserName, @Age, @Email)";
string updateSql = "UPDATE [User] SET Age = Age + 1 WHERE UserName = @UserName";
connection.Execute(insertSql, new User { UserName = "赵六", Age = 22, Email = "zhaoliu@ipipp.com" }, transaction);
connection.Execute(updateSql, new { UserName = "张三" }, transaction);
// 提交事务
transaction.Commit();
Console.WriteLine("事务执行成功");
}
catch (Exception ex)
{
// 回滚事务
transaction.Rollback();
Console.WriteLine($"事务执行失败:{ex.Message}");
}
}
注意事项
- 使用完连接对象后建议及时关闭或者释放,避免连接池耗尽,建议使用using包裹连接对象
- SQL参数尽量使用匿名对象或者实体对象传递,避免SQL注入风险
- 如果查询的字段名和实体属性名不一致,可以使用
AS关键字在SQL中重命名字段,或者使用[Column]特性标注实体属性 - 批量操作如果数据量较大,建议分批次执行,避免单次操作耗时过长