分页查询完整链路
分页:前端传 pageNum + pageSize(PageQuery)→ Controller 收查询对象 → 返回 RespInfo<IPage<T>>。
请求参数
前端传递分页参数:
javascript
// AiCrudPage 自动传递
// 手动调用
request.get('/biz/order/page', {
params: { pageNum: 1, pageSize: 10, orderNo: 'ORD001' }
})| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
pageNum | Integer | 1 | 当前页码 |
pageSize | Integer | 10 | 每页条数 |
Controller
java
@GetMapping("/page")
public RespInfo<IPage<OrderVO>> page(OrderQueryDTO query) {
return RespInfo.success(orderService.page(query));
}Service
java
public IPage<OrderVO> page(OrderQueryDTO query) {
return orderMapper.selectOrderPage(query.toPage(), query);
}用户模块的真实写法是 RespInfo.success(userService.selectUserPage(query)),直接回 IPage。
Mapper
java
List<OrderVO> selectOrderPage(
@Param("page") Page<OrderEntity> page,
@Param("query") OrderQueryDTO query
);Mapper XML
xml
<select id="selectOrderPage" resultMap="OrderVOMap">
SELECT
o.id, o.order_no, o.amount, o.status, o.create_time,
d.dict_label AS status_label
FROM biz_order o
LEFT JOIN sys_dict_data d
ON d.dict_type = 'biz_order_status'
AND d.dict_value = o.status
AND d.del_flag = 0
WHERE o.del_flag = 0
<if test="query.orderNo != null and query.orderNo != ''">
AND o.order_no LIKE CONCAT('%', #{query.orderNo}, '%')
</if>
<if test="query.status != null and query.status != ''">
AND o.status = #{query.status}
</if>
ORDER BY o.create_time DESC
</select>MyBatis-Plus 分页插件自动追加 LIMIT,不需要在 XML 中手写。
响应格式
外层 RespInfo 用 message。data 是 MyBatis-Plus IPage:records / total / current / size / pages。不是 list,也不是 rows。完整形状见 分页协议。
PageQuery 基类
分页查询 DTO 继承 PageQuery:
java
@Data
@EqualsAndHashCode(callSuper = true)
public class OrderQueryDTO extends PageQuery {
private String orderNo;
private String status;
}PageQuery 包含 pageNum 和 pageSize 字段。
分页插件配置
MyBatis-Plus 分页插件在 forge-starter-orm 中已配置:
java
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 分页插件
interceptor.addInnerInterceptor(paginationInnerInterceptor());
// 租户拦截
interceptor.addInnerInterceptor(tenantLineInnerInterceptor());
// 数据权限
interceptor.addInnerInterceptor(dataScopeInterceptor());
return interceptor;
}注意事项
- 参数名必须用
pageNum,不能用page - XML 中不需要写
LIMIT,分页插件自动处理 - 查询必须包含
del_flag = 0条件 - 租户拦截器自动追加
tenant_id条件,不需要手动写
