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

Java 分頁工具類 Pager 設計與實戰:泛型、序列化、前端無縫對接

     編輯:Java 綜合教學

通用分頁組件 Pager<T> 完整實現與使用指南

分頁是企業級應用高頻需求。本文提供一個生產就緒的 Pager<T> 工具類,支援泛型數據、自動計算總頁數/上下頁、序列化傳輸,並附帶測試用例與前端對接建議。

1. 核心類設計

public class Pager<T> implements Serializable {
    private static final long serialVersionUID = 4542617637761955078L;

    // 必填參數(有預設值)
    private int currentPage = 1;
    private int pageSize = 10;
    private int recordTotal = 0;

    // 派生屬性(由 otherAttr() 自動計算)
    private int pageTotal;
    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(); // 關鍵:重新計算派生屬性
    }

    private void otherAttr() {
        this.pageTotal = (recordTotal + pageSize - 1) / pageSize; // 向上取整
        this.lastPage = pageTotal;
        this.previousPage = currentPage > 1 ? currentPage - 1 : firstPage;
        this.nextPage = currentPage < lastPage ? currentPage + 1 : lastPage;
    }
    // getter/setter/toString 省略...
}

2. 關鍵設計亮點

  • 泛型 <T>:類型安全,避免前端強轉。
  • 實現 Serializable:支援分布式 Session、RPC 傳輸、Redis 緩存。
  • 派生屬性自動維護:setRecordTotal() 內部調用 otherAttr(),保證總頁數、上下頁邏輯一致。
  • 邊界保護:首頁/尾頁、上下頁自動鉗制在合法範圍。
  • 預設值合理:pageSize=10、currentPage=1,減少調用方樣板代碼。

3. 測試用例

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);

        pager.setCurrentPage(1);
        pager.setPageSize(10);
        pager.setRecordTotal(62); // 總 62 條 → 7 頁
        pager.setContent(data);

        System.out.println(pager);
        // 輸出: Pager[currentPage=1, pageSize=10, pageTotal=7, recordTotal=62,
        // previousPage=1, nextPage=2, firstPage=1, lastPage=7, content=[str1...str10]]
    }
}

4. Service 層調用模式

public Pager<UserVO> queryUsers(UserQueryDTO dto) {
    // 1. 參數校驗與預設
    int page = Math.max(1, dto.getPage());
    int size = Math.min(100, Math.max(1, dto.getSize()));

    // 2. 查總數
    long total = userMapper.countByCondition(dto);

    // 3. 查分頁數據(MyBatis PageHelper 或 LIMIT/OFFSET)
    List<User> list = userMapper.selectPage(dto, (page - 1) * size, size);

    // 4. 組裝 VO
    List<UserVO> voList = list.stream().map(this::convert).collect(toList());

    // 5. 封裝返回
    Pager<UserVO> pager = new Pager<>();
    pager.setCurrentPage(page);
    pager.setPageSize(size);
    pager.setRecordTotal((int) total);
    pager.setContent(voList);
    return pager;
}

5. 前端對接建議(Vue/React 通用)

  • 直接綁定 pager.content 到表格 :data。
  • 分頁組件讀取 pager.currentPage、pager.pageTotal、pager.pageSize。
  • 頁碼變更時傳遞 page、size 重新請求。
  • 後端返回 recordTotal=0 時前端自動隱藏分頁條。

6. 擴展方向

  1. 增加 sortField/sortOrder 支援排序。
  2. 增加 Map<String, Object> extra 攜帶聚合統計(如總金額)。
  3. 整合 MyBatis Plus IPage 或 Spring Data Page 互轉適配器。

這個 Pager<T> 經過多個項目驗證,穩定可靠,可直接複製到 common 模組投入使用。

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