使用DapperSimpleCRUD对Repository层进行封装
通过前面的两篇文章使用Dapper操作Mysql数据库与使用Dapper进行参数化查询,大致介绍了Dapper的一些基本操作和简单使用,在实际的使用当中,我们可以把项目简单的分为MVC+Service层+Repository层,Repository 是一个独立的层,在这里我们简单的把它当作 DAO 来看待,结合 DapperSimpleCRUD 提供数据的CRUD操作;但在领域驱动设计中,我们应该采用面向集合的方式,而不是面向数据访问的方式设计仓储。这有助于你将自己的领域当作模型来看待,而不是 CRUD 操作。
DapperSimpleCRUD 是针对Dapper进行的扩展,通过简单的配置把数据表与实体模型进行匹配,达到对象和数据库之间映射;你可以通过gtihub下载引用,也可以直接在nuget上直接引用。
我们实际操作一下
1、创建Car表,包含Id,Car_Id,Create_Time三列,创建对应的实体模型;务必添加[Table]和[Key]标签,DapperSimpleCRUD 才能获取到实体对象对应的数据库表和主键
/// <summary>
/// UserInfo表实体对象映射
/// </summary>
[Table("UserInfo")]
public class UserInfo
{
[Key]
public string Id { get; set; }
public string User_Name { get; set; }
public int Enable { get; set; }
}
2、创建泛型接口 IBaseRepository,定义你需要的基本数据操作
/// <summary>
/// 接口层Device
/// </summary>
public interface IBaseRepository<T>
{
#region 成员方法
/// <summary>
/// 增加一条数据
/// </summary>
bool Add(T model);
/// <summary>
/// 根据ID删除一条数据
/// </summary>
bool Delete(int Id);
/// <summary>
/// 根据条件删除数据
/// </summary>
/// <param name="strWhere"></param>
/// <param name="parameters"></param>
/// <returns></returns>
bool DeleteList(string strWhere, object parameters);
/// <summary>
/// 更新一条数据
/// </summary>
bool Update(T model);
/// <summary>
/// 根据ID获取实体对象
/// </summary>
T GetModel(int Id);
///// <summary>
///// 根据条件获取实体对象
///// </summary>
//T GetModel(string strWhere, object parameters);
/// <summary>
/// 根据条件获取实体对象集合
/// </summary>
/// <param name="strWhere"></param>
/// <param name="parameters"></param>
/// <returns></returns>
IEnumerable<T> GetModelList(string strWhere, object parameters);
/// <summary>
/// 分页查询
/// </summary>
/// <param name="pageNum">页码</param>
/// <param name="rowsNum">每页行数</param>
/// <param name="strWhere">where条件</param>
/// <param name="orderBy">Orde by排序</param>
/// <param name="parameters">parameters参数</param>
/// <returns></returns>
IEnumerable<T> GetListPage(int pageNum, int rowsNum, string strWhere, string orderBy, object parameters);
#endregion
}
3、BaseRepository 实现接口定义
/// <summary>
/// 仓储层基类,通过泛型实现通用的CRUD操作
/// </summary>
/// <typeparam name="T"></typeparam>
public class BaseRepository<T> : IBaseRepository<T>
{
private IDbConnection _connection;
#region 成员方法
/// <summary>
/// 增加一条数据
/// </summary>
public bool Add(T model)
{
int? result;
using (_connection = Utilities.GetOpenConnection())
{
result = _connection.Insert<T>(model);
}
)
{
return true;
}
else
{
return false;
}
}
/// <summary>
/// 根据ID删除一条数据
/// </summary>
public bool Delete(int id)
{
int? result;
using (_connection = Utilities.GetOpenConnection())
{
result = _connection.Delete<T>(id);
}
)
{
return true;
}
else
{
return false;
}
}
/// <summary>
/// 按条件删除数据
/// </summary>
/// <param name="strWhere"></param>
/// <param name="parameters"></param>
/// <returns></returns>
public bool DeleteList(string strWhere, object parameters)
{
int? result;
using (_connection = Utilities.GetOpenConnection())
{
result = _connection.DeleteList<T>(strWhere,parameters);
}
)
{
return true;
}
else
{
return false;
}
}
/// <summary>
/// 更新一条数据
/// </summary>
public bool Update(T model)
{
int? result;
using (_connection = Utilities.GetOpenConnection())
{
result = _connection.Update<T>(model);
}
)
{
return true;
}
else
{
return false;
}
}
/// <summary>
/// 根据ID获取实体对象
/// </summary>
public T GetModel(int id)
{
using (_connection = Utilities.GetOpenConnection())
{
return _connection.Get<T>(id);
}
}
/// <summary>
/// 根据条件获取实体对象集合
/// </summary>
public IEnumerable<T> GetModelList(string strWhere, object parameters)
{
using (_connection = Utilities.GetOpenConnection())
{
return _connection.GetList<T>(strWhere, parameters);
}
}
/// <summary>
/// 根据条件分页获取实体对象集合
/// </summary>
/// <param name="pageNum"></param>
/// <param name="rowsNum"></param>
/// <param name="strWhere"></param>
/// <param name="orderBy"></param>
/// <param name="parameters"></param>
/// <returns></returns>
public IEnumerable<T> GetListPage(int pageNum,int rowsNum, string strWhere, string orderBy,object parameters)
{
using (_connection = Utilities.GetOpenConnection())
{
return _connection.GetListPaged<T>(pageNum, rowsNum, strWhere, orderBy, parameters); ;
}
}
#endregion
}
4、下面User实体对应的Repository类实现如下,DapperSimpleCRUD 通过传入的泛型类型自动完成对象与数据库的关系映射
public class UserInfoRepository : BaseRepository<UserInfo>,IUserInfoRepository
{
public UserInfo ValidateUser(string strUser)
{
UserInfo user = new UserInfo();
try
{
DynamicParameters Parameters = new DynamicParameters();
string strQuery = "WHERE User_Name=@Name";
Parameters.Add("Name", strUser);
return this.GetModelList(strQuery, Parameters).First();
}
catch
{
return user;
}
}
}
上面是对Repository层的一个简单封装,通过DapperSimpleCRUD对Dapper的扩展,实现对象与数据库的自动映射,可以完成通用的CRUD操作,简化了一些重复性的代码。
使用DapperSimpleCRUD对Repository层进行封装的更多相关文章
- 【redis】5.spring boot项目中,直接在spring data jpa的Repository层使用redis +redis注解@Cacheable直接在Repository层使用,报错问题处理Null key returned for cache operation
spring boot整合redis:http://www.cnblogs.com/sxdcgaq8080/p/8028970.html 首先,明确一下问题的场景 之前在spring boot整合re ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(4)-业务逻辑层的封装
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(4)-业务逻辑层的封装 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2) ...
- ASP.NET 一个数据访问层的封装
刚通过开通写博客的申请,向博客园的大佬致敬,由于一直以来都在网上搜索大家的思想,也有翻遍整个百度都有的找不到的时候,作为一个网民理应为互联网贡献一点东西. 下面是我工作后受一个师傅的影响对数据库访问层 ...
- 关于dao层的封装和前端分页的结合(文章有点长,耐心点哦)
任何一个封装讲究的是,实用,多状态.Action: 任何一个Action继承分页有关参数类PageManage,自然考虑的到分页效果,我们必须定义下几个分页的参数.并根据这个参数进行查值. 然 ...
- 带分页功能的SSH整合,DAO层经典封装
任何一个封装讲究的是,使用,多状态.Action: 任何一个Action继承分页有关参数类PageManage,自然考虑的到分页效果,我们必须定义下几个分页的参数.并根据这个参数进行查值. 然 ...
- angular开发中对请求数据层的封装
代码地址如下:http://www.demodashi.com/demo/11481.html 一.本章节仅仅是对angular4项目开发中数据请求封装到model中 仅仅是在项目angular4项目 ...
- DB First 中对Repository 层封装的几点小记
在数据库表创建完成的情况下,使用DB First 进行开发,封装底层会遇到一些小问题,在此记录一下,供以后参考. 主要解决的问题有: 1.EF上下文管理 2.BaseRepository的封装 3.E ...
- 通过对DAO层的封装减少数据库操作的代码量
在学框架之前,写项目时总是要花大量的时间去写数据库操作层代码,这样会大大降低我们的效率,为了解决这个问题,我花了两天时间利用反射机制和泛型将DAO层进行了封装,这样我们只需要写sql语句,不需要再写 ...
- JavaEE中的MVC(一)Dao层彻底封装
最近Android工作实在难找,考虑是不是该转行做Java了,今天开始,花几天的事件,研究一下JavaEE各层优化. 首先是Dao层 增删改方法封装 使用PreparedStatement执行一条Sq ...
随机推荐
- 关于时间对象Date()
今天使用XCUI开发过程中发现另一个诡异的问题,就是年月日初始化之后默认时分秒的问题. 问题发生在重构交互日志页面的时候,原来的老页面是这样的: 进入了交互日志页面之后,默认会初始化时间为今天的凌晨到 ...
- Java类加载原理解析
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt229 2 Java虚拟机类加载器结构简述 2.1 JVM三 ...
- POJ 1236 tarjan
Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 19613 Accepted: 77 ...
- 【转】为什么选择Spring Boot作为微服务的入门级微框架
本文为普元云计算高级工程师许二虎在普元云计算架构设计群的微课堂分享.如需加入普元新一代数字化企业云平台研发设计群参与微课堂.架构设计与讨论直播,请直接回复此公众号:"加群 姓名 公司 职位 ...
- MySQL (二)-- 数据类型(列类型)、数值类型、 小数类型、 时间日期类型、 字符串类型 、 MySQL记录长度、列属性
1 数据类型(列类型) 所谓的数据类型:对数据进行统一的分类,从系统的角度出发是为了能够使用统一的方式进行管理,更好的利用有限的空间. SQL中将数据类型分成了三大类: 2 数值类型 数值类型数据:都 ...
- 团队作业4——第一次项目冲刺(Alpha版本)4.24
·本次会议为第三次Scrum Meeting会议~ ·本次会议项目经理召开时间为15:00,在教学楼教室召开,召开时长约30分钟,探讨了昨日任务的进展.遇到的困难以及后续所要开展的工作. 1.站立式会 ...
- Java中如何引入结对编程
引自微信: 很多同学说: 我程序写得好,ACM比赛能得分, 就好了,软件工程讲的那些有用么? 有些学校的 <软件工程>课,由于要求太简单,反而不能说明软件工程的价值. 其实好办, 让学生结 ...
- 201521123079《java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) ...
- apache: eclipse的tomcatPluginV插件下载
Sysdeo Eclipse Tomcat Launcher plugin Plugin features Support and contributions Download Installatio ...
- Python学习笔记013_正则表达式
Python中的正则表达式是通过 re 模块实现的. 通配符 . 表示除了换行以外的任何字符; 编写正则表达式时使用 r're' , r + 正则表达式内容 >>> impor ...