Spring Boot中推荐使用Spring Data JPA的Pageable和Page实现REST分页,Controller接收page、size、sort参数自动绑定,Repository复用findAll(Pageable)或条件分页方法,返回时建议封装为统一响应体如ResultPage避免暴露Page内部结构。

Spring Boot 中实现 REST 接口的分页查询,最常用、最推荐的方式是使用 Spring Data JPA 提供的 Pageable 和 Page(或 PageImpl),配合数据库自动构建分页 SQL,无需手写 limit/offset。
使用 Pageable 参数接收分页信息
Controller 层直接声明 Pageable 类型参数,Spring Boot 会自动从请求参数(如 page、size、sort)绑定:
-
page:页码(从 0 开始,默认为 0) -
size:每页条数(默认为 20) -
sort:排序字段和方向,如sort=name,asc&sort=createdAt,desc
示例接口:
@GetMapping("/users")
public ResponseEntity
return ResponseEntity.ok(userRepository.findAll(pageable));
}
在 Repository 中复用分页方法
Spring Data JPA 的 JpaRepository 已内置 findAll(Pageable) 方法,无需额外实现。若需带条件分页,可:
- 使用方法名查询:如
findByStatus(String status, Pageable pageable) - 使用
@Query+Pageable:JPQL 或原生 SQL 均支持,Spring 会自动添加LIMIT/OFFSET(或等效语法) - 注意:自定义
@Query时,必须返回Page<t></t>或Slice<t></t>才能触发分页逻辑
返回结构更友好的分页响应
直接返回 Page<user></user> 是可行的,但前端通常需要更清晰的字段(如 total、pages、content)。建议封装一层:
- 提取
page.getTotalElements()、page.getTotalPages()、page.getContent()等字段 - 避免直接暴露
Page的内部结构(如sort对象嵌套深、字段命名不统一) - 可定义统一响应体,如
ResultPage<user></user>,包含data、total、pageNo、pageSize、pages
非 JPA 场景:MyBatis 或纯 JDBC 怎么办
若未使用 Spring Data JPA,可通过手动传参 + 拦截器或工具类处理分页:
- Controller 接收
int page、int size,计算offset = (page - 1) * size - MyBatis 中使用
<bind></bind>或@Select("SELECT * FROM user LIMIT #{size} OFFSET #{offset}") - 推荐搭配
PageHelper(MyBatis 插件),只需在 service 方法前加PageHelper.startPage(page, size),后续select自动分页


















