首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 通用分頁工具類 Pager 設計與使用指南

     編輯:Java 相關知識

分頁是業務系統高頻需求。一個設計良好的分頁工具類,能屏蔽頁碼計算邏輯,統一前後端交互契約。本文提供生產級 Pager<T> 實現與測試示例。

Pager 核心屬性

屬性含義默認值
currentPage當前頁碼1
pageSize每頁條數10
recordTotal總記錄數0
pageTotal總頁數(自動計算)-
firstPage首頁頁碼1
lastPage尾頁頁碼-
previousPage上一頁頁碼-
nextPage下一頁頁碼-
content當前頁數據列表null

核心邏輯:otherAttr() 自動計算衍生屬性

public void otherAttr() {
    // 總頁數 = (總記錄數 + 每頁大小 - 1) / 每頁大小
    this.pageTotal = this.recordTotal % this.pageSize > 0 
        ? this.recordTotal / this.pageSize + 1 
        : this.recordTotal / this.pageSize;
    
    this.firstPage = 1;
    this.lastPage = this.pageTotal;
    
    // 上一頁:首頁時停留在首頁
    this.previousPage = this.currentPage > 1 ? this.currentPage - 1 : this.firstPage;
    
    // 下一頁:尾頁時停留在尾頁
    this.nextPage = this.currentPage < this.lastPage ? this.currentPage + 1 : this.lastPage;
}

調用時機:setRecordTotal() 內部自動調用,確保總記錄數變更時衍生屬性同步更新。

完整實現 (簡化版)

public class Pager<T> implements Serializable {
    private static final long serialVersionUID = 4542617637761955078L;
    
    private int currentPage = 1;
    private int pageSize = 10;
    private int pageTotal;
    private int recordTotal = 0;
    private int previousPage;
    private int nextPage;
    private int firstPage = 1;
    private int lastPage;
    private List<T> content;
    
    // Setter 方法...
    public void setRecordTotal(int recordTotal) {
        this.recordTotal = recordTotal;
        otherAttr(); // 關鍵:同步計算衍生屬性
    }
    
    public void setContent(List<T> content) { this.content = content; }
    
    // Getter 方法...
    public int getCurrentPage() { return currentPage; }
    // ... 其他 getter
    
    @Override public String toString() {
        return "Pager[currentPage=" + currentPage + ", pageSize=" + pageSize 
            + ", pageTotal=" + pageTotal + ", recordTotal=" + recordTotal
            + ", content=" + content + "]";
    }
}

使用示例

public class PagerTester {
    public static void main(String[] args) {
        Pager<String> pager = new Pager<>();
        
        // 模擬數據源
        List<String> data = new ArrayList<>();
        for (int i = 1; i <= 10; i++) data.add("str" + i);
        
        // 設置分頁參數:第1頁,每頁10條,總共62條
        pager.setCurrentPage(1);
        pager.setPageSize(10);
        pager.setRecordTotal(62);  // 觸發 otherAttr() 計算 pageTotal=7 等
        pager.setContent(data);    // 僅設置當前頁數據
        
        System.out.println(pager);
        // 輸出: Pager[currentPage=1, pageSize=10, pageTotal=7, recordTotal=62, ...]
    }
}

擴展建議

  • 分頁導航 UI:前端根據 firstPage, previousPage, nextPage, lastPage, pageTotal 渲染分頁條
  • MyBatis 整合:配合 PageHelper 或自定義攔截器自動注入 LIMIT/OFFSET
  • 參數校驗:setCurrentPage 修正非法值(<1 設為 1,>pageTotal 設為 pageTotal)
  • 序列化支援:實現 Serializable 便於分布式傳輸

總結

Pager<T> 以泛型適配任意數據類型,封裝分頁元數據計算邏輯,提供豐富導航屬性,是 Service 層返回列表數據的標準載體。實際項目中建議結合分頁插件使用,Service 僅負責組裝 Pager 對象返回 Controller。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved