使用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 ...
随机推荐
- Opencv入门-第一回-梦牵机器视觉翼,初识Opencv域(安装Opencv)
各位看官,您是不是瞅着Opencv进来的?(你这不是废话吗>_>) 这Opencv(开源计算机视觉库)啊,说来话长,最初是上个世纪末(1999年)由Intel建立起来的.近十多年人工智能这 ...
- 【C++小白成长撸】--矩阵乘法程序
矩阵乘法是大学矩阵课程中,相比矩阵加减法比较困难的部分. 矩阵乘法的原理: 矩阵乘法在代码中实现 得到目标矩阵的一个元素,涉及两个求和符号,一个求和符号一个for循环,两个求和符号两个for循环,再加 ...
- 图论中DFS与BFS的区别、用法、详解…
DFS与BFS的区别.用法.详解? 写在最前的三点: 1.所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次. 2.实现bfs和dfs都需要解决的一个问题就是如何存储图.一般有两种方法:邻接矩阵 ...
- css3 如何实现圆边框的渐变
使用 css 实现下面效果: 把效果分解. 代码一: <style> .helper1 { height: 40px; padding: 15px; background: -webkit ...
- MyEclipse安装步骤和破解
Myeclipse的安装步骤 MyEclipse简介: MyEclipse,是在eclipse 基础上加上自己的插件开发而成的功能强大的企业级集成开发环境,主要用于Java.Java EE以及移动应用 ...
- About Cheating and Plagiarism
我先描述一下此次事件的具体经过.昨天3月15号的晚上十点,是第四次作业的deadline.在15号之前,只有五位同学提交了作业,而在临近deadline的这几个小时内密密麻麻地提交了二十多份作业.和第 ...
- 201521123003《Java程序设计》第2周学习总结
1. 本章学习总结 你对于本章知识的学习总结 学习了java中各种数据类型的使用 掌握了基本类型的转换 了解string和stringbuilder的区别以及字符串池的原理 学会了使用package管 ...
- Java实现猜字母游戏
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABRQAAAE9CAYAAAB6Cu4FAAAgAElEQVR4nOy995OUR77u2f/H3tjdey ...
- Java课程设计—学生成绩管理系统(201521123004-林艺如)
1.团队课程设计博客 团队课程设计博客链接 2.个人负责模块或任务说明 ①.Menu Menu.jsp 在页面中给出提示,用HTML的 MenuTeacher.jsp 利用Menu.jsp进行具体化完 ...
- 201521123085 《Java程序设计》第11周学习总结
1. 本周学习总结 2. 书面作业 本次PTA作业题集多线程 互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synchronized修饰方法实现互斥同步访问,还有 ...