java中通过泛型实现统一分页查询结果,核心是定义泛型pageresult类封装总记录数、页码、页大小和数据列表,并在service层将ipage转为pageresult,controller层直接返回泛型实例。

Java 中通过泛型实现统一的分页查询结果,核心是定义一个通用的分页响应类(如 PageResult<t></t>),封装总记录数、当前页码、每页大小、数据列表等字段,并让所有接口返回该类型。这样既保证类型安全,又避免重复定义分页结构。
定义泛型分页结果类
创建一个可复用的 PageResult<t></t> 类,包含分页元信息和泛型数据列表:
public class PageResult<t> {
private long total; // 总记录数
private int pageNum; // 当前页码(从1开始)
private int pageSize; // 每页条数
private List<t> list; // 当前页数据
// 构造方法(推荐带参数的构造,便于构建)
public PageResult(long total, int pageNum, int pageSize, List<t> list) {
this.total = total;
this.pageNum = pageNum;
this.pageSize = pageSize;
this.list = list == null ? Collections.emptyList() : list;
}
// getter/setter 省略...
}
</t></t></t>
在 Service 层统一封装分页逻辑
使用 MyBatis-Plus 或 Spring Data JPA 时,查询后将结果转为 PageResult。以 MyBatis-Plus 的 IPage 为例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
public <t> PageResult<t> buildPageResult(IPage<t> page) {
return new PageResult(
page.getTotal(),
(int) page.getCurrent(),
(int) page.getSize(),
page.getRecords()
);
}
// 使用示例
public PageResult<user> getUserPage(int pageNum, int pageSize) {
IPage<user> userPage = new Page(pageNum, pageSize);
IPage<user> result = userMapper.selectPage(userPage, null);
return buildPageResult(result);
}
</user></user></user></t></t></t>
Controller 层直接返回泛型结果
Controller 不需要关心具体业务类型,只需透传 PageResult<t></t>,由 Jackson 自动序列化:
@GetMapping("/users")
public PageResult<user> listUsers(
@RequestParam(defaultValue = "1") int pageNum,
@RequestParam(defaultValue = "10") int pageSize) {
return userService.getUserPage(pageNum, pageSize);
}
@GetMapping("/orders")
public PageResult<order> listOrders(
@RequestParam(defaultValue = "1") int pageNum,
@RequestParam(defaultValue = "10") int pageSize) {
return orderService.getOrderPage(pageNum, pageSize);
}
</order></user>
返回 JSON 示例:
{
"total": 125,
"pageNum": 1,
"pageSize": 10,
"list": [
{ "id": 1, "name": "张三" },
{ "id": 2, "name": "李四" }
]
}
进阶:支持排序、条件查询与空值安全
可在 PageResult 中增加 orderBy 字段或封装分页请求对象(如 PageQuery);对 list 字段做非空处理,避免前端解析报错:
- 构造时用
Collections.emptyList()替代 null - 添加静态工厂方法简化构建:
PageResult.success(total, data) - 配合 Lombok 的
@Builder和@Data减少模板代码 - 若需兼容旧接口,可提供无泛型的基类 + 泛型子类,但通常不必要
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










