基于IBatisNet(MyBatis.Net)的Repository

说明什么的就不写了,直接上代码,如果不了解Repository,那就先去百度或者谷歌下……

IRepository接口约束

    using IBatisNet.DataAccess.Interfaces;
    public interface IRepository<T> : IDao
        where T : class
    {
        /// <summary>
        /// 新增
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        bool Insert(T entity);
        /// <summary>
        /// 编辑
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        bool Update(T entity);
        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        bool Delete(object entity);
        /// <summary>
        /// 单个查询
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        T QueryByKey(object entity);
        /// <summary>
        /// 查找数据集合
        /// </summary>
        /// <param name="searchEntity"></param>
        /// <param name="totalCount"></param>
        /// <returns></returns>
        IList<T> FindAll<T1>(T1 searchEntity, out int totalCount)
            where T1 : BaseQuery;
    }

BaseQuery查询实体

    [Serializable]
    public class BaseQuery
    {
        public int StartIndex
        {
            get
            {
                if (this.PageSize <= 0 || this.PageIndex < 0)
                {
                    return 0;
                }
                return this.PageSize * this.PageIndex;
            }
        }
        public int EndIndex
        {
            get
            {
                if (this.PageSize <= 0 || this.PageIndex < 0)
                {
                    return 0;
                }
                return this.PageSize * this.PageIndex + this.PageSize;
            }
        }
        public int PageSize { get; set; }
        /// <summary>
        /// 页码,从0开始计算
        /// </summary>
        public int PageIndex { get; set; }
        /// <summary>
        /// 修正页码,如果传入的页码索引大于最大页码数,将页码修正为最后一页
        /// </summary>
        /// <param name="totalCount"></param>
        public void FixPageIndex(int totalCount)
        {
            if (this.PageIndex < 0 || this.PageSize <= 0 || totalCount <= 0)
            {
                this.PageIndex = 0;
                return;
            }
            if (this.StartIndex >= totalCount)
            {
                this.PageIndex = totalCount / this.PageSize;
                if (totalCount % this.PageSize > 0)
                {
                    this.PageIndex++;
                }
                this.PageIndex--;
            }
        }
    }

Repository抽象基类,所有定义的抽象属性均为SqlMap中statements节点sql对应的id,需在子类中实际指定

    using IBatisNet.DataMapper;
    using System.Linq.Expressions;

    public abstract class Repository<T> : IRepository<T>
        where T : class
    {
        protected virtual ISqlMapper Mapper
        {
            get { return SqlMapperHelper.GetMapper(); }
        }
        /// <summary>
        /// 新增
        /// </summary>
        protected abstract string InsertStatement { get; }
        /// <summary>
        /// 编辑
        /// </summary>
        protected abstract string UpdateStatement { get; }
        /// <summary>
        /// 删除
        /// </summary>
        protected abstract string DeleteStatement { get; }
        /// <summary>
        /// 单查
        /// </summary>
        protected abstract string QueryObjectStatement { get; }
        /// <summary>
        /// Count
        /// </summary>
        protected abstract string QueryCountStatement { get; }
        /// <summary>
        /// 分页查询
        /// </summary>
        protected abstract string QueryPagedListStatement { get; }
        /// <summary>
        /// Full Query
        /// </summary>
        protected abstract string QueryAllStatement { get; }

        public virtual bool Insert(T entity)
        {
            return this.Mapper.Insert(this.InsertStatement, entity) != null;
        }

        public virtual bool Update(T entity)
        {
            return this.Mapper.Update(this.UpdateStatement, entity) > 0;
        }

        public virtual bool Delete(object entity)
        {
            return this.Mapper.Delete(this.DeleteStatement, entity) > 0;
        }

        public virtual T QueryByKey(object entity)
        {
            return this.Mapper.QueryForObject<T>(this.QueryObjectStatement, entity);
        }

        public virtual IList<T> FindAll<T1>(T1 searchEntity, out int totalCount) where T1 : BaseQuery
        {
            return this.FindAll<T, T1>(searchEntity, this.QueryCountStatement, this.QueryPagedListStatement,
                this.QueryAllStatement, out totalCount);
        }

        /// <summary>
        /// 分页查询(如果searchEntity没有指定或者指定Size,Index不正确,则查询所有数据)
        /// </summary>
        /// <typeparam name="T1"></typeparam>
        /// <typeparam name="T2"></typeparam>
        /// <param name="searchEntity"></param>
        /// <param name="queryCountStatement"></param>
        /// <param name="queryPagedListStatement"></param>
        /// <param name="queryAllStatement"></param>
        /// <param name="totalCount"></param>
        /// <returns></returns>
        protected IList<T1> FindAll<T1, T2>(T2 searchEntity,
            string queryCountStatement, string queryPagedListStatement, string queryAllStatement,
            out int totalCount) where T2 : BaseQuery
        {
            IList<T1> list = null;
            if (searchEntity != null && searchEntity.PageIndex >= 0 && searchEntity.PageSize > 0)
            {
                //分页
                totalCount = this.Mapper.QueryForObject<int>(queryCountStatement, searchEntity);
                searchEntity.FixPageIndex(totalCount);//修正页码
                if (totalCount > 0)
                {
                    list = this.Mapper.QueryForList<T1>(queryPagedListStatement, searchEntity);
                }
            }
            else
            {
                //获取所有数据
                list = this.Mapper.QueryForList<T1>(queryAllStatement, searchEntity);
                totalCount = list.Count;
            }
            return list;
        }

        /// <summary>
        /// 单数据库事务
        /// </summary>
        /// <param name="fun"></param>
        /// <returns></returns>
        protected bool Transaction(Func<bool> fun)
        {
            this.Mapper.BeginTransaction();
            try
            {
                bool result = fun();
                if (result)
                {
                    this.Mapper.CommitTransaction();
                }
                else
                {
                    this.Mapper.RollBackTransaction();
                }
                return result;
            }
            catch
            {
                this.Mapper.RollBackTransaction();
                //TODO:log
                throw;
            }
            finally
            {
            }
        }
    }

