javascript
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()) {@Overrideprotected 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);}}.
轉載于:https://www.cnblogs.com/cha1r/p/3516896.html
總結
以上是生活随笔為你收集整理的Spring-mybatis 抽取 baseDao。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信公众开发api接口
- 下一篇: QTP自动化测试框架的基础知识