PageResult 是一个泛型分页结果类,封装当前页码、每页条数、总记录数、总页数及数据列表,支持任意类型T,提升复用性与类型安全;提供常用工具方法如 isFirstPage()、isLastPage() 和 getBeginIndex(),并建议配合分页插件使用而非内置物理分页逻辑。

在 Java 中,用泛型封装一个通用的分页查询结果集对象,核心是定义一个可承载任意数据类型、同时包含分页元信息(如当前页、总页数、总记录数、数据列表等)的类。这样能避免为每种业务实体重复写分页 DTO,提升复用性和类型安全性。
定义泛型分页结果类 PageResult
这是一个典型的泛型容器类,用 T 表示业务数据的具体类型:
public class PageResult<T> {
private int pageNum; // 当前页码(从 1 开始)
private int pageSize; // 每页条数
private long total; // 总记录数
private int pages; // 总页数(由 total / pageSize 推导)
private List<T> list; // 当前页的数据列表
<pre class="brush:php;toolbar:false;">// 构造方法(推荐带 total 和 list 的构造)
public PageResult(int pageNum, int pageSize, long total, List<T> list) {
this.pageNum = pageNum;
this.pageSize = pageSize;
this.total = total;
this.list = list == null ? Collections.emptyList() : list;
this.pages = (int) ((total + pageSize - 1) / pageSize); // 向上取整
}
// getter/setter 省略(IDE 可自动生成)}
配合 MyBatis 或 JPA 使用的典型场景
实际查询时,通常先查总数、再查数据。以 MyBatis 为例,可在 Service 层组合两步操作:
立即学习“Java免费学习笔记(深入)”;
- 调用
mapper.countByExample(example)获取总记录数 - 设置
RowBounds(pageNum * pageSize - pageSize, pageSize)或用分页插件(如 PageHelper)查数据列表 - 将结果和元信息一起封装成
PageResult<user></user>或PageResult<order></order>
示例:
public PageResult<User> findUsersByPage(int pageNum, int pageSize) {
UserExample example = new UserExample();
long total = userMapper.countByExample(example);
<pre class="brush:php;toolbar:false;">example.setLimitStart((pageNum - 1) * pageSize);
example.setLimitEnd(pageSize);
List<User> list = userMapper.selectByExample(example);
return new PageResult<>(pageNum, pageSize, total, list);}
增强可用性:添加常用工具方法
可以在 PageResult<t></t> 中增加一些实用方法,比如判断是否第一页/最后一页、是否有下一页、获取起始序号等:
-
isFirstPage()→return pageNum -
isLastPage()→return pageNum >= pages; -
getBeginIndex()→return (pageNum - 1) * pageSize + 1;(用于前端显示“第 X 条到第 Y 条”) - 重写
toString()或使用 Lombok 的@Data简化开发
注意点与建议
- 避免把数据库物理分页逻辑(如 LIMIT/OFFSET)写死在泛型类里——它只负责“装”,不分页
- 如果项目已用 Spring Data JPA,可直接返回
Page<t></t>,无需自定义;但若需统一响应结构(如加 code/msg),仍建议外层再包装一层Response<pageresult>></pageresult> - JSON 序列化时(如用 Jackson),泛型会被擦除,但只要字段类型声明为
List<t></t>并配好 getter,一般不会出错 - 考虑继承或组合:比如让
PageResult<t></t>实现Serializable,方便远程传输


















