Java分页工具类通过泛型PageResult<T>统一封装响应,含pageNum、pageSize、total、list字段;DAO层不处理分页,Service层用MyBatis-Plus或原生方式查数据并封装,Controller直接返回,前端接收结构化JSON。

在 Java 分页工具类中统一封装泛型返回结果集,核心是定义一个通用的分页响应结构(如 PageResult<T>),让所有查询方法都返回该结构,内部用泛型承载业务数据列表。这样既保证类型安全,又避免重复写分页字段(当前页、总条数、数据列表等)。
定义泛型分页响应类 PageResult<T>
这是统一封装的基础,所有接口返回值都统一为 PageResult<User>、PageResult<Order> 等:
public class PageResult<T> {
private int pageNum; // 当前页码(从1开始)
private int pageSize; // 每页数量
private long total; // 总记录数
private List<T> list; // 当前页数据列表
<pre class='brush:java;toolbar:false;'>// 构造方法推荐带 total 和 list,便于 service 层直接组装
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;
}
// getter/setter 省略(Lombok @Data 可自动补全)}
DAO 层或 Mapper 返回泛型 List<T>,不处理分页逻辑
MyBatis 或 JPA 的查询方法只负责查数据,分页由上层控制(避免在 DAO 层硬编码 offset/limit):
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- MyBatis:用
<select>写原始 SQL,参数传pageNum和pageSize,自己算offset - 更推荐:用 MyBatis-Plus 的
IPage<T>或 Spring Data JPA 的Page<T>,它们天然支持泛型 + 分页元信息
Service 层统一封装成 PageResult<T>
无论查用户、订单还是商品,都在 service 方法里调用 mapper 后,用同一套逻辑封装返回值:
// 示例:查询用户分页
public PageResult<User> listUsers(int pageNum, int pageSize) {
// 方式1:MyBatis-Plus(推荐)
IPage<User> page = new Page<>(pageNum, pageSize);
IPage<User> userPage = userMapper.selectPage(page, null);
return new PageResult<>(pageNum, pageSize, userPage.getTotal(), userPage.getRecords());
<pre class='brush:java;toolbar:false;'>// 方式2:原生 MyBatis(需手动查总数 + 数据列表)
long total = userMapper.countAll();
List<User> list = userMapper.selectByPage((pageNum - 1) * pageSize, pageSize);
return new PageResult<>(pageNum, pageSize, total, list);}
Controller 层直接返回 PageResult<T>,前端拿到结构化 JSON
Spring MVC 会自动序列化泛型对象,前端收到的 JSON 类似:
{
"pageNum": 1,
"pageSize": 10,
"total": 127,
"list": [
{ "id": 1, "name": "张三" },
{ "id": 2, "name": "李四" }
]
}
无需每个接口再写一遍分页字段,也不用强转 List<Object>,类型在编译期就确定,IDE 有提示,重构安全。

















