/** * 查詢物流市列表 * http://localhost:8080/mall/mallLogisticsCity/getLogisticsCityList.json * @param productName * @return */ @RequestMapping("/getLogisticsCityList.json") public Object getLogisticsCityList(@RequestParam(value="cityCode",required=false)String cityCode, @RequestParam(value="provinceId",required=false)String provinceId,Model model) { log.info("LogisticsCityController.getLogisticsCityList()"); try { Map<String, Object> cxtj = new HashMap<String, Object>(); cxtj.put("cityCode", cityCode); cxtj.put("provinceId", provinceId); PagedListData pm = new PagedListData((PageList) logisticsCityService, cxtj); PageUtil page = new PageUtil(); page.setPageNow(pm.getTotalPage()); page.setDatas((List<Object>) pm.getData()); page.setPageCount(pm.getTotalRecords() / pm.getPageSize()); page.setPageRowCount(pm.getTotalRecords()); page.setPageSize(pm.getPageSize()); model.addAttribute("cxtj", cxtj); model.addAttribute("page", page); } catch (Exception e) { e.printStackTrace(); log.error("getLogisticsCityList error:" + e.getLocalizedMessage()); return "/operate/config/logistics_template"; } return "/operate/config/logistics_template"; }
以上是一個很是簡單的Controller,我這裏就簡單粗暴一點,直接上代碼,先把思路搞清楚,而後在想如何寫代碼!java
PagedListData pm = new PagedListData((PageList) logisticsCityService, cxtj);
這句話確定是調用了PageListData的構造函數,這裏是將你需傳值進去的參數封裝成map集合,另外一個就是接口,被強轉爲PageList類型
好了,咱們看看PageListData是如何寫的
package com.maidan.util; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.Collection; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.aop.support.AopUtils; import org.springframework.context.NoSuchMessageException; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import com.maidan.util.Constants; import com.maidan.util.StringUtil; public class PagedListData extends JsonReturn{ private static Log log = LogFactory.getLog(PagedListData.class); private Integer totalRecords;//總記錄數 private Integer totalPage;//當前頁 private Integer pageSize;//頁大小 private Map<String,Object> cxtj;//查詢條件 protected PageList pagelist;//結果集 //protected Map<String, String> orderMap = new LinkedHashMap<String, String>(); // //排序字段 private Collection data; private String forMethod = ""; private boolean inited = false; protected boolean hasNext = false; /** * 獲取HttpServletRequest對象 * * @return HttpServletRequest */ protected HttpServletRequest getRequest(){ return ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); } /** * 從request獲取name對應的值 * * @param name * @return * @see */ public String getParameter(String name){ return StringUtil.trim(getRequest().getParameter(name)); } /** * 爲了可使一個Manager能夠進行多個分頁添加此方法將count和doPage轉換爲count*,do**.Page * <br/>例如forMethod等於test將調用countTest,doTestPage * @param forMethod * @return */ public PagedListData forMethod(String forMethod){ this.forMethod = StringUtil.toUpperCaseAny(forMethod);; return this; } /** * 構造一個PagedListDataModel對象 * @param request * @param pagelist * @param cxtj */ public PagedListData(PageList pagelist,Map <String,Object>cxtj) { this.cxtj = cxtj; this.pagelist = pagelist; init(); } public PagedListData(PageList pagelist,Integer currentPage,Integer pageSize,Map <String,Object> cxtj) { this.cxtj =cxtj; this.pagelist = pagelist; this.pageSize = pageSize; this.totalPage =currentPage; //原有類當前頁寫成了總頁 } //初始化分頁配置 private void init(){ try{ String rows=this.getParameter("rows"); this.pageSize =(rows!=null ? Integer.valueOf(rows) : 10); }catch(Exception e){ //log.warn("在request中獲取頁大小出錯將使用默認頁大小"+Constants.DEFAULT_PAGESIZE, e); this.pageSize = 10; } if(this.pageSize==null){ //log.warn("頁大小小於1將使用默認頁大小"+Constants.DEFAULT_PAGESIZE); this.pageSize=10; } try{ String currentPage= this.getParameter("page"); this.totalPage = (currentPage!=null ? Integer.parseInt(currentPage):1); }catch(Exception e){ //log.warn("在request中獲取當前頁出錯將使用默認使用第一頁", e); this.totalPage =1; } if(this.totalPage==null){ //log.warn("當前頁小於1將使用默認頁大小"); this.totalPage=1; } } /** * 獲取分頁的數據 * @return */ public Collection getData() { if(!inited){ initData(); inited=true; } return data; } /** * 加載數據 */ private void initData(){ this.data = this.getDatas(); this.totalRecords =Integer.parseInt(this.getCount().toString()); if((this.getCount()/this.pageSize)>totalPage){ hasNext = true; } } /** * 執行forMethod對應的方法 * @param method * @param param * @return */ private Object invoke(Method method,Object []param){ try { if(AopUtils.isJdkDynamicProxy(this.pagelist)){ return Proxy.getInvocationHandler(this.pagelist).invoke(this.pagelist, method, param); } return AopUtils.invokeJoinpointUsingReflection(this.pagelist, method, param); }catch (Throwable e) { e.printStackTrace(); return null; } } /** * 返回總記錄數 * @return */ public Integer getTotalRecords() { if(!inited){ initData(); inited=true; } return totalRecords; } /** * 獲取分頁的數據 * @return */ private Collection getDatas() { if(this.pagelist!=null){ Method dompage = null; if(StringUtil.isEmpty(this.forMethod)){ return this.pagelist.doPage(this.totalPage,this.pageSize, cxtj,null,null); }else{ Class temp = AopUtils.getTargetClass(this.pagelist); String m = null; m = "do"+this.forMethod+"Page"; while(temp!=null){ try { dompage = temp.getDeclaredMethod(m, int.class,int.class,Map.class,String.class); break; } catch (NoSuchMethodException e) { temp = temp.getSuperclass(); e.printStackTrace(); } } if(temp==null){ throw new NoSuchMessageException(m+"(int start,int pagesize,Map <String,Object>cxtj) 沒有該方法"); } return (Collection) this.invoke(dompage,new Object[]{this.totalPage,pageSize,cxtj}); } } return null; } /** * 統計總記錄數 * @return */ private Long getCount(){ if(this.pagelist!=null){ String m = null; if(StringUtil.isEmpty(this.forMethod)){ return this.pagelist.count(cxtj); }else{ Method count = null; Class temp = AopUtils.getTargetClass(this.pagelist); m = "count"+this.forMethod; while(temp!=null){ try { count = temp.getDeclaredMethod(m,Map.class); break; } catch (NoSuchMethodException e) { temp = temp.getSuperclass(); e.printStackTrace(); } } if(temp==null){ throw new NoSuchMessageException(m+"(int start,int pagesize,Map <String,Object>cxtj) 沒有該方法"); } return (Long) this.invoke(count,new Object[]{cxtj}); } } return Constants.LONG_ZERO; } /** * 返回當前頁 * @return */ public Integer getTotalPage() { return totalPage; } /** * 設置當前頁在獲取總記錄數或分頁數據前有效 * @param page */ public void setTotalPage(Integer totalPage) { this.totalPage = totalPage; } /** * 獲取頁大小 * @return */ public Integer getPageSize() { return pageSize; } /** * 設置頁大小在獲取總記錄數或分頁數據前有效 * @param pageSize */ public void setPageSize(Integer pageSize) { this.pageSize = pageSize; } public boolean isHasNext() { return hasNext; } public void setHasNext(boolean hasNext) { this.hasNext = hasNext; } /* public Map<String, String> getOrderMap() { return orderMap; } *//** * 排序 * @param order 排序條件,map的key爲實體的屬性名,value可選asc或desc *//* public void setOrderMap(final Map<String, String> orderMap) { this.orderMap = orderMap; }*/ }
這裏我就簡單的講解一下web
經過這裏咱們能清晰的看到 這個類的一些屬性spring
有總記錄數 當前頁 總頁數 查詢條件 以及結果集sql
這裏就是剛剛調用的構造函數數據庫
這裏this,pagelist = pagelist 就是將某個service接口傳值進去賦值給pagelist,有什麼用呢,咱們能夠繼續往下看apache
他會執行init();方法json
進入這個方法,他會經過request域中獲取前臺穿過來的總行數量,若是值爲null那麼pageSize默認的設置爲10數組
而後去request域中獲取當前的頁數,若是是null那麼currentPage就是1 他這裏變量名稱取得不是很對,內心明白就好session
到這裏 PagedListData 中 咱們設置了當前頁 currentPage 和 每頁多少條數 pagesizemybatis
而後咱們看controller
setPageNow(pm.getTotal);
而後他這裏經過pm.getData()這個方法就獲取當前所須要的list集合,很厲害,咱們看看他是如何完成的
這裏而後進入initData()方法
他這裏加載數據中幹了兩件事情
this.getDatas() 和 this.getCount()
這兩個方法是分別獲取當前頁的List集合 和 總數量
咱們一個一個看,首先咱們看this.getDatas();
這裏是經過調用this.pagelist.doPage(........)
經過 this.pagelist.count(cxtj);
以上這裏個方法我圈起來的地方,其餘的是經過反射,說實話我是沒有看懂,只知道這裏是反射經過spring中的AOP工具類反射獲取該類class
而後經過class.getDeclaredMethod獲取該類的方法 而後 invoke去執行
我問過工資是我兩倍的這個,他是這麼說的
好吧 說的我無言以對,意思就是就你這技術看這個說明你想多了,咱們就把能搞懂的先弄懂吧
既然兩個方法都是pagelist這裏接口調用的方法 咱們在去看看Pagelist中寫了什麼
public interface PageList{ /** * 根據查詢條件查詢統計符合條件的數據的總數 * * @param cxtj 查詢條件 * @return 返回統計總數 */ Long count(Map<String,Object> cxtj); /** * 分頁查詢 * * @param start 開始記錄數 * @param pagesize 分頁大小 * @param cxtj 查詢條件 * @return 返回符合條件的數據從start開始最多pagesize條數據 */ List<?> doPage(int start,int pagesize,Map<String,Object> cxtj,String sort, String dir);
這裏分裝了就是剛剛所須要查的兩個方法
剛剛咱們將某個接口賦值給pagelist,而這個pagelist中只有連個方法,他的實現類在哪裏呢?
下面咱們來看
這裏logisticsCityService接口裏面幹了什麼 ,你們都知道web傳統的MVC模式流程 首先是通過controller 層 而後是service層 最後是和數據庫打交道的dao層
這個接口繼承了一個公共接口
這個公共接口又繼承了父類的接口,
這個父類接口闡明瞭許多CRUD方法
package com.maidan.mall.base.service.interfaces; import java.io.Serializable; import java.util.List; import java.util.Map; /** * @param <T>實體的類型 * @param <PK>實體主鍵類型 */ public interface BaseManager<T,PK extends Serializable>{ /** * 保存(持久化)對象 * 默認的sqlId=insert * @param o 要持久化的對象 * @return 執行成功的記錄個數 */ void save(T ob); /** * 保存(持久化)對象 * 默認的sqlId=insertSelective * @param o 要持久化的對象 * @return 執行成功的記錄個數 */ void saveSelective(T ob); /** * 更新(持久化)對象 * 默認的sqlId=updateByPrimaryKey * @param o 要持久化的對象 * @return 執行成功的記錄個數 */ Integer update(T ob); /** * 更新(持久化)對象 * 默認的sqlId=updateByPrimaryKey * @param o 要持久化的對象 * @return 執行成功的記錄個數 */ Integer updateBlob(T ob); /** * 更新(持久化)對象 * 默認的sqlId=updateByPrimaryKeySelective * @param o 要持久化的對象 * @return 執行成功的記錄個數 */ Integer updateSelective(T ob); /** * 獲取指定的惟一標識符對應的持久化對象 * 默認的sqlId=selectByPrimaryKey * @param id 指定的惟一標識符 * @return 指定的惟一標識符對應的持久化對象,若是沒有對應的持久化對象,則返回null。 */ T getById(Long id); /** * 刪除指定的惟一標識符對應的持久化對象 * 默認的sqlId=deleteByPrimaryKey * @param id 指定的惟一標識符 * @return 刪除的對象數量 */ Integer deleteById(PK id); /** * 刪除指定的惟一標識符數組對應的持久化對象 * 默認的sqlId=deleteByIds * @param ids 指定的惟一標識符數組 * @return 刪除的對象數量 */ Integer deleteByIds(String ids); /** * 分頁查詢 * 默認的sqlId=findPageBy * @param param 查詢參數 * @param pageNo 要查詢的頁號 * @param pageSize 每頁數據個數 * @param sort 排序字段名 * @param dir 排序方式(升序(asc)或降序(desc) * @return 查詢結果分頁數據 */ List<T> findPageBy( T param, int pageNo, int pageSize, String sort, String dir); /** * 分頁查詢 * * @param param 查詢參數 * @param sqlId sql ID * @param pageNo 要查詢的頁號 * @param pageSize 每頁數據個數 * @param sort 排序字段名 * @param dir 排序方式(升序(asc)或降序(desc) * @return 查詢結果分頁數據 */ List<T> findPageBy( T param, String sqlId,int pageNo, int pageSize, String sort, String dir); /** * 獲取知足查詢參數條件的數據總數 * 默認的sqlId=getCountBy * @param param 查詢參數 * @return 數據總數 */ Long getCountBy(T param); Long getCountBy(Map<String,Object> param); /** * 不分頁查詢 * 默認的sqlId=findListBy * @param param 查詢參數 * @param sort 排序字段名 * @param dir 排序方式(升序(asc)或降序(desc) * @return 查詢結果列表 */ List<T> findListBy(T param, String sort, String dir); List<T> findListBy(Map<String,Object> param, String sort, String dir); /** * 不分頁查詢 * * @param param 查詢參數 * @param sqlId sql ID * @param sort 排序字段名 * @param dir 排序方式(升序(asc)或降序(desc) * @return 查詢結果列表 */ List<T> findListBy(T param,String sqlId, String sort, String dir); List<T> findListBy(Map<String,Object> param,String sqlId, String sort, String dir); List<T> queryByIds(String ids); //查詢表中主鍵的最大值 Integer queryMaxId(String sqlId); }
父類接口有本身的實現類
package com.maidan.mall.base.service.implement; import java.io.Serializable; import java.util.List; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.maidan.mall.base.persistence.dao.interfaces.IBaseDao; import com.maidan.mall.base.service.interfaces.BaseManager; public class BaseManagerImpl<T,PK extends Serializable> implements BaseManager<T,PK>{ protected final Log log = LogFactory.getLog(getClass()); protected IBaseDao<T,PK> dao; public BaseManagerImpl(IBaseDao<T, PK> genericDao) { this.dao = genericDao; } public BaseManagerImpl() { } @Override public void save(T ob) { dao.save(ob); } @Override public void saveSelective(T ob) { dao.saveSelective(ob); } @Override public Integer update(T ob) { return dao.update(ob); } @Override public Integer updateBlob(T ob) { return dao.updateBlob(ob); } @Override public Integer updateSelective(T ob) { return dao.updateSelective(ob); } @Override public T getById(Long id) { return dao.getById(id); } @Override public Integer deleteById(PK id) { return dao.deleteById(id); } @Override public Integer deleteByIds(String ids) { return dao.deleteByIds(ids); } @Override public List<T> findPageBy(T param, int pageNo, int pageSize, String sort, String dir) { return dao.findPageBy(param, pageNo, pageSize, sort, dir); } @Override public List<T> findPageBy(T param, String sqlId, int pageNo, int pageSize, String sort, String dir) { return dao.findPageBy(param, sqlId, pageNo, pageSize, sort, dir); } @Override public Long getCountBy(T param) { return dao.getCountBy(param); } @Override public Long getCountBy(Map<String, Object> param) { return dao.getCountBy(param); } @Override public List<T> findListBy(T param, String sort, String dir) { return dao.findListBy(param, sort, dir); } public List<T> findListBy(Map<String, Object> param, String sort, String dir) { return dao.findListBy(param, sort, dir); } @Override public List<T> findListBy(T param, String sqlId, String sort, String dir) { return dao.findListBy(param, sqlId, sort, dir); } @Override public List<T> findListBy(Map<String, Object> param, String sqlId, String sort, String dir) { return dao.findListBy(param, sqlId, sort, dir); } @Override public List<T> queryByIds(String ids) { // TODO Auto-generated method stub return dao.queryByIds(ids); } @Override public Integer queryMaxId(String sqlId) { // TODO Auto-generated method stub return dao.queryMaxId(sqlId); } }
他這裏的實現類是經過
IBaseDao與數據庫交互的 首先看他這裏構造函數,意思就是將傳進來某個Dao賦值給這個IBaseDao<T,PK>dao,固然了 你傳進來的這個dao也必須繼承這個IBaseDao
咱們先來看看IBaseDao的實現類
package com.maidan.mall.base.persistence.dao.implementes; import java.io.Serializable; 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.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.support.SqlSessionDaoSupport; import org.springframework.beans.factory.annotation.Autowired; import com.maidan.mall.base.constants.Constants; import com.maidan.mall.base.exception.SystemException; import com.maidan.mall.base.persistence.dao.interfaces.IBaseDao; import com.maidan.util.BeanMapUtil; import com.maidan.util.ReflectGeneric; import com.maidan.util.StringUtil; public class BaseDaoImpl<T, ID extends Serializable> extends SqlSessionDaoSupport implements IBaseDao<T, ID> { @Autowired public void setSqlSessionFactory(SqlSessionFactory mall_SqlSessionFactory) { super.setSqlSessionFactory(mall_SqlSessionFactory); } public static final String SQLNAME_SEPARATOR = "."; //默認的sql id public static final String SQL_SAVE = "insert"; public static final String SQL_SAVE_SELECTIVE = "insertSelective"; public static final String SQL_UPDATE = "updateByPrimaryKey"; public static final String SQL_UPDATE_BLOBS = "updateByPrimaryKeyWithBLOBs"; public static final String SQL_UPDATE_SELECTIVE = "updateByPrimaryKeySelective"; public static final String SQL_GETBYID = "selectByPrimaryKey"; public static final String SQL_DELETEBYID = "deleteByPrimaryKey"; public static final String SQL_DELETEBYIDS = "deleteByIds"; public static final String SQL_FINDPAGEBY = "findPageBy"; public static final String SQL_FINDPAGEBYCOUNT = "findPageByCount"; public static final String SQL_FINDLISTBY = "findListBy"; public static final String SQL_GETCOUNTBY = "getCountBy"; public static final String SQL_GETlISTByIDS = "getListByIds"; //排序 字段 private static final String SORT_NAME = "sorts"; //排序字段 asc desc private static final String DIR_NAME = "dir"; /** 不能用於SQL中的非法字符(主要用於排序字段名) */ public static final String[] ILLEGAL_CHARS_FOR_SQL = {",", ";", " ", "\"", "%"}; /** * SqlMapping命名空間 */ private String sqlNamespace = getDefaultSqlNamespace(); /** * 獲取默認SqlMapping命名空間。 * 使用泛型參數中業務實體類型的類名做爲默認的命名空間。 * 若是實際應用中須要特殊的命名空間,可由子類重寫該方法實現本身的命名空間規則。 * com.wetools.emalls.model.ShoppingCart===>>ShoppingCart * @return 返回命名空間字符串 */ @SuppressWarnings("unchecked") protected String getDefaultSqlNamespace() { Class<T> clazz = ReflectGeneric.getClassGenricType(this.getClass()); String nameSpace =clazz.getName().substring(clazz.getName().lastIndexOf(".")+1) ; return nameSpace; } /** * 將SqlMapping命名空間與給定的SqlMapping名組合在一塊兒。 * @param sqlName SqlMapping名 * @return 組合了SqlMapping命名空間後的完整SqlMapping名 */ protected String getSqlName(String sqlName) { return sqlNamespace + SQLNAME_SEPARATOR + sqlName; } /** * 獲取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) { } @Override public void save(T ob) { generateId(ob); this.getSqlSession().insert( getSqlName(SQL_SAVE), ob); } @Override public void saveSelective(T ob) { generateId(ob); this.getSqlSession().insert( getSqlName(SQL_SAVE_SELECTIVE), ob); } @Override public Integer update(T ob) { return this.getSqlSession().update( getSqlName(SQL_UPDATE), ob); } @Override public Integer updateSelective(T ob) { return this.getSqlSession().update( getSqlName(SQL_UPDATE_SELECTIVE), ob); } @SuppressWarnings("unchecked") @Override public T getById(Long id) { return (T) this.getSqlSession().selectOne( getSqlName(SQL_GETBYID), id); } @Override public Integer deleteById(ID id) { return this.getSqlSession().delete( getSqlName(SQL_DELETEBYID), id); } @Override public Integer deleteByIds(String ids) { return this.getSqlSession().delete( getSqlName(SQL_DELETEBYIDS), StringUtil.splitLongArray(ids, Constants.COMMA_SEPARATOR)); } @Override public List<T> findPageBy(T param, int pageNo, int pageSize, String sort, String dir) { return findPageBy(param, null ,pageNo, pageSize, sort, dir); } public List<T> findPageBy(Map<String, Object> param, int pageNo, int pageSize, String sort, String dir) { return findPageBy(param, null ,pageNo, pageSize, sort, dir); } @SuppressWarnings("unchecked") @Override public List<T> findPageBy(T param, String sqlId, int pageNo, int pageSize, String sort, String dir) { Map<String, Object> paramMap = null; try{ paramMap = BeanMapUtil.bean2Map(param); }catch(Exception e){ throw new SystemException("獲取參數失敗", 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 = (pageNo -1)*pageSize; RowBounds rowBound = new RowBounds(pageNo, pageSize); List<T> lst = this.getSqlSession().selectList( getSqlName(sqlId == null ? SQL_FINDPAGEBY : sqlId), paramMap, rowBound); return lst; } @SuppressWarnings("unchecked") @Override public List<T> findPageBy(Map<String, Object> param, String sqlId, int pageNo, int pageSize, String sort, String dir) { // 排序條件 if (sort != null) { // 排序字段不爲空,過濾其中可能存在的非法字符 sort = filterIllegalChars(sort, ILLEGAL_CHARS_FOR_SQL); } if (StringUtil.isEmpty(sort) || StringUtil.isEmpty(dir)) { param.put(SORT_NAME, sort); param.put(DIR_NAME, dir); } // 分頁條件 int start = (pageNo -1)*pageSize; RowBounds rowBound = new RowBounds(start, pageSize); List<T> lst = this.getSqlSession().selectList( getSqlName(sqlId == null ? SQL_FINDPAGEBY : sqlId), param, rowBound); return lst; } @SuppressWarnings("unchecked") @Override public Long getCountBy(T param) { Map<String, Object> paramMap = null; try{ paramMap = BeanMapUtil.bean2Map(param); }catch(Exception e){ throw new SystemException("獲取參數失敗", e); } return (Long)this.getSqlSession().selectOne( getSqlName(SQL_GETCOUNTBY), paramMap); } @Override public Long getCountBy(Map<String,Object> param) { return (Long)this.getSqlSession().selectOne( getSqlName(SQL_GETCOUNTBY), param); } @Override public List<T> findListBy(T param, String sort, String dir) { return findListBy(param,null, sort, dir); } public List<T> findListBy(Map<String,Object> param, String sort, String dir) { return findListBy(param,null, sort, dir); } @SuppressWarnings("unchecked") @Override public List<T> findListBy(T param,String sqlId, String sort, String dir) { Map<String, Object> paramMap = null; try{ paramMap = BeanMapUtil.bean2Map(param); }catch(Exception e){ throw new SystemException("獲取參數失敗", e); } // 排序條件 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(sqlId==null ? SQL_FINDLISTBY : sqlId), paramMap); return lst; } public List<T> findListBy(Map<String,Object> paramMap,String sqlId, String sort, String dir) { // 排序條件 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(sqlId==null ? SQL_FINDLISTBY : sqlId), paramMap); return lst; } /** * 從給定字符串中將指定的非法字符串數組中各字符串過濾掉。 * @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; } //=========================如下是對statement進行的簡單封裝供子類調用start================================================================== /** * 對{@link org.apache.ibatis.session.SqlSession#insert(java.lang.String, java.lang.Object)}的代理。 * @param statement 映射的語句ID * @param parameter 參數 * @return 執行結果——插入成功的記錄數 * @see org.apache.ibatis.session.SqlSession#insert(java.lang.String, java.lang.Object) */ public int insert(String statement, Object parameter) { return this.getSqlSession().insert( getSqlName(statement), parameter); } /** * 對{@link org.apache.ibatis.session.SqlSession#insert(java.lang.String)}的代理。 * @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)}的代理。 * @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)}的代理。 * @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)}的代理。 * @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)}的代理。 * @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)}的代理。 * @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) */ @SuppressWarnings("rawtypes") 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)}的代理。 * @param statement 映射的語句ID * @param parameter 參數 * @return 查詢結果列表 * @see org.apache.ibatis.session.SqlSession#selectList(java.lang.String, java.lang.Object) */ @SuppressWarnings("rawtypes") protected List selectList(String statement, Object parameter) { return this.getSqlSession().selectList( getSqlName(statement), parameter); } /** * 對{@link org.apache.ibatis.session.SqlSession#selectList(java.lang.String)}的代理。 * @param statement 映射的語句ID * @return 查詢結果列表 * @see org.apache.ibatis.session.SqlSession#selectList(java.lang.String) */ @SuppressWarnings("rawtypes") protected List selectList(String statement) { return this.getSqlSession().selectList( getSqlName(statement)); } /** * 對{@link org.apache.ibatis.session.SqlSession#selectOne(java.lang.String, java.lang.Object)}的代理。 * @param statement 映射的語句ID * @param parameter 參數 * @return 查詢結果對象 * @see org.apache.ibatis.session.SqlSession#selectOne(java.lang.String, java.lang.Object) */ public Object selectOne(String statement, Object parameter) { return this.getSqlSession().selectOne( getSqlName(statement), parameter); } /** * 對{@link org.apache.ibatis.session.SqlSession#selectOne(java.lang.String)}的代理。 * @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)}的代理。 * @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) */ @SuppressWarnings("rawtypes") 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)}的代理。 * @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) */ @SuppressWarnings("rawtypes") 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)}的代理。 * @param statement 映射的語句ID * @param mapKey 數據mapKey * @return 查詢結果Map * @see org.apache.ibatis.session.SqlSession#selectMap(java.lang.String, java.lang.String) */ @SuppressWarnings("rawtypes") 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)}的代理。 * @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)}的代理。 * @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)}的代理。 * @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); } @Override public Integer updateBlob(T ob) { // TODO Auto-generated method stub return this.getSqlSession().update( getSqlName(SQL_UPDATE_BLOBS), ob); } @Override public List<T> queryByIds(String ids) { /* return this.getSqlSession().delete( getSqlName(SQL_DELETEBYIDS), StringUtil.splitLongArray(ids, Constants.COMMA_SEPARATOR));*/ return this.getSqlSession().selectList(getSqlName(SQL_GETlISTByIDS), StringUtil.splitLongArray(ids, Constants.COMMA_SEPARATOR)); } @Override public Integer queryMaxId(String sqlId) { // TODO Auto-generated method stub return this.getSqlSession().selectOne(getSqlName(sqlId)); } }
而後在看看LogisticsCityService的實現類
注意 他將本身的dao傳入到父類的構造函數中
在將這個參數傳遞到父類構造函數中
而後本身的DAO去繼承IBaseDao 這樣你們就能夠公用全部的方法
IBaseDao經過反射獲取該類的類名
也就是說他們在這裏封裝的namespace就是本身的類名
你們也能夠百度查詢關鍵詞 「mybatis通用DAO」