BladeX框架分页(对MP分页的二次封装)
在BladeX框架中,分页设计是数据查询功能的核心组成部分,基于MyBatis-Plus的分页能力进行了封装与扩展,形成了一套简洁高效的分页处理机制。其设计目标是简化分页参数处理、统一分页结果格式、适配前端常见分页需求。下面从核心组件、工作流程、扩展特性三个方面详细分析:
一、核心组件与设计基础
BladeX的分页设计依赖于以下核心组件,形成完整的分页链路:
-
MyBatis-Plus的IPage接口
作为底层分页载体,IPage
定义了分页的基础属性:current
:当前页码(默认从1开始)size
:每页条数total
:总记录数pages
:总页数records
:当前页数据列表
-
Condition工具类
框架封装的分页条件构造工具,核心方法getPage(query)
负责:- 从查询参数(
query
对象)中提取分页参数(pageNum
/pageSize
) - 自动创建
IPage
实例并设置分页参数 - 处理排序参数(如
orderBy
字段,支持多字段排序)
- 从查询参数(
-
QueryDTO基类
前端传递的查询参数通常继承自QueryDTO
,内置分页相关字段:public class QueryDTO {private Integer pageNum = 1; // 默认页码private Integer pageSize = 10; // 默认每页条数private String orderBy; // 排序字段,格式如"create_time desc"// getter/setter }
-
分页结果封装(R)
接口返回的统一格式,通过R.data(page)
包装分页结果,前端可直接解析:{"code": 200,"msg": "操作成功","data": {"current": 1,"size": 10,"total": 100,"pages": 10,"records": [...]} }
二、分页工作流程
BladeX的分页处理流程可分为参数解析→条件构建→查询执行→结果返回四步,全程简化开发者的编码工作:
-
前端传递分页参数
前端通过URL参数或请求体传递分页信息,例如:GET /api/user/page?pageNum=2&pageSize=20&orderBy=name asc
-
后端接收并解析参数
控制器方法接收继承自QueryDTO
的查询对象(如UserQuery
),自动绑定分页参数:@GetMapping("/page") public R<IPage<UserVO>> page(UserQuery query) {// query中已包含pageNum、pageSize、orderBy等参数 }
-
创建分页条件
调用Condition.getPage(query)
生成IPage
实例,自动处理分页和排序:IPage<UserVO> page = Condition.getPage(query); // 等价于手动创建: // IPage<UserVO> page = new Page<>(query.getPageNum(), query.getPageSize()); // 并处理query.getOrderBy()的排序逻辑
-
执行分页查询
Service层调用MyBatis-Plus的page
方法,传入IPage
和查询条件(QueryWrapper
):@Override public IPage<UserVO> selectUserPage(IPage<UserVO> page, UserQuery query) {// 构建查询条件QueryWrapper<User> wrapper = Wrappers.query();if (StrUtil.isNotBlank(query.getName())) {wrapper.like("name", query.getName());}// 执行分页查询,结果会自动填充到page对象中return baseMapper.selectPage(page, wrapper); }
-
返回统一结果
控制器将IPage
对象通过R.data()
包装后返回,前端直接使用:return R.data(userService.selectUserPage(page, query));
三、扩展特性与设计亮点
BladeX在基础分页功能上增加了多项实用特性,提升开发效率:
-
默认分页参数与全局配置
- 若前端未传递
pageNum
/pageSize
,框架默认使用1
和10
- 可通过配置文件全局修改默认值:
blade:mybatis:page-size: 20 # 默认每页条数
- 若前端未传递
-
排序参数自动解析
支持通过orderBy
参数指定排序规则(如orderBy=create_time desc,id asc
),Condition
工具类会自动将其转换为QueryWrapper
的排序条件,无需手动调用orderByDesc
/orderByAsc
。 -
适配前端表格组件
分页结果格式(current
/size
/total
/records
)与主流前端UI框架(如Element UI、Ant Design)的表格组件分页参数完全兼容,前端可直接绑定数据,无需额外转换。 -
分页拦截器自动生效
框架默认配置了MyBatis-Plus的MybatisPlusInterceptor
,并注册了PaginationInnerInterceptor
,无需开发者手动配置分页插件,启动即可使用分页功能。 -
支持自定义分页逻辑
若默认分页无法满足需求(如复杂的多表联查分页),可手动创建IPage
对象,结合baseMapper
的自定义SQL实现分页:IPage<UserVO> page = new Page<>(query.getPageNum(), query.getPageSize()); return page.setRecords(baseMapper.customPageQuery(page, query));
总结
BladeX的分页设计本质是对MyBatis-Plus分页能力的“二次封装”,通过Condition
工具类简化参数处理,通过QueryDTO
和R<IPage>
统一前后端交互格式,同时保留了底层分页的灵活性。这种设计既降低了分页功能的开发成本,又保证了扩展性,非常适合快速开发企业级后台系统。