Dapper.NET 简介
Dapper.NET 是一个轻量级、高性能的对象关系映射(ORM)库,它基于 ADO.NET 进行封装,提供了更简洁和高效的数据访问方式。Dapper 主要用于在 .NET 应用程序中执行 SQL 查询并将结果映射到对象上,同时保持了 ADO.NET 的灵活性和原生 SQL 语句的执行效率。

Dapper 的特点
高性能:Dapper 被称为“微 ORM”,在查询速度上接近原生 ADO.NET。
轻量级:仅作为扩展方法工作,不会干预你的数据库访问逻辑。
简单易用:使用直接的 SQL 语句进行查询和操作,而不会强制你使用复杂的映射或模型。
支持多种数据库:兼容 SQL Server、MySQL、PostgreSQL、SQLite、Oracle 等数据库。
支持参数化查询:有效防止 SQL 注入,提高安全性。
支持多表映射(Multi-Mapping):可轻松实现多个对象之间的关系映射。
Dapper 基本使用示例
1. 安装 Dapper
首先,在 .NET 项目中安装 Dapper,使用 NuGet 命令:
Install-Package Dapper
2. 连接数据库
Dapper 依赖 ADO.NET 的 IDbConnection,常用 SqlConnection 连接 SQL Server。
using System;
using System.Data;
using System.Data.SqlClient;
using Dapper;
class Program
{
static void Main()
{
string connectionString = "YourConnectionStringHere"; // 替换成你的数据库连接字符串
using (IDbConnection db = new SqlConnection(connectionString))
{
db.Open(); // 打开数据库连接
Console.WriteLine("数据库连接成功!");
}
}
}
3. 查询数据
3.1 查询单个对象
使用QueryFirstOrDefault<T>()方法执行查询,返回第一个结果(若无结果则返回 null)。使用 参数化查询(@UserId),防止 SQL 注入。
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
}
using (IDbConnection db = new SqlConnection(connectionString))
{
string sql = "SELECT Id, Name, Email FROM Users WHERE Id = @UserId";
User user = db.QueryFirstOrDefault<User>(sql, new { UserId = 1 });
Console.WriteLine($"ID: {user.Id}, Name: {user.Name}, Email: {user.Email}");
}
3.2 查询多个对象
Query<T>() 返回 IEnumerable<T>,可通过 .ToList() 转换为 List<T>。
using (IDbConnection db = new SqlConnection(connectionString))
{
string sql = "SELECT Id, Name, Email FROM Users";
var users = db.Query<User>(sql).ToList();
foreach (var user in users)
{
Console.WriteLine($"ID: {user.Id}, Name: {user.Name}");
}
}
4. 插入数据
使用Execute()方法执行非查询 SQL 语句(INSERT/UPDATE/DELETE)。@Name 和 @Email 通过匿名对象传入,Dapper 会自动匹配 SQL 语句中的参数。
string insertSql = "INSERT INTO Users (Name, Email) VALUES (@Name, @Email)";
using (IDbConnection db = new SqlConnection(connectionString))
{
int rowsAffected = db.Execute(insertSql, new { Name = "Alice", Email = "alice@example.com" });
Console.WriteLine($"插入 {rowsAffected} 条记录");
}
5. 更新数据
string updateSql = "UPDATE Users SET Email = @Email WHERE Id = @Id";
using (IDbConnection db = new SqlConnection(connectionString))
{
int rowsAffected = db.Execute(updateSql, new { Email = "newemail@example.com", Id = 1 });
Console.WriteLine($"更新 {rowsAffected} 条记录");
}
6. 删除数据
string deleteSql = "DELETE FROM Users WHERE Id = @Id";
using (IDbConnection db = new SqlConnection(connectionString))
{
int rowsAffected = db.Execute(deleteSql, new { Id = 2 });
Console.WriteLine($"删除 {rowsAffected} 条记录");
}
7. 多表查询(多对象映射)
7.1 一对一映射
例如,一个 Order 关联一个 User:
public class Order
{
public int Id { get; set; }
public string Product { get; set; }
public User Customer { get; set; }
}
string sql = @"SELECT o.Id, o.Product, u.Id, u.Name, u.Email
FROM Orders o
INNER JOIN Users u ON o.UserId = u.Id";
using (IDbConnection db = new SqlConnection(connectionString))
{
var orders = db.Query<Order, User, Order>(
sql,
(order, user) => { order.Customer = user; return order; },
splitOn: "Id").ToList();
foreach (var order in orders)
{
Console.WriteLine($"Order: {order.Product}, Customer: {order.Customer.Name}");
}
}
Query<T1, T2, TResult>()方法允许你查询多个表,并手动映射数据。splitOn: "Id" 告诉 Dapper 从 Id 列开始解析 User 对象的数据。
8. 存储过程调用
传入 commandType: CommandType.StoredProcedure 指定执行存储过程。适用于复杂 SQL 逻辑,提升性能。
using (IDbConnection db = new SqlConnection(connectionString))
{
var parameters = new { UserId = 1 };
var user = db.QueryFirstOrDefault<User>("GetUserById", parameters, commandType: CommandType.StoredProcedure);
Console.WriteLine($"用户: {user.Name}");
}
总结
Dapper 是一个高效、灵活的微 ORM,适用于需要高性能 SQL 查询的 .NET 项目。
它的主要特点包括:
- 轻量级,无需复杂配置。
- 直接执行 SQL 语句,简单易用。
- 提供参数化查询,防止 SQL 注入。
- 支持多表查询和存储过程调用。
在实际开发中,Dapper 可用于 小型项目或需要高效数据库操作的应用,而大型项目则可结合 EF Core 使用,以提高开发效率。