轻量级ORM框架Dapper
- 简介
- 优点
- 使用
- NuGet包管理工具
- GitHub获取源码
- 方法
- 查询
- 新增
- 修改
- 删除
- 存储过程
-
- 事务
- 多映射
-
- 多类型
简介
Dapper是一款轻量级ORM工具,是一个简单的.NET对象映射器,在速度上几乎与使用原始ADO.NET数据读取器的速度一样快。ORM是一个对象关系映射器,它负责数据库和编程语言之间的映射。Dapper通过扩展IDbConnection提供一些有用的扩展方法去查询数据库
优点
- 轻量
- 速度快
- 性能高
- 支持.NET 2.0及以上版本
- 面向SQL,支持多种数据库
- 支持多表并联,可以映射一对一,一对多,多对多等多种关系
使用
NuGet包管理工具
GitHub获取源码
地址:https://github.com/DapperLib/Dapper
下载后将Dapper文件夹Copy到项目中即可
方法
Dapper会用以下几个方法扩展IDbConnection接口
- Execute
Execute可以执行一个或多个命令并返回受影响的行数。此方法通常用于执行:存储过程、insert语句、update语句、delete语句
Execute的参数
| 名称 | 描述 |
|---|
| sql | 要执行的命令 |
| param | 命令参数(默认为null) |
| transaction | 需要使用的事务(默认为null) |
| commandTimeout | 命令执行超时时间(默认为null) |
| commandType | 命令类型(默认为null) |
- ExecuteReader
ExecuteReader通常在Dapper不处理查询的结果时使用。例如,要填充数据表或数据集
ExecuteReader的参数
| 名称 | 描述 |
|---|
| sql | 要执行的命令 |
| param | 命令参数(默认为null) |
| transaction | 需要使用的事务(默认为null) |
| commandTimeout | 命令执行超时时间(默认为null) |
| commandType | 命令类型(默认为null) |
- ExecuteScalar
ExecuteScalar执行查询,并返回查询返回的结果集中第一行的第一列。忽略其他列或行
ExecuteScalar的参数
| 名称 | 描述 |
|---|
| sql | 要执行的命令 |
| param | 命令参数(默认为null) |
| transaction | 需要使用的事务(默认为null) |
| commandTimeout | 命令执行超时时间(默认为null) |
| commandType | 命令类型(默认为null) |
- Query
Query可以执行查询并映射结果。结果可以映射到:匿名类型、强类型、多映射(一对一)、多映射(一对多)、多类型
Query的参数
| 名称 | 作用 |
|---|
| sql | 要执行的命令 |
| param | 命令参数(默认为null) |
| transaction | 需要使用的事务(默认为null) |
| buffered | 是否从缓冲读取查询结果(默认为true) |
| commandTimeout | 命令执行超时时间(默认为null) |
| commandType | 命令类型(默认为null) |
- QueryFirst
QueryFirst可以执行查询并映射第一个结果。结果可以映射到:匿名类型、强类型
QueryFirst的参数
| 名称 | 描述 |
|---|
| sql | 要执行的命令 |
| param | 命令参数(默认为null) |
| transaction | 需要使用的事务(默认为null) |
| commandTimeout | 命令执行超时时间(默认为null) |
| commandType | 命令类型(默认为null) |
- QueryFirstOrDefault
QueryFirstOrDefault可以执行查询并映射第一个结果,如果序列不包含任何元素则为默认值。结果可以映射到:匿名类型、强类型
QueryFirstOrDefault的参数
| 名称 | 描述 |
|---|
| sql | 要执行的命令 |
| param | 命令参数(默认为null) |
| transaction | 需要使用的事务(默认为null) |
| commandTimeout | 命令执行超时时间(默认为null) |
| commandType | 命令类型(默认为null) |
- QuerySingle
QuerySingle可以执行查询并映射第一个结果,如果序列中没有元素则会引发异常。结果可以映射到:匿名类型、强类型
QuerySingle的参数
| 名称 | 描述 |
|---|
| sql | 要执行的命令 |
| param | 命令参数(默认为null) |
| transaction | 需要使用的事务(默认为null) |
| commandTimeout | 命令执行超时时间(默认为null) |
| commandType | 命令类型(默认为null) |
- QuerySingleOrDefault
QuerySingleOrDefault可以执行查询并映射第一个结果,如果序列为空则为默认值。如果序列中有多个元素,则此方法将引发异常。结果可以映射到:匿名类型、强类型
QuerySingleOrDefault的参数
| 名称 | 描述 |
|---|
| sql | 要执行的命令 |
| param | 命令参数(默认为null) |
| transaction | 需要使用的事务(默认为null) |
| commandTimeout | 命令执行超时时间(默认为null) |
| commandType | 命令类型(默认为null) |
- QueryMultiple
QueryMultiple可以在相同的命令和映射结果中执行多个查询。
QueryMultiple的参数
| 名称 | 描述 |
|---|
| sql | 要执行的命令 |
| param | 命令参数(默认为null) |
| transaction | 需要使用的事务(默认为null) |
| commandTimeout | 命令执行超时时间(默认为null) |
| commandType | 命令类型(默认为null) |
查询
using (IDbConnection db = new SqlConnection(DBHelp.ConnStrings))
{
string sql = "select * from Person where last_name=@last_name";
IEnumerable list = db.Query(sql, new { last_name = lastName });
return list.ToList();
}
新增
using (IDbConnection db = new SqlConnection(DBHelp.ConnStrings))
{
string sql = "insert into Person values(@first_name,@last_name,@email,@gender,@createdon);";
int result = db.Execute(sql, person);
return result > 0;
}
修改
using (IDbConnection db = new SqlConnection(DBHelp.ConnStrings))
{
string sql = "update Person set first_name=@first_name,last_name=@last_name,email=@email where id=@id;";
int result = db.Execute(sql, person);
return result > 0;
}
删除
using (IDbConnection db = new SqlConnection(DBHelp.ConnStrings))
{
string sql = "delete from Person where id=@id;";
int result = db.Execute(sql, new { id = ID });
return result > 0;
}
存储过程
无参
using (IDbConnection db = new SqlConnection(DBHelp.ConnStrings))
{
IEnumerable list = db.Query("dbo.P_Person", null, null, true, null, CommandType.StoredProcedure);
return list.ToList();
}
有参
using (IDbConnection db = new SqlConnection(DBHelp.ConnStrings))
{
var p = new DynamicParameters();
p.Add("@first_name", name);
p.Add("@gender", sex);
p.Add("@countNum", 0, DbType.Int32, ParameterDirection.Output);
db.Execute("dbo.P_PersonParams", p, null, null, CommandType.StoredProcedure);
return p.Get("@countNum");
}
事务
using (IDbConnection db = new SqlConnection(DBHelp.ConnStrings))
{
db.Open();
IDbTransaction trans = db.BeginTransaction();
try
{
string sql = "delete from Person where id=@id";
db.Execute(sql, new { id = ID }, trans, null, null);
trans.Commit();
return true;
}
catch (Exception ex)
{
trans.Rollback();
Console.WriteLine(ex.ToString());
return false;
}
finally
{
db.Close();
}
}
多映射
一对一
using (IDbConnection db = new SqlConnection(DBHelp.ConnStrings))
{
string sql = "select * from Person p inner join Students s on p.first_name=s.Name";
var list = db.Query(sql, (person, student) => { return person; }, null, null, true,
"Id");
return list;
}
一对多
多类型