Dapper的简单介绍
对象关系映射(ORM)这个概念已经存在很长时间了,ORM的作用就是用来解决 编程领域的 object model 和关系数据库中的 data model 的不匹配问题,Dapper 是一个开源的,轻量级的 ORM 框架,由 Stack Overflow 团队开发,Dapper 和其他流行的ORM框架相比,最大的优点就是羽翼级。
Dapper在最初开发时就考虑到了性能和易用性,它支持在 事务,存储过程 或者 批量插入时进行静态或者动态的对象绑定。
以下是具体操作:
一、包的引用
二、项目中全局引用
三、Dapper 接口中常用方法封装
1、IDapperRepository接口封装
public interface IDapperRepository
{
IDbConnection Db { get; }
/// <summary>
/// 查询数据列表
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
IEnumerable<dynamic> Query(string sql, object? param = null);
/// <summary>
/// 执行sql
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
int Excute(string sql, object? param = null);
/// <summary>
/// 是否存在数据
/// </summary>
/// <param name="sql">查询(例:SELECT COUNT(1) FROM XXX )</param>
/// <returns></returns>
bool Exists(string sql, object? param = null);
}
2、DapperRepository 实现
public class DapperRepository : IDapperRepository
{
private IDbConnection _connection;
public IDbConnection Db
{
get { return _connection; }
}
public DapperRepository(IConfiguration configuration)
{
_connection = new NpgsqlConnection(configuration["DataBase::ConnString"]);
}
public IEnumerable<dynamic> Query(string sql, object? param = null)
{
return _connection.Query<dynamic>(sql, param);
}
public int Excute(string sql, object? param = null)
{
return _connection.Execute(sql, param);
}
public bool Exists(string sql, object? param = null)
{
return _connection.Query<dynamic>(sql, param).Count() > 0 ? true : false;
}
}
四、项目中实际使用
1、引用并初始化
private readonly IDapperRepository _dapperRepository;
public GetStatusInfoHandler(IDapperRepository dapperRepository)
{
_dapperRepository = dapperRepository ?? throw new ArgumentNullException(nameof(dapperRepository));
}
2、函数中使用
使用
_dapperRepository.Query(sql) 查询数据集合;
_dapperRepository.Db.Execute(proc_name, parameters, commandType: CommandType.StoredProcedure) 执行存储过程
_dapperRepository.Excute(sql,CommandType.Text); 执行新增sql语句
dateTime = DateTime.Now.AddMonths(+i);
string tableName = "t_wind_self_inspection_data_" + dateTime.ToString("yyyyMM");
string proc_name = "proc_createtable_wind_self_inspection_byyear";
IDictionary<string, object> parameters = new Dictionary<string, object>();
parameters.Add("tablename", "t_wind_self_inspection_data_" + dateTime.ToString("yyyyMM"));
if (dbType == DatabaseType.Npgsql)
{
string sql = "select count(*) from information_schema.tables where table_schema='public' and table_type='BASE TABLE' and table_name='" + tableName + "';";
var table = _dapperRepository.Query(sql);
var res = JsonConvert.SerializeObject(table).ToLower();
var data = JsonConvert.DeserializeObject<List<QueryData>>(res);
if (data[0].count == "0")
{
bRet = _dapperRepository.Db.Execute(proc_name, parameters, commandType: CommandType.StoredProcedure) != 0 ? true : false;
}
}
var sql = string.Format("insert into " + tableName + " (windselfid," +
"equipmentid,departmentid,equipmenttypeid,oxygenvalue,gasflowvalue," +
"areatype,isdelete,createdatetime,lastupdatedatetime,areavalue)" +
" values {0}", values);
try
{
result = _dapperRepository.Excute(sql,CommandType.Text);
}
catch (Exception ex)
{ }
Dapper 框架也是支持事务操作的,如果有必要的话可以使用事务,使用方式很简单,你可以利用 BeginTransaction() 和 EndTransaction() 方法,其实和你使用 ADO.NET 的事务方式是一摸一样的,将需要事务的语句代码放置在 BeginTransaction 和 EndTransaction 之间即可。
Dapper ORM 真的是相当羽翼级 并且非常方便使用,它不会为你生成任何sql语句,在这种情况下还能够非常便捷的将查询结果映射到你的 POCO 对象上,最🐂👃的是,它的执行速度远超 Entity Framework,实际上,能和原生的 ADO.Net 媲美。
讲到这里,Dapper基本的操作已经讲解完毕。欢迎批评指正