NetCore Dapper封装
一、前期环境准备
1、创建一个core webapi的项目,基于core3.1版本创建一个项目。
2、Dapper安装,使用NuGet来安装Dapper程序包
Install-Package Dapper -Version 2.0.30
Install-Package Dapper.Contrib -Version 2.0.30
3、MySQL.Data的程序包(可以使用其他数据库,如:sqlserver,sqllite等)
Install-Package Dapper -Version 8.0.25
4、appsettings.json文件中添加链接数据库的字符串(其他数据库连接字符串,自行更改):
"ConnectionStrings": {
"DefaultConnection": "server=服务器;port=端口号;database=regatta{0};SslMode=None;uid=userName;pwd=passWord;Allow User Variables=true"
}
二、封装
1、IDapperContext:
/// <summary>
/// Dapper上下文
/// </summary>
public interface IDapperContext : IDisposable
{
/// <summary>
/// 数据库连接对象
/// </summary>
IDbConnection ReadConnection { get; } /// <summary>
/// 数据库连接对象
/// </summary>
IDbConnection WriteConnection { get; }
}
2、DapperContext:
public class DapperContext : IDapperContext
{
/// <summary>
/// 读连接字符串
/// </summary>
private string _readConnectionString; /// <summary>
/// 写连接字符串
/// </summary>
private string _writeConnectionString; private bool _useMiniProfiling; /// <summary>
/// 读连接
/// </summary>
private IDbConnection _readConnection; /// <summary>
/// 写连接
/// </summary>
private IDbConnection _wrteConnection; /// <summary>
/// 配置
/// </summary>
private readonly AppSetting _appSetting; /// <summary>
/// 构造函数注入IOptions
/// </summary>
/// <param name="appSetting"></param>
public DapperContext(IOptions<AppSetting> appSetting)
{
_appSetting = appSetting.Value;
_readConnectionString = _appSetting.ReadOnlyConnectionString;
_writeConnectionString = _appSetting.SetConnectionString;
_useMiniProfiling = _appSetting.UseMiniProfiling;
} /// <summary>
/// 连接字符串
/// </summary>
/// <param name="connectionString">读写连接字符串</param>
public DapperContext(string connectionString)
{
_readConnectionString = connectionString;
_writeConnectionString = connectionString;
} #region 读 /// <summary>
/// 获取连接
/// </summary>
public IDbConnection ReadConnection
{
get
{
if (_readConnection == null || _readConnection.State == ConnectionState.Closed)
{
if (_useMiniProfiling)
{
_readConnection = new ProfiledDbConnection(new MySqlConnection(_readConnectionString), MiniProfiler.Current);
}
else
{
_readConnection = new MySqlConnection(_readConnectionString);
}
}
if (_readConnection.State != ConnectionState.Open)
{
_readConnection.Open();
}
return _readConnection;
}
} /// <summary>
/// 释放连接
/// </summary>
public void Dispose()
{
if (_readConnection != null && _readConnection.State == ConnectionState.Open)
_readConnection.Close();
if (_wrteConnection != null && _wrteConnection.State == ConnectionState.Open)
_wrteConnection.Close();
} #endregion #region 写 /// <summary>
/// 获取连接
/// </summary>
public IDbConnection WriteConnection
{
get
{
if (_wrteConnection == null || _wrteConnection.State == ConnectionState.Closed)
{
if (_useMiniProfiling)
{
_wrteConnection = new ProfiledDbConnection(new MySqlConnection(_writeConnectionString), MiniProfiler.Current);
}
else
{
_wrteConnection = new MySqlConnection(_writeConnectionString);
}
}
if (_wrteConnection.State != ConnectionState.Open)
{
_wrteConnection.Open();
}
return _wrteConnection;
}
} #endregion
}
3、IRepository(仓储):
/// <summary>
/// 数据库CRUD等操作
/// </summary>
/// <typeparam name="T"></typeparam>
public interface IRepository<T> where T : class
{
/// <summary>
/// 上下文
/// </summary>
IDapperContext Context { get; } /// <summary>
/// 只读连接
/// </summary>
IDbConnection ReadConnection { get; } /// <summary>
/// 读写连接
/// </summary>
IDbConnection WriteConnection { get; } /// <summary>
/// 获取分页数据
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="criteria">查询设置</param>
/// <param name="param"></param>
/// <returns></returns>
PageDataView<TEntity> GetPageData<TEntity>(PageCriteria criteria, object param = null) where TEntity : class; /// <summary>
///
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="criteria"></param>
/// <param name="param"></param>
/// <returns></returns>
PageDataView<TEntity> GetAllData<TEntity>(PageCriteria criteria, object param = null) where TEntity : class; /// <summary>
/// 添加数据
/// </summary>
/// <param name="entity"></param>
/// <param name="transaction"></param>
/// <param name="commandTimeout"></param>
/// <returns></returns>
long Add(T entity, IDbTransaction transaction = null, int? commandTimeout = null); /// <summary>
/// 批量添加数据
/// </summary>
/// <param name="entity"></param>
/// <param name="transaction"></param>
/// <param name="commandTimeout"></param>
/// <returns></returns>
long BatchAdd(IEnumerable<T> list, IDbTransaction transaction = null, int? commandTimeout = null); /// <summary>
///
/// </summary>
/// <param name="entity"></param>
/// <param name="transaction"></param>
/// <param name="commandTimeout"></param>
bool Update(T entity, IDbTransaction transaction = null, int? commandTimeout = null); /// <summary>
/// 删除单条数据
/// </summary>
/// <param name="entity"></param>
/// <param name="transaction"></param>
/// <param name="commandTimeout"></param>
bool Remove(T entity, IDbTransaction transaction = null, int? commandTimeout = null); /// <summary>
/// 批量删除
/// </summary>
/// <param name="list"></param>
/// <param name="transaction"></param>
/// <param name="commandTimeout"></param>
/// <returns></returns>
bool BatchRemove(IEnumerable<T> list, IDbTransaction transaction = null, int? commandTimeout = null); /// <summary>
/// 根据主键获取数据
/// </summary>
/// <param name="key"></param>
/// <param name="transaction"></param>
/// <param name="commandTimeout"></param>
/// <returns></returns>
T GetByKey(object key, IDbTransaction transaction = null, int? commandTimeout = null); /// <summary>
/// 获取所有数据
/// </summary>
/// <param name="transaction"></param>
/// <param name="commandTimeout"></param>
/// <returns></returns>
IEnumerable<T> GetAll(IDbTransaction transaction = null, int? commandTimeout = null); /// <summary>
/// 根据条件获取数据列表
/// </summary>
/// <param name="sql"></param>
/// <param name="param"></param>
/// <param name="transaction"></param>
/// <param name="commandTimeout"></param>
/// <returns></returns>
IEnumerable<T> GetBy(object sql = null, object param = null, IDbTransaction transaction = null, int? commandTimeout = null); /// <summary>
/// 查询数据列表
/// </summary>
/// <param name="sql"></param>
/// <param name="transaction"></param>
/// <param name="commandTimeout"></param>
/// <returns></returns>
IEnumerable<dynamic> Query(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null); /// <summary>
/// 多对象查询
/// </summary>
/// <param name="sql"></param>
/// <param name="param"></param>
/// <param name="transaction"></param>
/// <param name="commandTimeout"></param>
/// <param name="commandType"></param>
/// <returns></returns>
GridReader QueryMultiple(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null); /// <summary>
/// 执行sql
/// </summary>
/// <param name="sql"></param>
/// <param name="transaction"></param>
/// <param name="commandTimeout"></param>
/// <returns></returns>
int Excute(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null); /// <summary>
/// 执行是否存在数据
/// </summary>
/// <param name="sqlStr">查询(例:SELECT COUNT(1) FROM XXX )</param>
/// <returns></returns>
bool Exists(string sqlStr, object param = null);
}
4、Repository(仓储实现):
public class Repository<T> : IRepository<T> where T : class
{
public Repository(IDapperContext context)
{
Context = context;
} public IDapperContext Context { get; private set; }
public IDbConnection ReadConnection => Context.ReadConnection; public IDbConnection WriteConnection => Context.WriteConnection; public PageDataView<TEntity> GetPageData<TEntity>(PageCriteria criteria, object param = null) where TEntity : class
{
var p = new DynamicParameters();
string proName = "ProcGetPageData";
p.Add("_tables", criteria.TableName);
p.Add("_fields", criteria.Fields);
p.Add("_where", criteria.Condition);
p.Add("_pageIndex", criteria.CurrentPage);
p.Add("_pageSize", criteria.PageSize);
p.Add("_orderby", criteria.Sort);
p.Add("_totalcount", dbType: DbType.Int32, direction: ParameterDirection.Output);
p.Add("_pagecount", dbType: DbType.Int32, direction: ParameterDirection.Output);
var pageData = new PageDataView<TEntity>(); pageData.Items = ReadConnection.Query<TEntity>(proName, p, commandType: CommandType.StoredProcedure, commandTimeout: 300).ToList();
pageData.TotalNum = p.Get<int>("_totalcount");
pageData.TotalPageCount = p.Get<int>("_pagecount"); //Convert.ToInt32(Math.Ceiling(pageData.TotalNum * 1.0 / criteria.PageSize));
pageData.CurrentPage = criteria.CurrentPage > pageData.TotalPageCount ? pageData.TotalPageCount : criteria.CurrentPage; return pageData;
} public PageDataView<TEntity> GetAllData<TEntity>(PageCriteria criteria, object param = null) where TEntity : class
{
var p = new DynamicParameters();
string proName = "ProcGetAllData";
p.Add("_tables", criteria.TableName);
p.Add("_fields", criteria.Fields);
p.Add("_where", criteria.Condition);
p.Add("_orderby", criteria.Sort);
p.Add("_totalcount", dbType: DbType.Int32, direction: ParameterDirection.Output);
var pageData = new PageDataView<TEntity>();
pageData.Items = ReadConnection.Query<TEntity>(proName, p, commandType: CommandType.StoredProcedure, commandTimeout: 300).ToList();
pageData.TotalNum = p.Get<int>("_totalcount");
return pageData;
} public long Add(T entity, IDbTransaction transaction = null, int? commandTimeout = null)
{
if (entity == null)
{
throw new ArgumentNullException("entity", "Add to DB null entity");
}
var res = WriteConnection.Insert(entity, transaction: transaction, commandTimeout: commandTimeout);
return res;
} public long BatchAdd(IEnumerable<T> list, IDbTransaction transaction = null, int? commandTimeout = null)
{
if (list == null)
{
throw new ArgumentNullException("list", "BatchAdd to DB null entity");
}
var res = WriteConnection.Insert(list, transaction: transaction, commandTimeout: commandTimeout);
return res;
} public virtual bool Update(T entity, IDbTransaction transaction = null, int? commandTimeout = null)
{
if (entity == null)
{
throw new ArgumentNullException("entity", "Update in DB null entity");
}
return WriteConnection.Update(entity, transaction: transaction, commandTimeout: commandTimeout);
} public virtual bool Remove(T entity, IDbTransaction transaction = null, int? commandTimeout = null)
{
if (entity == null)
{
throw new ArgumentNullException("entity", "Remove in DB null entity");
}
return WriteConnection.Delete(entity, transaction: transaction, commandTimeout: commandTimeout);
} public bool BatchRemove(IEnumerable<T> list, IDbTransaction transaction = null, int? commandTimeout = null)
{
if (list == null)
{
throw new ArgumentNullException("list", "BatchAdd to DB null entity");
}
return WriteConnection.Delete(list, transaction: transaction, commandTimeout: commandTimeout);
} public virtual T GetByKey(object queryId, IDbTransaction transaction = null, int? commandTimeout = null)
{
if (queryId == null)
{
throw new ArgumentNullException("queryId");
}
return ReadConnection.Get<T>(queryId, transaction: transaction, commandTimeout: commandTimeout);
} public virtual IEnumerable<T> GetAll(IDbTransaction transaction = null, int? commandTimeout = null)
{
return ReadConnection.GetAll<T>(transaction: transaction, commandTimeout: commandTimeout);
} public virtual IEnumerable<T> GetBy(object sql = null, object param = null, IDbTransaction transaction = null, int? commandTimeout = null)
{
return ReadConnection.Query<T>(sql.ToString(), param, commandTimeout: commandTimeout);
} public IEnumerable<dynamic> Query(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null)
{
return ReadConnection.Query<dynamic>(sql, param);
} public GridReader QueryMultiple(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null)
{
return ReadConnection.QueryMultiple(sql, param, transaction, commandTimeout, commandType);
} public int Excute(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null)
{
return WriteConnection.Execute(sql, param, transaction: transaction);
} public bool Exists(string sqlStr, object param = null)
{
return ReadConnection.Query<dynamic>(sqlStr, param).Count() > 0 ? true : false;
}
}
利用工厂模式创建仓库
5、IFactoryRepository:
/// <summary>
/// 创建仓库接口
/// </summary>
public interface IFactoryRepository
{
/// <summary>
/// 创建仓库
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="context"></param>
/// <returns></returns>
IRepository<T> CreateRepository<T>(IDapperContext context) where T : class;
} /// <summary>
/// 工厂
/// </summary>
public class FactoryRepository : IFactoryRepository
{
/// <summary>
/// 创建Repository
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="context"></param>
/// <returns></returns>
public IRepository<T> CreateRepository<T>(IDapperContext context) where T : class
{
IRepository<T> repository = new Repository<T>(context);
return repository;
}
}
NetCore Dapper封装的更多相关文章
- 基于EFCore3.0+Dapper 封装Repository
Wei.Repository 基于EFCore3.0+Dapper 封装Repository,实现UnitOfWork,提供基本的CURD操作,可直接注入泛型Repository,也可以继承Repos ...
- .NetCore简单封装基于IHttpClientFactory的HttpClient请求
IHttpClientFactory是什么?为什么出现了IHttpClientFactory 一.IHttpClientFactory是什么? IHttpClientFactory是.netcore2 ...
- NetCore+Dapper WebApi架构搭建(二):底层封装
看下我们上一节搭建的架构,现在开始从事底层的封装 1.首先需要一个实体的接口IEntity namespace Dinner.Dapper { public interface IEntity< ...
- NetCore+Dapper WebApi架构搭建(一):基本框架
初衷是想用dapper搭建一个高性能的架构,因为dapper操作数据库的效率很高 1.VS创建一个NetCore WebApi的框架,然后解决方案添加一个NetStandard的类库 整个解决方案如图 ...
- OSS.Core基于Dapper封装(表达式解析+Emit)仓储层的构思及实现
最近趁着不忙,在构思一个搭建一个开源的完整项目,至于原因以及整个项目框架后边文章我再说明.既然要起一个完整的项目,那么数据仓储访问就必不可少,这篇文章我主要介绍这个新项目(OSS.Core)中我对仓储 ...
- .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
本篇我将带着大家一起来对Dapper进行下封装并实现基本的增删改查.分页操作的同步异步方法的实现(已实现MSSQL,MySql,PgSQL).同时我们再实现一下仓储层的代码生成器,这样的话,我们只需要 ...
- NetCore+Dapper WebApi架构搭建(四):仓储的依赖注入
上一节我们讲到实体,仓储接口和仓储接口的实现需要遵循约定的命名规范,不仅是规范,而且为了依赖注入,现在我们实现仓储的依赖注入 在NetCore WebApi项目中新添加一个文件夹(Unit),当然你也 ...
- NetCore+Dapper WebApi架构搭建(三):添加实体和仓储
上一节讲了类库添加一些底层的基本封装,下面来添加实体和仓储 1.Entities文件夹添加一个实体类Users,继承BaseModel,即拥有BaseModel的主键 using System; na ...
- Dapper 封装oracle底层访问数据库
如下代码,修改成只支持oracle: using System; using System.Collections.Generic; using System.Data; using System.L ...
随机推荐
- .NET Core-全局性能诊断工具
前言: 现在.NET Core 上线后,不可避免的会出现各种问题,如内存泄漏.CPU占用高.接口处理耗时较长等问题.这个时候就需要快速准确的定位问题,并解决. 这时候就可以使用.NET Core 为开 ...
- Mac 解压缩软件-keka
去官网 GitHub地址 功能预览
- Log4j讲解
讲解 通常,我们写代码的过程中,免不了要输出各种调试信息.在没有使用任何日志工具之前,都会使用 System.out.println 来做到. 这么做直观有效,但是有一系列的缺点:1. 不知道这句话是 ...
- 比物理线程都好用的C++20的协程,你会用吗?
摘要:事件驱动(event driven)是一种常见的代码模型,其通常会有一个主循环(mainloop)不断的从队列中接收事件,然后分发给相应的函数/模块处理.常见使用事件驱动模型的软件包括图形用户界 ...
- 从系统的角度分析影响程序执行性能的因素——SA20225205 黄兴宇
实验总结分析报告:从系统的角度分析影响程序执行性能的因素 1.请您根据本课程所学内容总结梳理出一个精简的Linux系统概念模型,最大程度统摄整顿本课程及相关的知识信息,模型应该是逻辑上可以运转的.自洽 ...
- HTML的表格元素
一.HTML的表格元素 1.table元素 <table> 标签定义 HTML 表格.简单的 HTML 表格由 table 元素以及一个或多个 tr.th 或 td 元素组成.tr 元素定 ...
- cent7 配 yum源
今天笔记配置CentOS 7本地镜像为yum源,废话不多说,上去就是干! 1:挂镜像: ? 1 2 3 4 #创建目标挂载目录 mkdir /media/CentOS7 #将镜像挂载到目标目录 mou ...
- linux系统开机自动挂载光驱 和 fstab文件详解
Linux 通过 UUID 在 fstab 中自动挂载分区 summerm6关注 2019.10.17 16:29:00字数 1,542阅读 607 https://xiexianbin.cn/lin ...
- Scala 函数式编程思想
Spark 选择 Scala 作为开发语言 在 Spark 诞生之初,就有人诟病为什么 AMP 实验室选了一个如此小众的语言 - Scala,很多人还将原因归结为学院派的高冷,但后来事实证明,选择 S ...
- declaration may not appear after executable statement in block--转载
这个问题是在编译STM32的程序时遇到的,这个错误的原因是对于变量的声明不能放在可执行语句后面,必须在主函数开头声明变量.在程序中声明一个变量时,需要在可执行语句之前声明,否则会出现以上错误. 例: ...