SqlMapperHelper帮助类,此处暂时随便写的,如果多数据库,此部分可以与Repository部分联合调整

    internal static class SqlMapperHelper
    {
        public static ISqlMapper GetMapper()
        {
            return Mapper.Instance();
        }
    }

实际的使用例子,IMenu继承自IRepository<Menu>,接口声明就不贴了,只贴实现类代码

    public class MenuDataAccess : Repository<Menu>, IMenu
    {
        #region Repository
        protected override string InsertStatement
        {
            get { return "RBAC.insertMenu"; }
        }

        protected override string UpdateStatement
        {
            get { return "RBAC.updateMenu"; }
        }

        protected override string DeleteStatement
        {
            get { return "RBAC.deleteMenu"; }
        }

        protected override string QueryObjectStatement
        {
            get { return null; }
        }

        protected override string QueryCountStatement
        {
            get { return null; }
        }

        protected override string QueryPagedListStatement
        {
            get { return null; }
        }

        protected override string QueryAllStatement
        {
            get { return null; }
        }
        #endregion

        #region IMenu
        public MenuView GetMenu(int moduleID)
        {
            return this.Mapper.QueryForObject<MenuView>("RBAC.selectMenuView", moduleID);
        }

        public IList<MenuView> FindAllView(int appID)
        {
            return this.Mapper.QueryForList<MenuView>("RBAC.selectMenuViews", appID);
        }

        public bool AddMenu(Module module, Menu menu)
        {
            return this.Transaction(() => new ModuleDataAccess().Insert(module) && this.FillInsertMenu(module, menu));
        }

        private bool FillInsertMenu(Module module, Menu menu)
        {
            menu.ModuleID = module.ModuleID;
            return this.Insert(menu);
        }

        public bool UpdateMenu(Module module, Menu menu)
        {
            return this.Transaction(() => new ModuleDataAccess().Update(module) && this.Update(menu));
        }

        public bool DeleteMenu(int moduleID)
        {
            return this.Transaction(() => this.Delete(moduleID) && new ModuleDataAccess().Delete(moduleID));
        }

        public bool UpdateSortNum(int moduleID, byte sortNum, int? parentModuleID)
        {
            return this.Mapper.Update("RBAC.updateMenuSortNum", new { ModuleID = moduleID, SortNum = sortNum, ParentModuleID = parentModuleID }) > 0;
        }
        #endregion
    }
时间: 2024-11-05 18:56:15

基于IBatisNet(MyBatis.Net)的Repository的相关文章

基于spring+mybatis+atomikos+jta实现分布式事务(2)-动态切换数据源

