Skip to content

分页查询完整链路

Forge 分页查询从前端到后端完整链路:前端传 pageNum + pageSize → Controller 接收 → Service 调用 MyBatis-Plus Page → 返回 PageResult

请求参数

前端传递分页参数:

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

Controller

java
@GetMapping("/page")
@SaCheckPermission("biz:order:list")
public RespInfo page(
    @RequestParam(defaultValue = "1") Integer pageNum,
    @RequestParam(defaultValue = "10") Integer pageSize,
    OrderQueryDTO query
) {
    return RespInfo.success(orderService.page(query, pageNum, pageSize));
}

Service

java
@Override
public PageResult<OrderVO> page(OrderQueryDTO query, Integer pageNum, Integer pageSize) {
    Page<OrderEntity> page = new Page<>(pageNum, pageSize);
    List<OrderVO> list = orderMapper.selectOrderPage(page, query);
    return PageResult.of(list, page.getTotal());
}

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

响应格式

json
{
  "code": 200,
  "msg": "操作成功",
  "data": {
    "total": 100,
    "list": [
      {
        "id": 1,
        "orderNo": "ORD001",
        "amount": 10000,
        "status": "0",
        "statusLabel": "待支付",
        "createTime": "2024-01-01 12:00:00"
      }
    ]
  }
}
字段类型说明
totalLong总记录数
listArray当前页数据列表

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

Forge Admin — 基于 Vue3 + Spring Boot 的企业级后台管理框架