分頁查詢重構

flzhang發表於2015-02-17
分頁查詢中要能根據當前頁的頁號和頁面大小計算出每次分頁的第一條資料行號,這樣知道了當前要查詢頁的第一條資料行號和該頁共幾條記錄就能確定分頁需要查詢的資料範圍,在具體實現時可以按如下方式編寫
@Override
public Page ListByPage(Map params) {
  Integer currentPage = (Integer)params.get( "pageIndex");
 Integer pageSize  = (Integer)params.get( "pageSize");
  Integer startNo =(currentPage-1)*pageSize;
 return templateQLService.findByPagedSQLBeanQuery("case-shareExpert-list", null, startNo, pageSize, DataVo.class);
}
從上面的例子可以看出,這個方法是個業務層的方法為實現分頁查詢使用,首先方法接受的引數是個map型別,這是為了集中存放多個傳送的引數,經過解析map中的引數後,再根據當前頁號和頁面上資料個數計算分頁時當前頁面上的第一條資料行號,最後呼叫查詢資料庫的方法做分頁查詢。
這裡顯然存在兩個問題,一 這個業務方法接收的引數只有當前頁號和頁面大小兩個引數,但還放到了map中傳遞,這樣在接收這兩個引數時必然需要解析map再有轉換才能得到相應型別的引數,程式碼看起來顯然比較冗長,因此可以直接傳遞兩個引數,而不用map傳遞; 二 在計算起始資料行號時使用了一個小的計算公式Integer startNo =(currentPage-1)*pageSize;,而在其他模組中經常用到分頁功能,在編寫分頁查詢的業務方法時還會多次使用這種計算的功能,因此這種經常被使用的重複的計算公式應被封裝到一個物件中,以便今後其他模組呼叫

因此建立一個類封裝計算方法
public class Page implements Serializable {
。。。。。。
 public static int getStartOfPage(int pageNo, int pageSize) {
        return (pageNo - 1) * pageSize;
    }

}
封裝後就可以重新構造剛才的分頁查詢業務方法了,重構後的業務方法如下
@Override
public Page ListByPage(int pageNum, int pageSize) {
int startNo = Page.getStartOfPage(pageNum, pageSize);
return templateQLService.findByPagedSQLBeanQuery("case-shareExpert-list", null, startNo, pageSize, DataVo.class);
}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/750077/viewspace-1437679/,如需轉載,請註明出處,否則將追究法律責任。

相關文章