日期:2014-05-16  浏览次数:20467 次

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