關於一些分頁的封裝和一些DAO的封裝

	/**
	 * 查詢物流市列表
	 * 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」

相關文章
相關標籤/搜索