Skip to content

分页查询完整链路

分页:前端传 pageNum + pageSizePageQuery)→ Controller 收查询对象 → 返回 RespInfo<IPage<T>>

请求参数

前端传递分页参数:

javascript
// AiCrudPage 自动传递
// 手动调用
request.get('/biz/order/page', {
  params: { pageNum: 1, pageSize: 10, orderNo: 'ORD001' }
})
参数类型默认值说明
pageNumInteger1当前页码
pageSizeInteger10每页条数

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 中手写

响应格式

外层 RespInfomessagedata 是 MyBatis-Plus IPagerecords / 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 包含 pageNumpageSize 字段。

分页插件配置

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 条件,不需要手动写