.NetCore学习笔记:二、基于Dapper的泛型Repository
为减少代码量,这里实现一个基于Dapper的泛型Repository。
这里需要引用Dapper.dll和Dapper.Contrib.dll。
接口定义:
/// <summary>
/// Repository接口
/// </summary>
/// <typeparam name="T"></typeparam>
public interface IRepository<T> where T : class, IEntity
{
/// <summary>
/// 查询
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <param name="param"></param>
/// <param name="commandType"></param>
/// <returns></returns>
IEnumerable<T> Query(string sql, object param = null, CommandType? commandType = null); /// <summary>
/// 删除行数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="entity"></param>
/// <returns></returns>
bool Delete(T entity);
/// <summary>
/// 删除表所有数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
bool DeleteAll();
/// <summary>
/// 获取行数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="id"></param>
/// <returns></returns>
T Get(object id);
/// <summary>
/// 获取表的所有数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
IEnumerable<T> GetAll();
/// <summary>
/// 添加行数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="entity"></param>
/// <returns></returns>
long Insert(T entity);
/// <summary>
/// 更新行数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="entity"></param>
/// <returns></returns>
bool Update(T entity); /// <summary>
/// 分页方法
/// </summary>
/// <param name="sql"></param>
/// <param name="pageIndex">当前页码</param>
/// <param name="pageSize">每页显示条数</param>
/// <param name="param">参数</param>
/// <param name="transaction"></param>
/// <param name="commandTimeout"></param>
/// <returns></returns>
PagedResult<T> GetPageList(string sql, int pageIndex, int pageSize, object param = null);
}
接口实现:
/// <summary>
/// 泛型Repository
/// </summary>
/// <typeparam name="T"></typeparam>
public class Repository<T> : IRepository<T> where T : class, IEntity
{
private IUnitOfWork _unitOfWork; public Repository(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
/// <summary>
/// 查询
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <param name="param"></param>
/// <param name="commandType"></param>
/// <returns></returns>
public IEnumerable<T> Query(string sql, object param = null, CommandType? commandType = null)
{
var r = _unitOfWork.DbConnection.Query<T>(sql, param: param, transaction: _unitOfWork.DbTransaction, commandType: commandType);
return r;
}
/// <summary>
/// 删除行数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="entityToDelete"></param>
/// <returns></returns>
public bool Delete(T entity)
{
var r = _unitOfWork.DbConnection.Delete<T>(entity, _unitOfWork.DbTransaction);
return r;
}
/// <summary>
/// 删除表所有数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public bool DeleteAll()
{
var r = _unitOfWork.DbConnection.DeleteAll<T>(_unitOfWork.DbTransaction);
return r;
}
/// <summary>
/// 获取行数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="id"></param>
/// <returns></returns>
public T Get(object id)
{
var r = _unitOfWork.DbConnection.Get<T>(id, _unitOfWork.DbTransaction);
return r;
}
/// <summary>
/// 获取表的所有数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public IEnumerable<T> GetAll()
{
var r = _unitOfWork.DbConnection.GetAll<T>(_unitOfWork.DbTransaction);
return r;
}
/// <summary>
/// 添加行数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="entity"></param>
/// <returns></returns>
public long Insert(T entity)
{
var r = _unitOfWork.DbConnection.Insert<T>(entity, _unitOfWork.DbTransaction);
return r;
}
/// <summary>
/// 更新行数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="entity"></param>
/// <returns></returns>
public bool Update(T entity)
{
var r = _unitOfWork.DbConnection.Update<T>(entity, _unitOfWork.DbTransaction);
return r;
}
/// <summary>
/// 分页方法
/// </summary>
/// <param name="sql"></param>
/// <param name="pageIndex">当前页码</param>
/// <param name="pageSize">每页显示条数</param>
/// <param name="param">参数</param>
/// <param name="transaction"></param>
/// <param name="commandTimeout"></param>
/// <returns></returns>
public PagedResult<T> GetPageList(string sql, int pageIndex, int pageSize, object param = null)
{
var pagingResult = _unitOfWork.DbConnection.GetPageList<T>(sql, pageIndex, pageSize, param: param, transaction: _unitOfWork.DbTransaction);
return pagingResult;
}
}
GetPageList为Dapper的一个分页扩展:
/// <summary>
/// 分页方法
/// </summary>
/// <param name="sql"></param>
/// <param name="pageIndex">当前页码</param>
/// <param name="pageSize">每页显示条数</param>
/// <param name="param">参数</param>
/// <param name="transaction"></param>
/// <param name="commandTimeout"></param>
/// <returns></returns>
public static PagedResult<T> GetPageList<T>(this IDbConnection connection, string sql, int pageIndex, int pageSize, object param = null, IDbTransaction transaction = null, int? commandTimeout = null)
{
if (pageIndex < ) pageIndex = ;
if (pageSize < ) pageSize = ;
var startRow = (pageIndex - ) * pageSize; //MySql分页
sql = $"SELECT * FROM ({sql}) tt1 LIMIT {startRow},{pageSize}; SELECT COUNT(1) FROM ({sql}) tt2;"; PagedResult<T> pagingResult = new PagedResult<T>();
pagingResult.Paged.PageIndex = pageIndex;
pagingResult.Paged.PageSize = pageSize;
using (var result = connection.QueryMultiple(sql, param: param, transaction, commandTimeout))
{
var list = result.Read<T>();
var totalCount = result.Read<long>().FirstOrDefault();
pagingResult.Data = list;
pagingResult.Paged.TotalRow = totalCount;
}
return pagingResult;
}
PagedResult类:
/// <summary>
/// 分页模型
/// </summary>
/// <typeparam name="T"></typeparam>
public class PagedResult<T>
{
public PagedResult()
{
this.Paged = new Paged();
} /// <summary>
/// 结果
/// </summary>
public IEnumerable<T> Data { get; set; } /// <summary>
/// 分页数据,包含数据总行数、当前页码、页数据行数和总的分页数
/// </summary>
public Paged Paged { get; set; }
}
Paged类:
/// <summary>
/// 分页数据
/// </summary>
public class Paged
{
/// <summary>
/// 当前页码
/// </summary>
public int PageIndex { get; set; }
/// <summary>
/// 页数据行数
/// </summary>
public int PageSize { get; set; }
/// <summary>
/// 总行数
/// </summary>
public long TotalRow { get; set; }
/// <summary>
/// 总的分页数
/// </summary>
public int TotalPage
{
get
{
if (this.TotalRow > && this.PageSize > )
return (int)Math.Ceiling((decimal)this.TotalRow / this.PageSize);
else
return ;
}
}
}
在IServiceCollection容器中注册:
services.AddScoped(typeof(IRepository<>), typeof(Repository<>));
源码地址:https://github.com/letnet/NetCoreDemo
.NetCore学习笔记:二、基于Dapper的泛型Repository的更多相关文章
- STM32学习笔记(二) 基于STM32-GPIO的流水灯实现
学会了如何新建一个工程模板,下面就要开始动手实践了.像c/c++中经典的入门代码"hello world"一样,流水灯作为最简单的硬件设备在单片机领域也是入门首推.如果你已经有了一 ...
- .NetCore学习笔记:三、基于AspectCore的AOP事务管理
AOP(面向切面编程),通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑 ...
- java之jvm学习笔记二(类装载器的体系结构)
java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...
- Typescript 学习笔记二:数据类型
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- muduo学习笔记(二)Reactor关键结构
目录 muduo学习笔记(二)Reactor关键结构 Reactor简述 什么是Reactor Reactor模型的优缺点 poll简述 poll使用样例 muduo Reactor关键结构 Chan ...
- Go语言学习笔记二: 变量
Go语言学习笔记二: 变量 今天又学了一招如何查看go的版本的命令:go version.另外上一个笔记中的代码还可以使用go run hello.go来运行,只是这种方式不会生成exe文件. 定义变 ...
- amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules
amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules 一.总结 1.见名知意:见那些class名字知意,见函数名知意,见文件名知意 例如(HISTORY.md Web 组件更新历史 ...
- amazeui学习笔记二(进阶开发1)--项目结构structure
amazeui学习笔记二(进阶开发1)--项目结构structure 一.总结 1.项目结构:是说的amazeui在github上面的项目结构,二次开发amazeui用 二.项目结构structure ...
- ZooKeeper学习笔记二:API基本使用
Grey ZooKeeper学习笔记二:API基本使用 准备工作 搭建一个zk集群,参考ZooKeeper学习笔记一:集群搭建. 确保项目可以访问集群的每个节点 新建一个基于jdk1.8的maven项 ...
随机推荐
- 单页应用(SPA,Single-page-App)和多页应用(MPA,Multi-page App)的区别
单页应用(SPA,Single-page-App)和多页应用(MPA,Multi-page App)的区别 参考博客:https://www.jianshu.com/p/4c9c29967dd6
- Flume 自定义拦截器 多行读取日志+截断
前言: Flume百度定义如下: Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据:同时,F ...
- js this是什么?[多次书写]
前言 以前的时候,我写了一个关于js this的博客,写的非常复杂,分析了各种情况. 现在我想简化. 如果你有后台基础,专门去理解过this,那么请忘记. 这东西是有口诀的: 在方法中,this 表示 ...
- 查看deepin操作系统版本命令
cat /proc/version cat /etc/debian_version cat /etc/os-release lsb_release -a uname -a uname -r sc ...
- 用Python制作酷炫词云图,原来这么简单!
一.简介词云图是文本挖掘中用来表征词频的数据可视化图像,通过它可以很直观地展现文本数据中地高频词:! 图1 词云图示例 在Python中有很多可视化框架可以用来制作词云图,如pyecharts,但这些 ...
- 错误:EfficientDet网络出现"No boxes to NMS"并且mAP:0.0的解决方案
近日,在使用谷歌新推出来的一个网络EfficientDet进行目标检测训练自己的数据集的时候,出现了如下错误: 其中项目开源地址是:https://github.com/toandaominh1997 ...
- Vue中import from的来源--省略后缀与加载文件夹
Vue使用import ... from ...来导入组件,库,变量等.而from后的来源可以是js,vue,json.这个是在webpack.base.conf.js中设置的: module.exp ...
- Bash脚本编程学习笔记06:条件结构体
简介 在bash脚本编程中,条件结构体使用if语句和case语句两种句式. if语句 单分支if语句 if TEST; then CMD fi TEST:条件判断,多数情况下可使用test命令来实现, ...
- php ip转换省市县
http://www.cz88.net/ip/ http://www.ttlsa.com/php/php_cunzhen-ipdata/ # wget h http://6.scdx3.crsky.c ...
- centos yum 安装jdk1.7
安装: yum -y install java-1.7.0-openjdk-devel.x86_64 环境变量: vi /etc/profile export JAVA_HOME=/usr/lib/j ...