Dapper 是一个轻量级的 ORM(对象关系映射)框架,适用于 C# 和 .NET 环境。它通过扩展 IDbConnection 接口,提供了简洁高效的数据库操作方式,特别适合需要高性能和灵活 SQL 控制的场景。相比 Entity Framework,Dapper 更加简单直接,性能也更高。
1. 安装 Dapper
在项目中使用 Dapper,首先需要通过 NuGet 安装包:
Install-Package Dapper安装完成后,你可以在代码中引用 Dapper 命名空间:
using Dapper;2. 建立数据库连接
Dapper 不提供连接管理,你需要自己创建并管理数据库连接。以 SQL Server 为例:
using (var connection = new SqlConnection("Server=.;Database=TestDB;Integrated Security=true;"))
{
connection.Open();
// 执行 Dapper 操作
}
注意:推荐使用 using 语句确保连接正确释放。
3. 查询数据 - Query 方法
使用 Query
假设有一个 User 表:
CREATE TABLE User (
Id INT IDENTITY PRIMARY KEY,
Name NVARCHAR(50),
Email NVARCHAR(100)
);
对应的实体类:
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
}
查询所有用户:
var users = connection.Query<User>("SELECT * FROM User");
foreach (var user in users)
{
Console.WriteLine($"{user.Id}: {user.Name} - {user.Email}");
}
4. 带参数的查询
避免 SQL 注入,使用参数化查询:
var user = connection.Query<User>(
"SELECT * FROM User WHERE Id = @Id",
new { Id = 1 });
多个参数也可以用匿名对象传入:
var result = connection.Query<User>(
"SELECT * FROM User WHERE Name = @Name AND Email = @Email",
new { Name = "张三", Email = "zhangsan@example.com" });
5. 执行增删改操作 - Execute
插入数据:
var sql = "INSERT INTO User (Name, Email) VALUES (@Name, @Email)";
var rowsAffected = connection.Execute(sql, new { Name = "李四", Email = "lisi@example.com" });
更新数据:
var sql = "UPDATE User SET Email = @Email WHERE Id = @Id";
var rowsAffected = connection.Execute(sql, new { Id = 1, Email = "newemail@example.com" });
删除数据:
var sql = "DELETE FROM User WHERE Id = @Id";
var rowsAffected = connection.Execute(sql, new { Id = 1 });
Execute 返回受影响的行数。
6. 查询单条数据或标量值
获取单个对象:
var user = connection.QueryFirstOrDefault<User>("SELECT * FROM User WHERE Id = @Id", new { Id = 1 });
如果没找到,返回 null(引用类型)或默认值。
查询标量值(如计数):
var count = connection.ExecuteScalar<int>("SELECT COUNT(*) FROM User");
7. 多结果集查询(Multiple Results)
一次执行返回多个结果集,提高性能:
var sql = @"
SELECT * FROM User;
SELECT * FROM Order WHERE UserId = @UserId;";
<p>using (var multi = connection.QueryMultiple(sql, new { UserId = 1 }))
{
var users = multi.Read<User>().ToList();
var orders = multi.Read<Order>().ToList();
}
8. 映射复杂对象(多表关联)
支持将多表查询结果映射到主从对象:
var sql = @"
SELECT u.*, o.*
FROM User u
LEFT JOIN Order o ON u.Id = o.UserId";
<p>var lookup = new Dictionary<int, User>();</p><p>var result = connection.Query<User, Order, User>(sql, (user, order) =>
{
if (!lookup.TryGetValue(user.Id, out var usr))
{
usr = user;
usr.Orders = new List<Order>();
lookup.Add(usr.Id, usr);
}
if (order != null) usr.Orders.Add(order);
return usr;
}, splitOn: "Id");</p><p>var usersWithOrders = lookup.Values;
基本上就这些。Dapper 的核心就是简化 ADO.NET 操作,让你写原生 SQL 的同时,自动映射到对象,不复杂但容易忽略细节比如参数命名和 splitOn 的使用。
