Mybatis通用DAO设计封装(mybatis)
jopen
9年前
说明:
mybatis默认分页机制为逻辑分页,所以要处理成物理分页需要自己写一个拦截器(当然也可以不用这个分页机制,自己直接在SQL文件中实现也是可以的)
RowBounds rowBound = new RowBounds(start, pageSize);
具体封装如下:
package util.dao.impl; import java.io.Serializable; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.apache.ibatis.session.ResultHandler; import org.apache.ibatis.session.RowBounds; import org.mybatis.spring.support.SqlSessionDaoSupport; import util.bean.BeanMapUtil; import util.dao.IBaseGenericDAO; import util.exception.BaseDaoException; import util.page.GenericDefaultPage; import util.page.IGenericPage; import util.reflect.ReflectGeneric; /** * 基于Mybatis的基础泛型DAO实现类。 * * @author 赵士杰 * * @param <T> 业务实体类型 * @param <ID> ID类型 ,如:String、Long、Integer 等 */ public abstract class MybatisBaseGenericDAOImpl<T, ID extends Serializable> extends SqlSessionDaoSupport implements IBaseGenericDAO<T, ID> { public static final String SQLNAME_SEPARATOR = "."; public static final String SQL_SAVE = "save"; public static final String SQL_UPDATE = "update"; public static final String SQL_GETBYID = "getById"; public static final String SQL_DELETEBYID = "deleteById"; public static final String SQL_DELETEBYIDS = "deleteByIds"; public static final String SQL_FINDPAGEBY = "findPageBy"; public static final String SQL_FINDLISTBY = "findListBy"; public static final String SQL_GETCOUNTBY = "getCountBy"; private static final String SORT_NAME = "SORT"; private static final String DIR_NAME = "DIR"; /** 不能用于SQL中的非法字符(主要用于排序字段名) */ public static final String[] ILLEGAL_CHARS_FOR_SQL = {",", ";", " ", "\"", "%"}; /** * 获取默认SqlMapping命名空间。 * 使用泛型参数中业务实体类型的全限定名作为默认的命名空间。 * 如果实际应用中需要特殊的命名空间,可由子类重写该方法实现自己的命名空间规则。 * @return 返回命名空间字符串 */ @SuppressWarnings("unchecked") protected String getDefaultSqlNamespace() { Class<T> clazz = ReflectGeneric.getClassGenricType(this.getClass()); String nameSpace = clazz.getName(); return nameSpace; } /** * 将SqlMapping命名空间与给定的SqlMapping名组合在一起。 * @param sqlName SqlMapping名 * @return 组合了SqlMapping命名空间后的完整SqlMapping名 */ protected String getSqlName(String sqlName) { return sqlNamespace + SQLNAME_SEPARATOR + sqlName; } /** * SqlMapping命名空间 */ private String sqlNamespace = getDefaultSqlNamespace(); /** * 获取SqlMapping命名空间 * @return SqlMapping命名空间 */ public String getSqlNamespace() { return sqlNamespace; } /** * 设置SqlMapping命名空间。 * 此方法只用于注入SqlMapping命名空间,以改变默认的SqlMapping命名空间, * 不能滥用此方法随意改变SqlMapping命名空间。 * @param sqlNamespace SqlMapping命名空间 */ public void setSqlNamespace(String sqlNamespace) { this.sqlNamespace = sqlNamespace; } /** * 生成主键值。 * 默认情况下什么也不做; * 如果需要生成主键,需要由子类重写此方法根据需要的方式生成主键值。 * @param ob 要持久化的对象 */ protected void generateId(T ob) { } /* (non-Javadoc) * @see com.harmony.framework.dao.mybatis.IBaseGenericDAO#save(java.lang.Object) */ public Integer save(T ob) { generateId(ob); return this.getSqlSession().insert( getSqlName(SQL_SAVE), ob); } /* (non-Javadoc) * @see com.harmony.framework.dao.mybatis.IBaseGenericDAO#update(java.lang.Object) */ public Integer update(T ob) { return this.getSqlSession().update( getSqlName(SQL_UPDATE), ob); } /* (non-Javadoc) * @see com.harmony.framework.dao.mybatis.IBaseGenericDAO#getById(java.lang.String) */ @SuppressWarnings("unchecked") public T getById(String id) { return (T) this.getSqlSession().selectOne( getSqlName(SQL_GETBYID), id); } /* (non-Javadoc) * @see com.harmony.framework.dao.mybatis.IBaseGenericDAO#deleteByIds(ID[]) */ public Integer deleteByIds(ID[] ids) { return this.getSqlSession().delete( getSqlName(SQL_DELETEBYIDS), ids); } /* (non-Javadoc) * @see com.harmony.framework.dao.mybatis.IBaseGenericDAO#deleteById(java.io.Serializable) */ public Integer deleteById(ID id){ return this.getSqlSession().delete( getSqlName(SQL_DELETEBYID), id); } /* (non-Javadoc) * @see com.harmony.framework.dao.mybatis.IBaseGenericDAO#findPageBy(java.lang.Object, int, int, java.lang.String, java.lang.String) */ @SuppressWarnings("unchecked") public IGenericPage<T> findPageBy(T param, int pageNo, int pageSize, String sort, String dir) { // 获取满足条件的记录总数,没有记录时返回空页数据 int count = getCountBy(param); if (count < 1) { return GenericDefaultPage.emptyPage(); } Map<String, Object> paramMap = null; try{ paramMap = BeanMapUtil.bean2Map(param); }catch(Exception e){ throw new BaseDaoException("获取参数失败", e); } // Where过滤条件 // paramMap.put("param", param); // 排序条件 if (sort != null) { // 排序字段不为空,过滤其中可能存在的非法字符 sort = filterIllegalChars(sort, ILLEGAL_CHARS_FOR_SQL); } if (StringUtils.isEmpty(sort) || StringUtils.isEmpty(dir)) { // paramMap.put("sort", null); // paramMap.put("dir", null); } else { paramMap.put(SORT_NAME, sort); paramMap.put(DIR_NAME, dir); } // 分页条件 int start = GenericDefaultPage.getStartOfPage( pageNo, pageSize) - 1; RowBounds rowBound = new RowBounds(start, pageSize); List<T> lst = this.getSqlSession().selectList( getSqlName(SQL_FINDPAGEBY), paramMap, rowBound); return new GenericDefaultPage<T>(pageNo, pageSize, lst, count); } /* (non-Javadoc) * @see com.harmony.framework.dao.mybatis.IBaseGenericDAO#getCountBy(java.lang.Object) */ public Integer getCountBy(T param) { Map<String, Object> paramMap = null; try{ paramMap = BeanMapUtil.bean2Map(param); }catch(Exception e){ throw new BaseDaoException("获取参数失败", e); } // paramMap.put("param", param); return (Integer)this.getSqlSession().selectOne( getSqlName(SQL_GETCOUNTBY), paramMap); } /* (non-Javadoc) * @see com.harmony.framework.dao.mybatis.IBaseGenericDAO#findListBy(java.lang.Object, java.lang.String, java.lang.String) */ @SuppressWarnings("unchecked") public List<T> findListBy(T param, String sort, String dir) { Map<String, Object> paramMap = null; try{ paramMap = BeanMapUtil.bean2Map(param); }catch(Exception e){ throw new BaseDaoException("获取参数失败", e); } // Where过滤条件 // paramMap.put("param", param); // 排序条件 if (sort != null) { // 排序字段不为空,过滤其中可能存在的非法字符 sort = filterIllegalChars(sort, ILLEGAL_CHARS_FOR_SQL); } if (StringUtils.isEmpty(sort) || StringUtils.isEmpty(dir)) { // paramMap.put("sort", null); // paramMap.put("dir", null); } else { paramMap.put(SORT_NAME, sort); paramMap.put(DIR_NAME, dir); } List<T> lst = this.getSqlSession().selectList( getSqlName(SQL_FINDLISTBY), paramMap); return lst; } public List<T> findListBy(T param){ return findListBy(param, null, null); } /** * 从给定字符串中将指定的非法字符串数组中各字符串过滤掉。 * @param str 待过滤的字符串 * @param filterChars 指定的非法字符串数组 * @return 过滤后的字符串 */ protected String filterIllegalChars(String str, String[] filterChars) { String rs = str; if (rs != null && filterChars != null) { for (String fc : filterChars) { if (fc != null && fc.length() > 0) { str = str.replaceAll(fc, ""); } } } return rs; } /** * 对{@link org.apache.ibatis.session.SqlSession#insert(java.lang.String, java.lang.Object)}的代理。 * 将statement包装了命名空间,方便DAO子类调用。 * @param statement 映射的语句ID * @param parameter 参数 * @return 执行结果——插入成功的记录数 * @see org.apache.ibatis.session.SqlSession#insert(java.lang.String, java.lang.Object) */ protected int insert(String statement, Object parameter) { return this.getSqlSession().insert( getSqlName(statement), parameter); } /** * 对{@link org.apache.ibatis.session.SqlSession#insert(java.lang.String)}的代理。 * 将statement包装了命名空间,方便DAO子类调用。 * @param statement 映射的语句ID * @return 执行结果——插入成功的记录数 * @see org.apache.ibatis.session.SqlSession#insert(java.lang.String) */ protected int insert(String statement) { return this.getSqlSession().insert( getSqlName(statement)); } /** * 对{@link org.apache.ibatis.session.SqlSession#update(java.lang.String, java.lang.Object)}的代理。 * 将statement包装了命名空间,方便DAO子类调用。 * @param statement 映射的语句ID * @param parameter 参数 * @return 执行结果——更新成功的记录数 * @see org.apache.ibatis.session.SqlSession#update(java.lang.String, java.lang.Object) */ protected int update(String statement, Object parameter) { return this.getSqlSession().update( getSqlName(statement), parameter); } /** * 对{@link org.apache.ibatis.session.SqlSession#update(java.lang.String)}的代理。 * 将statement包装了命名空间,方便DAO子类调用。 * @param statement 映射的语句ID * @param parameter 参数 * @return 执行结果——更新成功的记录数 * @see org.apache.ibatis.session.SqlSession#update(java.lang.String) */ protected int update(String statement) { return this.getSqlSession().update( getSqlName(statement)); } /** * 对{@link org.apache.ibatis.session.SqlSession#delete(java.lang.String, java.lang.Object)}的代理。 * 将statement包装了命名空间,方便DAO子类调用。 * @param statement 映射的语句ID * @param parameter 参数 * @return 执行结果——删除成功的记录数 * @see org.apache.ibatis.session.SqlSession#delete(java.lang.String, java.lang.Object) */ protected int delete(String statement, Object parameter) { return this.getSqlSession().delete( getSqlName(statement), parameter); } /** * 对{@link org.apache.ibatis.session.SqlSession#delete(java.lang.String)}的代理。 * 将statement包装了命名空间,方便DAO子类调用。 * @param statement 映射的语句ID * @return 执行结果——删除成功的记录数 * @see org.apache.ibatis.session.SqlSession#delete(java.lang.String) */ protected int delete(String statement) { return this.getSqlSession().delete( getSqlName(statement)); } /** * 对{@link org.apache.ibatis.session.SqlSession#selectList(java.lang.String, java.lang.Object, org.apache.ibatis.session.RowBounds)}的代理。 * 将statement包装了命名空间,方便DAO子类调用。 * @param statement 映射的语句ID * @param parameter 参数 * @param rowBounds 用于分页查询的记录范围 * @return 查询结果列表 * @see org.apache.ibatis.session.SqlSession#selectList(java.lang.String, java.lang.Object, org.apache.ibatis.session.RowBounds) */ protected List selectList( String statement, Object parameter, RowBounds rowBounds) { return this.getSqlSession().selectList( getSqlName(statement), parameter, rowBounds); } /** * 对{@link org.apache.ibatis.session.SqlSession#selectList(java.lang.String, java.lang.Object)}的代理。 * 将statement包装了命名空间,方便DAO子类调用。 * @param statement 映射的语句ID * @param parameter 参数 * @return 查询结果列表 * @see org.apache.ibatis.session.SqlSession#selectList(java.lang.String, java.lang.Object) */ protected List selectList(String statement, Object parameter) { return this.getSqlSession().selectList( getSqlName(statement), parameter); } /** * 对{@link org.apache.ibatis.session.SqlSession#selectList(java.lang.String)}的代理。 * 将statement包装了命名空间,方便DAO子类调用。 * @param statement 映射的语句ID * @return 查询结果列表 * @see org.apache.ibatis.session.SqlSession#selectList(java.lang.String) */ protected List selectList(String statement) { return this.getSqlSession().selectList( getSqlName(statement)); } /** * 对{@link org.apache.ibatis.session.SqlSession#selectOne(java.lang.String, java.lang.Object)}的代理。 * 将statement包装了命名空间,方便DAO子类调用。 * @param statement 映射的语句ID * @param parameter 参数 * @return 查询结果对象 * @see org.apache.ibatis.session.SqlSession#selectOne(java.lang.String, java.lang.Object) */ protected Object selectOne(String statement, Object parameter) { return this.getSqlSession().selectOne( getSqlName(statement), parameter); } /** * 对{@link org.apache.ibatis.session.SqlSession#selectOne(java.lang.String)}的代理。 * 将statement包装了命名空间,方便DAO子类调用。 * @param statement 映射的语句ID * @return 查询结果对象 * @see org.apache.ibatis.session.SqlSession#selectOne(java.lang.String) */ protected Object selectOne(String statement) { return this.getSqlSession().selectOne( getSqlName(statement)); } /** * 对{@link org.apache.ibatis.session.SqlSession#selectMap(java.lang.String, java.lang.Object, java.lang.String, org.apache.ibatis.session.RowBounds)}的代理。 * 将statement包装了命名空间,方便DAO子类调用。 * @param statement 映射的语句ID * @param parameter 参数 * @param mapKey 数据mapKey * @param rowBounds 用于分页查询的记录范围 * @return 查询结果Map * @see org.apache.ibatis.session.SqlSession#selectMap(java.lang.String, java.lang.Object, java.lang.String, org.apache.ibatis.session.RowBounds) */ protected Map selectMap(String statement, Object parameter, String mapKey, RowBounds rowBounds) { return this.getSqlSession().selectMap( getSqlName(statement), parameter, mapKey, rowBounds); } /** * 对{@link org.apache.ibatis.session.SqlSession#selectMap(java.lang.String, java.lang.Object, java.lang.String)}的代理。 * 将statement包装了命名空间,方便DAO子类调用。 * @param statement 映射的语句ID * @param parameter 参数 * @param mapKey 数据mapKey * @return 查询结果Map * @see org.apache.ibatis.session.SqlSession#selectMap(java.lang.String, java.lang.Object, java.lang.String) */ protected Map selectMap( String statement, Object parameter, String mapKey) { return this.getSqlSession().selectMap( getSqlName(statement), parameter, mapKey); } /** * 对{@link org.apache.ibatis.session.SqlSession#selectMap(java.lang.String, java.lang.String)}的代理。 * 将statement包装了命名空间,方便DAO子类调用。 * @param statement 映射的语句ID * @param mapKey 数据mapKey * @return 查询结果Map * @see org.apache.ibatis.session.SqlSession#selectMap(java.lang.String, java.lang.String) */ protected Map selectMap(String statement, String mapKey) { return this.getSqlSession().selectMap( getSqlName(statement), mapKey); } /** * 对{@link org.apache.ibatis.session.SqlSession#select(java.lang.String, java.lang.Object, org.apache.ibatis.session.RowBounds, org.apache.ibatis.session.ResultHandler)}的代理。 * 将statement包装了命名空间,方便DAO子类调用。 * @param statement 映射的语句ID * @param parameter 参数 * @param rowBounds 用于分页查询的记录范围 * @param handler 结果集处理器 * @see org.apache.ibatis.session.SqlSession#select(java.lang.String, java.lang.Object, org.apache.ibatis.session.RowBounds, org.apache.ibatis.session.ResultHandler) */ protected void select(String statement, Object parameter, RowBounds rowBounds, ResultHandler handler) { this.getSqlSession().select( getSqlName(statement), parameter, rowBounds, handler); } /** * 对{@link org.apache.ibatis.session.SqlSession#select(java.lang.String, java.lang.Object, org.apache.ibatis.session.ResultHandler)}的代理。 * 将statement包装了命名空间,方便DAO子类调用。 * @param statement 映射的语句ID * @param parameter 参数 * @param handler 结果集处理器 * @see org.apache.ibatis.session.SqlSession#select(java.lang.String, java.lang.Object, org.apache.ibatis.session.ResultHandler) */ protected void select( String statement, Object parameter, ResultHandler handler) { this.getSqlSession().select( getSqlName(statement), parameter, handler); } /** * 对{@link org.apache.ibatis.session.SqlSession#select(java.lang.String, org.apache.ibatis.session.ResultHandler)}的代理。 * 将statement包装了命名空间,方便DAO子类调用。 * @param statement 映射的语句ID * @param handler 结果集处理器 * @see org.apache.ibatis.session.SqlSession#select(java.lang.String, org.apache.ibatis.session.ResultHandler) */ protected void select(String statement, ResultHandler handler) { this.getSqlSession().select( getSqlName(statement), handler); }
根据个人需要需要手动修改点才可运行