Java中封装泛型分页响应的核心是定义泛型PageResult类,包含data(List)、total、page、size、pages及hasNext/hasPrevious等字段,支持MyBatis-Plus或PageHelper分页插件转换,并通过Controller统一返回,确保类型安全与JSON序列化正确。

Java中封装泛型分页响应,核心是把数据列表和分页元信息(总条数、当前页、每页大小、总页数等)统一包装进一个类型安全的响应对象。PageResult 通常作为后端返回给前端的标准分页结构,支持泛型以适配任意业务实体。
定义泛型 PageResult 类
PageResult 应包含分页元数据字段 + 泛型数据列表,推荐使用 Lombok 简化代码:
-
data:List
类型,存放当前页的实际数据 - total:long,查询结果总记录数(非当前页数量)
- page:int,当前页码(通常从 1 开始)
- size:int,每页条数
- pages:int,总页数(可由 total / size 向上取整计算得出)
- hasNext 和 hasPrevious:便于前端做翻页判断(可选)
示例代码:
import lombok.Data;
import java.util.List;
@Data
public class PageResult<t> {
private List<t> data;
private long total;
private int page;
private int size;
private int pages;
private boolean hasNext;
private boolean hasPrevious;
public PageResult(List<t> data, long total, int page, int size) {
this.data = data;
this.total = total;
this.page = page;
this.size = size;
this.pages = (int) Math.ceil((double) total / size);
this.hasNext = page 1;
}
}</t></t></t>
从 MyBatis-Plus 或 PageHelper 构建 PageResult
实际开发中,常借助分页插件获取带元数据的 Page 对象,再转为 PageResult:
- MyBatis-Plus 的
IPage<user></user>包含 records、total、current、size 等字段,可直接提取 - PageHelper 的
PageInfo<user></user>提供 list、total、pageNum、pageSize、pages 等
示例(MyBatis-Plus):
IPage<user> page = new Page(req.getPage(), req.getSize());
IPage<user> userPage = userMapper.selectPage(page, wrapper);
return new PageResult(userPage.getRecords(), userPage.getTotal(),
(int) userPage.getCurrent(), (int) userPage.getSize());</user></user>
Controller 层统一返回 PageResult
避免在每个接口里手动 new,可封装工具方法或使用统一响应体(如 Result
- 若项目已用统一响应封装(如 Result.success(data)),则 data 可传入 PageResult 实例
- 确保 JSON 序列化器(如 Jackson)能正确处理泛型,一般无需额外配置
- 前端接收到的 JSON 结构清晰:{ "data": [...], "total": 123, "page": 2, "size": 10, ... }
注意点与建议
几个容易出错但关键的细节:
- page 参数建议校验:小于 1 则设为 1;size 过大(如 > 100)应限制,防 SQL 性能问题
- total 是数据库 COUNT 查询结果,不是 data.size() —— 后者只是当前页数量
- 泛型擦除不影响运行时,但单元测试时可用
new TypeReference<pageresult>>(){}</pageresult>解析 JSON - 如需兼容旧前端,可将 data 字段命名为 list 或 content,保持 API 兼容性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











