Spring-mybatis 抽取 baseDao。


抽取BaseDao是我們開發WEB應用里常用的做法,基本上都是根據數據庫框架的特性抽取出帶簡單增刪查改分頁的baseDao。

最近在學習MyBaties,因為項目上要用到Struts2-Spring-mybatis架構。所以在抽取baseDao的時候,自己總結了mybatis的特性,對baseDao進行簡單封裝。

對於baseDao,我只取出了以下幾個方法

package cn.tanjiay.mbt.base;

import java.util.List;

import cn.tanjiay.mbt.pojo.PageNumber;
import cn.tanjiay.mbt.pojo.QueryObject;

    /**
     * 通用泛型DAO基類
     * @author g
     *
     * @param <T>
     */
public interface BaseDao<T> {
    /**
     * 對對象進行持久化操作,如果成功則返回持久化后的ID
     * 失敗則返回null
     * @param obj
     * @return
     */
    void save(T obj);
    
    /**
     * 刪除指定id的持久化對象
     * @param id
     */
    void delete(T obj);
    /**
     * 修改指定的持久化對象
     * @param id
     * @param obj
     */
    void update(T obj);
    
    /**
     * 返回持久化對象
     * @param id
     * @return 找到則返回,否則返回空
     */
    T get(Integer id);
    
    /**
     * 返回所有持久化對象
     * @return
     */
    List<T> list();
    
    /**
     * 傳入頁碼對象,進行分頁查詢
     * @param pn
     * @return
     */
    List<T> list(PageNumber pn);
    List<T> list(QueryObject<T> qo);
}

其中PageNumber是個頁碼對象,里面帶3個屬性:開始碼、每頁大小、頁碼。

這個baseDao要怎么實現呢?

我們知道mybatis里,操作數據庫是使用SqlSession.insert\delete\select...等方法,這些方法一般帶兩個參數。

如session.insert("cn.xxx.mapper.save",user)里,第一個參數是mapper.xml里的namespace+方法名,第二個參數就是傳入對象。那我們可以利用這個特性,約定好基本的增刪查改方法:save\delete\update\get\list.

在這里我寫了一個生成"路徑"的方法,即生成第一個參數的方法:getMethodPath(String methodType)

   private final String path = "cn.tanjiay.mbt.mapper.";
    private String getMethodPath(String methodType){
        return path + type.getSimpleName() + "Mapper." + methodType;
    }

這個方法很簡單,如果傳入“save”,當前Dao的泛型為User,即生成cn.tanjiay.mbt.mapper.UserMapper.save。

而我所有insert方法都約定好叫save,那我的baseDaoImpl里面的方法是這樣寫的

    
    public void save(T obj) {
        session.insert(getMethodPath("save"), obj);
    }

    public void delete(T obj) {
        session.delete(getMethodPath("delete"), obj);
    }

    public void update(T obj) {
        session.update(getMethodPath("update"), obj);
    }

這樣就完成了baseDao的簡單抽取。

在這里我把baseDaoImpl貼上:

package cn.tanjiay.mbt.base;

import java.lang.reflect.ParameterizedType;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.apache.ibatis.session.SqlSession;

import cn.tanjiay.mbt.pojo.PageNumber;
import cn.tanjiay.mbt.pojo.QueryObject;

/**
 * BaseDao的MyBatis實現
 * @author g
 *
 * @param <T>
 */
public class BaseDaoImpl<T> implements BaseDao<T> {
    
    @Resource(name="sqlSessionTemplate")
    private SqlSession session;
    private final String path = "cn.tanjiay.mbt.mapper.";
    private Class type;
    
    public BaseDaoImpl(){
        this.type = this.getDAOClass(); 
    }
    
    @SuppressWarnings("all")
    private Class getDAOClass(){
         Class clazz = (Class)((ParameterizedType) this.getClass().getGenericSuperclass())
            .getActualTypeArguments()[0];
         return clazz;
    }
    
    private String getMethodPath(String methodType){
        return path + type.getSimpleName() + "Mapper." + methodType;
    }
    
    public void save(T obj) {
        session.insert(getMethodPath("save"), obj);
    }

    public void delete(T obj) {
        session.delete(getMethodPath("delete"), obj);
    }

    public void update(T obj) {
        session.update(getMethodPath("update"), obj);
    }

    public T get(Integer id) {
        return session.selectOne(getMethodPath("get"),id);
    }

    public List<T> list() {
        return list(new PageNumber(1,9999));
    }

    public List<T> list(final PageNumber pn) {
        QueryObject<T> qo = new QueryObject<T>(new     HashMap()) {
            @Override
            protected void setQuery(T obj, Map<String, Object> data) {    
                this.setPageNoAndPageSize(pn.getPageNo(), pn.getPageSize());
            }
        };
        return session.selectList(getMethodPath("list"),qo);
    }

    public List<T> list(QueryObject<T> qo) {
        return session.selectList(getMethodPath("list"),qo);
    }

}

.

 
       


免責聲明!

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



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