使用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 ...
随机推荐
- Net分布式系统之七:日志采集系统(1)
日志对大型应用系统或者平台尤其重要,系统日志采集.分析是系统运维.维护及用户分析的基础. 一.系统日志分类 一般系统日志可分为三大类: 1.用户行为日志:通过采集系统用户使用系统过程中,一系列的操作日 ...
- 安卓两个build.gradle的区别
作为安卓入门选手,在导入第三方的时候才发现居然有两个build.gradle,我说咋不对啊,原来是导错了(可能是因为我没有看安卓培训的视频吧). 那么就说一下这两个的作用(一个Project的,一个M ...
- Angular+ionic2 web端 启动程序出现短暂 白屏或黑屏 的处理小妙招
在ionic2项目启动是会出现短暂的白屏或者黑屏,虽然很短,但是用户体验不太好.上网查了相关的资料,都是针对打包APP的解决办法,针对浏览器端使用的项目没有效果,所以自己写了样式,巧妙的避开这个问题, ...
- 吐槽下微软的vs code编辑器
缺点:不能同时打开多个文件夹(打开多个文件夹得先ctrl+shift+N窗口或者除非你的所有项目文件都在同一个文件夹目录下) 优点是支持用户设置以及提供很多插件 // 将设置放入此文件中以覆盖默认设置 ...
- 201521123098 《Java程序设计》 第4周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 1. 学习了继承的基本含义,用"class 子类名 extend 父类名" ...
- 201521123006 《Java程序设计》第1周学习总结
1. 本章学习总结 (1)java在使用的过程中可以发现其本身有着许多为了节约资源而作的设计,而java根据其应用领域分为了三大平台:Java SE.Java ME与Java EE.在本周的学习中我们 ...
- 12个Sublime Text应用技巧和诀窍
本文为您提供Sublime Text编辑器的12个技巧和诀窍,深入挖掘这个看似简洁的代码编辑器,背后所隐藏的实现各种高级功能的无限可能. 1) 选择 以下是一些Sublime Text选择文本的快捷键 ...
- 201521123035 《Java程序设计》第九周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 题目5-1 1.常用异常 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现 ...
- 201521123075 《Java程序设计》第13周学习总结
1. 本周学习总结 协议 网络中为了进行数据交换(通信)而建立的规则.标准或约定(=语义+语法+规则),比如http, ftp等 IP层协议(Internet Protocol) Internet上的 ...
- java.lang.IllegalArgumentException: object is not an instance of declaring class
今天在使用反射的时候,出现了java.lang.IllegalArgumentException: object is not an instance of declaring class错误-具体是 ...