Java Web分页参数封装推荐定义PageRequest DTO,含page(≥1)、size(1–100)、sort和order字段,通过setter校验并设默认值;Controller中用@Valid接收,适配PageHelper、MyBatis-Plus、JPA等持久层,返回统一封装的PageResult。

在 Java Web 开发中,封装通用的分页查询参数,核心是定义一个可复用、与业务解耦、支持常见分页场景(如 PageHelper、MyBatis-Plus、Spring Data JPA)的请求 DTO,并兼顾校验、默认值和语义清晰性。
定义统一的分页请求 DTO
推荐创建一个基础分页参数类(如 PageRequest),包含页码、每页数量,并提供合理默认值和校验逻辑:
- 页码(
page)从 1 开始,小于 1 时自动设为 1; - 每页条数(
size)建议限制范围(如 1–100),超限时截断或抛异常; - 可选添加排序字段(
sort)和方向(order,ASC/DESC),用字符串或枚举更安全; - 避免使用
offset和limit直接暴露底层 SQL 概念,保持语义面向“页”。
示例:
public class PageRequest {
private int page = 1;
private int size = 10;
<pre class="brush:php;toolbar:false;">private String sort;
private String order = "ASC";
// getter/setter + 自动标准化方法(如在 setter 中校验)
public void setPage(int page) {
this.page = Math.max(1, page);
}
public void setSize(int size) {
this.size = Math.min(100, Math.max(1, size));
}}
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
与 Controller 层集成(Spring MVC)
用 @Valid 做基础校验,配合自定义注解或全局异常处理器提升健壮性:
- 在 Controller 方法参数中直接接收
PageRequest; - 搭配
@Valid和@RequestBody(JSON 请求体)或@RequestParam(URL 查询参数); - 若用
@RequestParam,可加required = false并在 DTO 构造/初始化时设默认值。
示例(GET 分页接口):
@GetMapping("/users")
public Result<PageResult<User>> listUsers(
UserQuery query,
@Valid PageRequest page) {
PageResult<User> result = userService.listByPage(query, page);
return Result.success(result);
}适配不同持久层分页方案
DTO 本身不耦合具体分页实现,转换由 service 层完成:
- 对接 PageHelper:调用
PageHelper.startPage(page.getPage(), page.getSize())后执行 DAO 查询; - 对接 MyBatis-Plus:构造
Page<t></t>对象(new Page(page.getPage(), page.getSize()))传入 mapper; - 对接 Spring Data JPA:转成
Pageable(PageRequest.of(page.getPage() - 1, page.getSize(), sort)); - 返回结果建议统一封装为
PageResult<t></t>(含 total、list、page、size 等字段),屏蔽底层差异。
进阶:支持多维度分页与条件组合
实际项目中,分页常和查询条件强绑定。可采用两种方式组织:
-
组合式:让业务查询 DTO(如
UserQuery)继承或持有PageRequest; -
分离式:Controller 同时接收
PageRequest和业务 DTO,service 层合并处理; - 避免把分页字段混入业务 DTO,否则会污染领域语义(例如
UserQuery不该有page字段)。
推荐分离式,职责更清晰,也方便对分页参数做统一拦截或审计。

