本文介绍基于spring+mybatis+atomikos+jta实现分布式事务,由程序动态切换数据源,通过atomikos可实现分布式事务一致性. 版本:spring-3.2.9.RELEASE.mybatis-3.4.4.atomikos-4.0.5.jdk1.8 1,maven配置文件pom.xml如下: <!-- test --> <dependency> <groupId>junit</groupId> <artifactId>juni

搭建基于Spring+MyBatis+Jersey的Maven-Web系统

搭建基于Spring+MyBatis+Jersey的Maven-Web系统 版本: Spring(4.1.0.RELEASE) + MyBatis(3.2.7)+ Jersey(1.18.1) 工具: IntelliJ + Maven 详细步骤如下: 创建一个基于maven-archetype-webapp的项目 打开pom文件,添加spring,jersey,jersey-spring依赖的库     <properties>         <project.build.source

xlauch 1.0 基于springboot + mybatis + beetls 快速开发脚手架

xlauch xlauch 是基于springboot + mybatis + beetls 快速开发脚手架, 包含了用户管理,组织机构管理,角色管理,功能点管理,菜单管理,权限分配,数据权限分配,代码生成,二次开发等功能 系统基于Spring Boot 1.5技术,前端采用了easyUI.数据库以MySQL为实例 . QQ 交流群(224708661) gitee下载地址:[email protected]:huangxy3/xlauch.git 1 使用说明 1.1 安装说明 1.1.1 导

基于springboot&amp;mybatis的销售管理系统轻量级销售团队管理-java销售管理系统

基于springboot&mybatis的销售管理系统轻量级销售团队管理-java销售管理系统 1.包含源程序,数据库脚本.代码和数据库脚本都有详细注释.2.课题设计仅供参考学习使用,可以在此基础上进行扩展完善开发环境:Eclipse for J2EE, MYSQL5.1, JDK1.8, Tomcat 7涉及技术点:MVC模式.Mybatis.SpringBoot.HTML.JavaScript.CSS.JQUERY.DWR.Ajax等系统采用Mybatis框架实现ORM对象关系映射,前台JS

基于SpringBoot + Mybatis实现SpringMVC Web项目

一.热身 一个现实的场景是:当我们开发一个Web工程时,架构师和开发工程师可能更关心项目技术结构上的设计.而几乎所有结构良好的软件(项目)都使用了分层设计.分层设计是将项目按技术职能分为几个内聚的部分,从而将技术或接口的实现细节隐藏起来. 从另一个角度上来看,结构上的分层往往也能促进了技术人员的分工,可以使开发人员更专注于某一层业务与功能的实现,比如前端工程师只关心页面的展示与交互效果(例如专注于HTML,JS等),而后端工程师只关心数据和业务逻辑的处理(专注于Java,Mysql等).两者之间

基于SpringBoot + Mybatis实现 MVC 项目

1.预览: (1)完整项目结构 (2) 创建数据库.数据表: [user.sql] SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(11) NOT NULL, `name` varchar(2

基于springmvc mybatis junit搭建分工程,分模块的web工程框架(一)

1.创建macow工程 一,new maven project --->创建Create a simple project勾选上 修改pom.xml的packaging为pom Project configuration is not up-to-date with pom.xml. Run Maven->Update Project or use Quick Fix. 这个错误直接maven,update project就好了 二, 在root工程上邮件new maven module,mo

基于springMVC+mybatis的实践记录

目前在做一个项目用到springMVC+mybatis,由于之前没学过,上手有点难,因此写下随笔记录下: 写了四个接口 第一个接口:GET请求,查询返回列表 查找 专户报告列表 -----GEThttp://localhost:8080/fee/investWeeklyReport/getByAccoutId 通过postman 模拟各种参数 { "code": 0, "message": "成功", "data": { &q

基于SpringBoot+Mybatis+AntDesign快速开发平台,Jeecg-Boot 1.1 版本发布

Jeecg-Boot 1.1 版本发布,初成长稳定版本 导读     平台首页UI升级,精美的首页支持多模式 提供4套代码生成器模板(支持单表.一对多) 集成Excel简易工具类,支持单表.一对多导入导出 代码生成器,生成代码自带Excel导入导出,表单提供弹出风格和抽屉表单选择 系统权限大升级,支持按钮权限,数据权限(可控制不同人看不同数据) 数据日志记录功能,可记录数据变更日志,对比版本功能 查询过滤器开发完成,根据页面配置自动生成查询条件,支持多种匹配规则 Online在线报表配置功能完成