- 浏览: 2239553 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (423)
- FileNet相关 (3)
- 应用服务器相关 (22)
- Java综合 (77)
- 持久层 (24)
- struts (11)
- webservice (8)
- 虚拟机 (2)
- 光盘刻录 (0)
- AD及AD集群 (1)
- JS (33)
- F5 (0)
- loadrunner8.1 (0)
- Java 反编译工具 (2)
- DataBase (62)
- ant (1)
- 操作系统 (29)
- 我的任务 (3)
- 平台架构 (16)
- 业务规则引擎 (2)
- 模板 (1)
- EJB (5)
- spring (24)
- CMMI (1)
- 项目管理 (20)
- LDAP (13)
- JMS (10)
- JSP (19)
- JBPM (2)
- web MVC框架设计思想 (2)
- 第三方支付平台 (2)
- BUG管理工具 (1)
- 垃圾站 (2)
- php (1)
- swing (1)
- 书籍 (1)
- QQ qq (2)
- 移动互联网 (26)
- 爱听的歌曲 (0)
- hadoop (4)
- 数据库 (9)
- 设计模式 (1)
- 面试经验只谈 (1)
- 大数据 (9)
- sp (1)
- 缓存数据库 (8)
- storm (2)
- taobao (2)
- 分布式,高并发,大型互联网,负载均衡 (6)
- Apache Ignite (0)
- Docker & K8S (0)
最新评论
-
wangyudong:
新版本 Wisdom RESTClienthttps://gi ...
spring rest mvc使用RestTemplate调用 -
wangyudong:
很多API doc生成工具生成API文档需要引入第三方依赖,重 ...
spring rest mvc使用RestTemplate调用 -
zhaoshijie:
cfying 写道大侠,还是加载了两次,怎么解决啊?求。QQ: ...
spring容器加载完毕做一件事情(利用ContextRefreshedEvent事件) -
xinglianxlxl:
对我有用,非常感谢
spring容器加载完毕做一件事情(利用ContextRefreshedEvent事件) -
k_caesar:
多谢,学习了
利用maven的resources、filter和profile实现不同环境使用不同配置文件
Mybatis通用DAO设计封装(mybatis)
关键字:Mybatis通用DAO设计封装(mybatis)
说明:
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);
}
// protected Integer update(String sqlName, Object param){
// return this.getSqlSession().update(sqlNamespace+"."+sqlName, param);
// }
// protected Integer save(String sqlName, Object param){
// return this.getSqlSession().insert(sqlNamespace+"."+sqlName, param);
// }
// protected Integer delete(String sqlName, Object param){
// return this.getSqlSession().delete(sqlNamespace+"."+sqlName, param);
// }
// protected Integer delete(String sqlName, Object[] param){
// return this.getSqlSession().delete(sqlNamespace+"."+sqlName, param);
// }
// protected List<Object> getMap(String sqlName, Object param){
// Map paramMap = new HashMap();
// paramMap.put("param", param);
// return this.getSqlSession().selectList(sqlNamespace+"."+sqlName, paramMap);
// }
// protected List<Object> getMap(String sqlName, Map param){
// return this.getSqlSession().selectList(sqlNamespace+"."+sqlName, param);
// }
// protected List findPageBy(String sqlName, Object param,int pageNo, int pageSize,String sort,String dir){
// Map paramMap = new HashMap();
// paramMap.put("param", param);
// if (StringUtils.isEmpty(sort) || StringUtils.isEmpty(dir))
// {
// paramMap.put("sort", null);
// paramMap.put("dir", null);
// }
// int start =0;
// if (pageNo > -1)
// start = (pageNo - 1) * pageSize;
// RowBounds rowBound = new RowBounds(start,pageSize);
// List lst = this.getSqlSession().selectList(sqlNamespace+"."+sqlName, paramMap,rowBound);
// return lst;
// }
//
// protected Integer getCountBy(String sqlName, Object param){
// Map paramMap = new HashMap();
// paramMap.put("param", param);
// return (Integer)this.getSqlSession().selectOne(sqlNamespace+"."+sqlName, paramMap);
// }
// protected Object getBy(String sqlName, String id){
// return this.getSqlSession().selectOne(sqlNamespace+"."+sqlName, id);
// }
// protected List getListBy(String sqlName,String id) {
// return this.getSqlSession().selectList(sqlNamespace+"."+sqlName, id);
// }
// protected List findListBy(String sqlName,Object[] params) {
// return this.getSqlSession().selectList(sqlNamespace+"."+sqlName, params);
// }
// protected Object getBy(String sqlName,Object param) {
// return this.getSqlSession().selectOne(sqlNamespace+"."+sqlName, param);
// }
// protected List findByParam(String sqlName,Object param) {
// return this.getSqlSession().selectList(sqlNamespace+"."+sqlName, param);
// }
}
说明:
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);
}
// protected Integer update(String sqlName, Object param){
// return this.getSqlSession().update(sqlNamespace+"."+sqlName, param);
// }
// protected Integer save(String sqlName, Object param){
// return this.getSqlSession().insert(sqlNamespace+"."+sqlName, param);
// }
// protected Integer delete(String sqlName, Object param){
// return this.getSqlSession().delete(sqlNamespace+"."+sqlName, param);
// }
// protected Integer delete(String sqlName, Object[] param){
// return this.getSqlSession().delete(sqlNamespace+"."+sqlName, param);
// }
// protected List<Object> getMap(String sqlName, Object param){
// Map paramMap = new HashMap();
// paramMap.put("param", param);
// return this.getSqlSession().selectList(sqlNamespace+"."+sqlName, paramMap);
// }
// protected List<Object> getMap(String sqlName, Map param){
// return this.getSqlSession().selectList(sqlNamespace+"."+sqlName, param);
// }
// protected List findPageBy(String sqlName, Object param,int pageNo, int pageSize,String sort,String dir){
// Map paramMap = new HashMap();
// paramMap.put("param", param);
// if (StringUtils.isEmpty(sort) || StringUtils.isEmpty(dir))
// {
// paramMap.put("sort", null);
// paramMap.put("dir", null);
// }
// int start =0;
// if (pageNo > -1)
// start = (pageNo - 1) * pageSize;
// RowBounds rowBound = new RowBounds(start,pageSize);
// List lst = this.getSqlSession().selectList(sqlNamespace+"."+sqlName, paramMap,rowBound);
// return lst;
// }
//
// protected Integer getCountBy(String sqlName, Object param){
// Map paramMap = new HashMap();
// paramMap.put("param", param);
// return (Integer)this.getSqlSession().selectOne(sqlNamespace+"."+sqlName, paramMap);
// }
// protected Object getBy(String sqlName, String id){
// return this.getSqlSession().selectOne(sqlNamespace+"."+sqlName, id);
// }
// protected List getListBy(String sqlName,String id) {
// return this.getSqlSession().selectList(sqlNamespace+"."+sqlName, id);
// }
// protected List findListBy(String sqlName,Object[] params) {
// return this.getSqlSession().selectList(sqlNamespace+"."+sqlName, params);
// }
// protected Object getBy(String sqlName,Object param) {
// return this.getSqlSession().selectOne(sqlNamespace+"."+sqlName, param);
// }
// protected List findByParam(String sqlName,Object param) {
// return this.getSqlSession().selectList(sqlNamespace+"."+sqlName, param);
// }
}
- mybatisBase.rar (1.6 MB)
- 下载次数: 442
- mybatisBase(无密码版本).rar (1.6 MB)
- 下载次数: 2437
评论
8 楼
shanglo
2017-02-02
用了泛型DAO, 那就用不了@MapperScan, DAOImpl就省不出来了;
7 楼
dabing69221
2016-10-12
感觉BaseDao封装的太厉害了,Mapper名称都规定死了
6 楼
phlsbg
2015-03-10
好像有错误,还要手工改一点点。
5 楼
liqinlulu
2014-12-14
楼主能给个测试类吗
4 楼
wzhw2008
2014-10-21
问下:代码中的dir 是用来做是什么的?
3 楼
langjuan20123855
2014-07-31
能给测试类吗?新手不熟啊,谢谢
2 楼
dreamskys2011
2014-04-09
我去。。居然需要密码。。
1 楼
umbrellall1
2014-04-09
解压密码是多少
相关推荐
使用Mybatis+Spring的源码,博客地址https://blog.csdn.net/weixin_41515594/article/details/109449066
不要忘记在映射配置中告知mybatis要封装到哪个实体类中 配置的方法:指定实体类的全限定类名 mybatis基于注解的入门案例: 把IUserDao.xml移除,在dao接口的方法上使用@Select注解,并且指定SQL语句 同时...
SpringMVC+Mybatis整合及dao、service强封装:一、SPringMVC与Mybatis框架整合,其中SpringMVC主要采用注解方式实现,Mybatis采用xml为主,对数据库开发、测试、部署环境进行分离配置;二、在封装上针对Mybatis进行...
Mybatis通用增删改查 有基础的DaoImpl
springMvc+Mybatis 最新版+Dao 层封装; 使用了 2016-07-28 maven 上下载的当前最新版本jar包 4.3.2 搭建的 springMVC + Mybatis +DAO 层封装..仅供参考学习...
NULL 博文链接:https://fanshuyao.iteye.com/blog/2413143
SpringMVC+Mybatis封装实例,主要在dao、service、controller层封装,实例可运行
mumu-core核心工具包 mumu-core是一个工具核心包,主要包含web项目经常使用的一些组件,包含: mybatis的dao封装和mybatis配置文件扫描器使用redis缓存的基本配置工具类druid数据源模型函数(加密数据库密码)基本...
MyBatis 目录(?)[-] mybatis实战教程mybatis in action之一开发环境搭建 mybatis实战教程mybatis in action之二以接口的方式编程 mybatis实战教程mybatis in action之三实现数据的增删改查 mybatis实战教程mybatis ...
4. Mybatis 是如何将 sql 执行结果封装为目标对象并返回的? 都有哪些映射形式? 5. Xml 映射文件中,除了常见的 select|insert|update|delete 标 签之外,还有哪些标签? 6. 简述 Mybatis 的插件运行原理,以及如何...
honlly-mybatis-prod mybatis mapper的封装
用界面封装逆向工程(mapper xml dao model),还有简单的server, controller
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的...
zebra-dao是在mybatis基础上进一步封装的异步DAO,同时它也支持分页功能。它的产生背景是公司要求服务完全异步化,一个服务可能包括RPC调用请求、MemCached请求、KV存储请求以及MySQL数据库调用,目前其它三种请求的...
小弟最近研究mybatis,写了个mybatis与spring4MVC结合使用的简单实例,仅供各位有兴趣的同行参考,DAO层的封装正在研究,不日上传
学习笔记——mybatis的起步(1) 1.什么是框架? 他是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题。 使用框架的好处: 框架封装了很多的细节,使开发者可以使用极简的方式实现功能。大大提高...
mybatis自动生成插件修改版-生成BEAN,DAO,SERVICE 通过数据表生成BEAN BEAN注释 封装DAO层 增删改查。MAVEN项目工程 源码噢!! 很实用的,此修改版为ITEYE 上的matychen的修改版 不错支持下,顺便赚点分。。哈哈
不要忘记在映射配置中告知mybatis要封装到哪个实体类中 配置的方法:指定实体类的全限定类名 mybatis基于注解的入门案例: 把IUserDao.xml移除,在dao接口的方法上使用@Select注解,并且指定SQL语句 同时...