java rest分页排序核心是解析page/size/sort参数并转为pageable或sort,spring data jpa自动绑定pageable,mybatis常用pagehelper实现物理分页,响应须返回完整分页元数据。

Java 中处理 REST 接口的分页与排序参数,核心是解析请求中的查询参数(如 page、size、sort),转换为标准的数据访问逻辑,并与 Spring Data JPA 或 MyBatis 等持久层协同工作。关键不在于手动拼 SQL,而在于利用框架能力做标准化适配。
使用 Spring Data JPA 的 Pageable 自动绑定
Spring MVC 能自动将 URL 参数映射为 Pageable 对象,前提是参数名符合约定(或显式声明):
- 默认支持
page(从 0 开始)、size、sort=property,asc/desc(如?sort=name,desc&sort=age,asc) - 控制器方法直接接收:
public ResponseEntity<page>> getUsers(Pageable pageable)</page> - Service 层调用 JPA Repository 的
findAll(Pageable)即可返回带分页元数据的Page - 若需自定义参数名(如用
pageNum和pageSize),可用@PageableDefault或@ParameterObject配合PageRequest.of()手动构建
手动解析并构造 Sort 对象(兼容非标准参数)
当前端传参格式不统一(如 orderBy=name&orderDirection=desc),需手动组装 Sort:
- 提取字符串参数:
@RequestParam String orderBy和@RequestParam(defaultValue = "asc") String orderDirection - 校验字段合法性(防止注入):只允许白名单字段(如
"name", "email", "createdAt") - 构建排序:
Sort sort = Sort.by(Sort.Direction.fromString(orderDirection), orderBy); - 再组合成
Pageable:Pageable pageable = PageRequest.of(pageNum, pageSize, sort);
响应中正确返回分页元数据
不要只返回数据列表,要包含总条数、当前页、页大小等信息,方便前端分页控件渲染:
- 使用
Page<t></t>作为返回值类型,Spring Boot 会自动序列化为 JSON,含content、totalElements、totalPages、number、size等字段 - 避免手动 new ArrayList() + 计数 —— 这会丢失分页上下文,且无法支持
isFirst()/hasNext()等语义 - 如需自定义响应结构(如统一包一层
{"code":200,"data":{...}}),可封装Page到 DTO,但别丢掉关键分页字段
MyBatis 场景下的分页处理(如用 PageHelper)
MyBatis 本身不内置分页,常用 PageHelper 插件实现物理分页:
- Maven 引入
pagehelper-spring-boot-starter - Controller 中解析参数后,调用
PageHelper.startPage(pageNum, pageSize, orderBy + " " + orderDirection) - 紧接着执行 Mapper 查询(必须紧邻!),插件会自动拦截 SQL 加上
LIMIT/OFFSET或ROWNUM - 用
PageHelper.getPage()获取PageInfo对象,它包含list、total、pageNum等字段 - 注意:务必校验
pageNum > 0、pageSize合理(如 ≤ 100),防止恶意拉取全表
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











