Mybatis通用DAO設計封裝(mybatis)

jopen 8年前發布 | 43K 次閱讀 MyBatis3 持久層框架

說明: 
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); 
    }

根據個人需要需要手動修改點才可運行

來自: http://zhaoshijie.iteye.com/blog/2003209

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!