Trong phát triển ứng dụng .NET, việc truy cập cơ sở dữ liệu cần cân bằng giữa hiệu năng và tính dễ sử dụng. Dapper, framework ORM tối giản do đội ngũ Stack Overflow xây dựng, cung cấp tốc độ gần bằng ADO.NET gốc với API đơn giản, giúp loại bỏ rào cản của các ORM toàn diện.
Ưu điểm chính của Dapper
- Hiệu năng tối đa: Tận dụng cơ chế sinh phương thức động và bộ nhớ đệm
- Thiết kế trực quan: Chỉ cần 3-5 dòng code cho thao tác cơ bản
- Kiểm soát SQL tuyệt đối: Tránh truy vấn phức tạp tự sinh
Bắt đầu với Dapper
dotnet add package Dapper
Ví dụ truy vấn cơ bản
using var conn = new SqlConnection(dbConnection);
var records = conn.Query<Item>(
"SELECT Id, Title FROM Catalog WHERE Category = @cat",
new { cat = "Electronics" }
).ToList();
Quản lý tham số và giao dịch
using var tx = conn.BeginTransaction();
try
{
conn.Execute(
"INSERT INTO Inventory (ItemCode, Stock) VALUES (@code, @qty)",
new { code = "ITEM_101", qty = 50 },
tx
);
conn.Execute(
"UPDATE Stocks SET Available = Available - @qty",
new { qty = 50 },
tx
);
tx.Commit();
}
catch
{
tx.Rollback();
throw;
}
Tối ưu hiệu năng
- Quản lý kết nối: Tái sử dụng SqlConnection trong chu kỳ sống ứng dụng
- Thao tác hàng loạt: Sử dụng Execute cho nhiều bản ghi
- Chế độ bất đồng bộ: Dùng QueryAsync/ExecuteAsync cho xử lý song song
| Tiêu chí |
Dapper |
Entity Framework |
| Hiệu năng |
⭐⭐⭐⭐⭐ |
⭐⭐⭐ |
| Độ phức tạp |
⭐⭐ |
⭐⭐⭐⭐ |
| Điều khiển SQL |
⭐⭐⭐⭐⭐ |
⭐⭐ |
Tính năng nâng cao
Truy vấn đa kết quả
var results = conn.QueryMultiple(
"SELECT * FROM Users WHERE ID = @id; SELECT * FROM Purchases WHERE UserID = @id",
new { id = 1024 }
);
var user = results.ReadSingle<UserProfile>();
var purchases = results.Read<Purchase>().ToList();
Định nghĩa ánh xạ tùy chỉnh
SqlMapper.SetTypeMap(
typeof(ProductItem),
new CustomPropertyTypeMap(
typeof(ProductItem),
(type, colName) => type.GetProperties()
.FirstOrDefault(p => p.GetCustomAttribute<ColumnNameAttribute>()
?.Name == colName
)
)
);
Câu hỏi thường gặp
- Q: Dapper hỗ trợ cơ sở dữ liệu nào?
- A: Tất cả hệ thống ADO.NET-compatible: SQL Server, MySQL, PostgreSQL, SQLite
- Q: Làm sao xử lý truy vấn phức tạp?
- A: Sử dụng QueryMultiple hoặc gọi trực tiếp stored procedures
- Q: Có hỗ trợ bất đồng bộ không?
- A: Có, bao gồm QueryAsync, ExecuteAsync