应封装分页参数为不可变POJO(如PageInfo),含pageNum、pageSize、total字段及校验逻辑,提供getOffset()、getTotalPage()等只读方法,支持链式构建与默认配置,避免裸露int参数。

在分页查询工具类中做 Java 封装,核心是把页码(pageNum)、每页条数(pageSize)和总记录数(total)这三个关键字段统一管理,并提供计算当前页起始索引、总页数、是否为第一页/最后一页等常用能力。不建议裸露 int 类型参数来回传递,应封装成一个 POJO(如 PageInfo 或 Pagination)。
定义分页信息类(含基础校验与计算逻辑)
创建一个不可变或半可变的分页实体,构造时对页码和每页条数做基本校验,避免传入 0 或负数:
- 页码默认从 1 开始,小于 1 则自动设为 1;
- 每页条数小于 1 时设为默认值(如 10);
- 总记录数可为 0,不影响实例化,但影响 totalPage、hasNext 等派生属性;
- 提供
getOffset()(即 (pageNum - 1) * pageSize)和getTotalPage()(向上取整:(total + pageSize - 1) / pageSize)等只读方法。
在 DAO 或 Service 层使用时统一接收与返回
查询方法签名推荐接收封装对象,而非零散参数:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- DAO 层:接受
PageInfo获取 offset 和 limit,例如 MyBatis 中用<bind>或@Param("page") PageInfo page传参; - Service 层:先查总记录数(
count()),再查数据列表,最后 new 出完整 PageInfo 并设置 total; - 返回给前端的也是该 PageInfo 对象(可继承或组合业务数据 List),结构清晰、语义明确。
支持链式构建与默认配置(提升易用性)
添加静态工厂方法或 Builder 模式,简化常用场景初始化:
立即学习“Java免费学习笔记(深入)”;
-
PageInfo.of(3, 20)→ 构造 pageNum=3, pageSize=20, total=0 的实例; -
PageInfo.withTotal(3, 20, 158)→ 直接带总数构造,自动算出 totalPage=8; - 可内置默认 pageSize(如 10 或 20),避免每次重复写;
- 重写
toString()方便日志调试,例如PageInfo{pageNum=2, pageSize=10, total=97, totalPage=10}。
注意边界与线程安全
该类通常作为请求级对象(每个 HTTP 请求新建一个),无需考虑线程安全;但要防范外部修改:
- 字段建议 private final,通过构造器赋值;
- 避免提供 setter 方法,防止业务代码误改 pageNum 导致 offset 错乱;
- 若需“下一页”“上一页”新实例,提供
next()/prev()方法返回新 PageInfo,而非修改自身。

















