C# ORM模式之 Dapper 简单使用

  • Post author:
  • Post category:其他

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基本的操作已经讲解完毕。欢迎批评指正


版权声明:本文为tony900205原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。