基於mybatis的BaseDao及BaseService深度結合(轉)


原文地址:http://zhaoshijie.iteye.com/blog/2003209

關鍵字: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);
// }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM