分頁是企業級應用高頻需求。本文提供一個生產就緒的 Pager<T> 工具類,支援泛型數據、自動計算總頁數/上下頁、序列化傳輸,並附帶測試用例與前端對接建議。
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 省略...
}
<T>:類型安全,避免前端強轉。setRecordTotal() 內部調用 otherAttr(),保證總頁數、上下頁邏輯一致。pageSize=10、currentPage=1,減少調用方樣板代碼。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]]
}
}
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;
}
pager.content 到表格 :data。pager.currentPage、pager.pageTotal、pager.pageSize。page、size 重新請求。recordTotal=0 時前端自動隱藏分頁條。sortField/sortOrder 支援排序。Map<String, Object> extra 攜帶聚合統計(如總金額)。IPage 或 Spring Data Page 互轉適配器。這個 Pager<T> 經過多個項目驗證,穩定可靠,可直接複製到 common 模組投入使用。