说明什么的就不写了,直接上代码,如果不了解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 }
基于IBatisNet(MyBatis.Net)的Repository
原文地址:http://blog.csdn.net/starfd/article/details/43482263