分页类的核心属性设计
Java分页类的核心在于封装分页所需的基础信息,通常包含以下属性:当前页码(currentPage)、每页显示条数(pageSize)、总记录数(total)、当前页数据列表(list),还可扩展计算属性如总页数(totalPages)、偏移量(offset)等,以简化业务逻辑调用,这些属性需通过私有化封装,配合getter/setter方法控制访问,确保数据安全性,currentPage和pageSize应设置默认值(如1和10),避免前端未传参时出现异常。

分页逻辑的计算方法
分页类的关键在于逻辑计算,需处理多种边界情况:
- 总页数计算:通过
Math.ceil((double) total / pageSize)实现,确保总记录数不能整除时向上取整。 - 偏移量计算:用于数据库查询的起始位置,公式为
(currentPage - 1) * pageSize,需注意currentPage小于1时自动修正为1。 - 页码合法性校验:当currentPage超过总页数时,应自动调整为最后一页(如totalPages为0时设为1)。
- 分页状态判断:提供
hasNextPage()(是否有下一页)和hasPreviousPage()(是否有上一页)等方法,方便前端控制按钮状态。
分页类的封装与使用示例
以下是一个简洁的分页类封装示例(以泛型支持不同数据类型):

import java.util.List;
public class Page<T> {
private int currentPage = 1;
private int pageSize = 10;
private int total;
private List<T> list;
public Page(int currentPage, int pageSize, int total, List<T> list) {
this.currentPage = Math.max(1, currentPage);
this.pageSize = pageSize > 0 ? pageSize : 10;
this.total = total;
this.list = list;
}
public int getTotalPages() {
return total == 0 ? 1 : (int) Math.ceil((double) total / pageSize);
}
public int getOffset() {
return (currentPage - 1) * pageSize;
}
public boolean hasNextPage() {
return currentPage < getTotalPages();
}
// 省略其他getter/setter
}
使用场景:在Service层查询数据时,先计算偏移量和条数,查询后封装分页对象返回。
public Page<User> listUsers(int currentPage, int pageSize) {
int offset = (currentPage - 1) * pageSize;
List<User> users = userMapper.selectUsers(offset, pageSize);
int total = userMapper.countUsers();
return new Page<>(currentPage, pageSize, total, users);
}
分页功能的注意事项
- 参数校验:需对currentPage和pageSize进行合法性校验,防止负数或0导致异常。
- 数据库优化:避免大偏移量分页(如
LIMIT 100000, 10),可通过WHERE id > last_id LIMIT pageSize优化,或使用游标分页。 - 线程安全:分页类通常作为数据传输对象(DTO),无需考虑线程安全问题,但若涉及缓存,需注意并发读写。
- 返回结构:RESTful接口返回分页数据时,建议统一格式,如
{ "code": 200, "data": { "list": [...], "total": 100, "currentPage": 1 } },便于前端解析。
通过合理设计分页类,可有效提升代码复用性,简化业务逻辑,同时保障分页功能的健壮性和可维护性。

















