java中通用分页查询结果集的核心是定义泛型不可变类pageresult,封装total、pagenum、pagesize、list等字段,支持类型安全复用,避免重复编码。

Java 中用泛型设计通用分页查询结果集,核心是定义一个可复用的 PageResult<t></t> 类,封装总记录数、当前页码、每页条数、数据列表等字段,并让业务层返回该类型实例,避免为每个实体重复写分页结构。
定义泛型分页结果类 PageResult
这是一个不可变(或半不可变)的数据容器,包含分页元信息和具体业务数据列表:
- 使用
long total存总记录数(支持超大数量,避免 int 溢出) -
int pageNum和int pageSize表示当前页及大小 -
List<t> list</t>存当前页实际数据,类型由调用方决定 - 提供构造方法或 Builder 方式初始化,推荐带参数校验(如 pageNum ≥ 1,pageSize 在合理范围)
示例代码:
public class PageResult<t> {
private final long total;
private final int pageNum;
private final int pageSize;
private final List<t> list;
<pre class="brush:java;toolbar:false;">public PageResult(long total, int pageNum, int pageSize, List<T> list) {
this.total = total;
this.pageNum = Math.max(1, pageNum);
this.pageSize = Math.min(100, Math.max(1, pageSize)); // 防止过大或过小
this.list = Collections.unmodifiableList(list != null ? list : Collections.emptyList());
}
// getter 方法(省略)
}
在 DAO/Service 层返回泛型分页结果
数据库查询需分两步:查总数 + 查当前页数据。可借助 MyBatis 的 RowBounds 或 PageHelper,也可手写 limit/offset SQL。关键在于把原始查询结果组装成 PageResult<user></user>、PageResult<order></order> 等。
- MyBatis 示例:先查
select count(*),再查select * from xxx limit #{offset}, #{size} - Spring Data JPA 可直接返回
Page<t></t>,再转为PageResult<t></t>(调用page.getTotalElements()、page.getContent()) - 避免在 service 方法签名里写死具体类型,统一用
<t> PageResult<t> queryPage(...)</t></t>
配合 Controller 统一响应格式
对外 API 响应建议包装一层通用结构(如 Response<pageresult>></pageresult>),保持前后端契约清晰:
- 前端只关心 data.data.list、data.total、data.pageNum 等字段,无需感知后端分页实现细节
- 可扩展字段:比如添加
hasNext、hasPrevious、pages(总页数)提升易用性 - 序列化时注意 Jackson 对泛型的支持,一般无须额外配置
注意事项与优化点
泛型本身在运行时被擦除,所以 PageResult<string></string> 和 PageResult<user></user> 共享同一份字节码,但编译期能保障类型安全。
- 不要在
PageResult中存数据库连接、Session 等非序列化对象 - 大数据量分页慎用
OFFSET,考虑游标分页(cursor-based pagination)替代 - 若需排序,可在类中增加
String orderBy字段,或单独封装PageRequest参数对象 - 单元测试时用
PageResult<string></string>或PageResult<integer></integer>快速验证逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











