一、方式 1:MyBatis-Plus 自带分页
1. 必须配置分页拦截器(否则 total=0)
java
运行
@Configuration
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 分页插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
}
2. 使用示例(Service 层)
java
运行
// pageNum 当前页,pageSize 每页条数
Page<OrderInfo> page = new Page<>(1, 10);
LambdaQueryWrapper<OrderInfo> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(OrderInfo::getIsDelete, 0).orderByDesc(OrderInfo::getCreateTime);
// 执行分页查询
Page<OrderInfo> pageResult = orderService.page(page, wrapper);
// 分页结果取值
List<OrderInfo> records = pageResult.getRecords(); // 当前页数据
long total = pageResult.getTotal(); // 总条数
long pages = pageResult.getPages(); // 总页数
3. XML 自定义多表分页
Mapper 接口第一个参数必须传 Page 对象,无需手写 limit
java
运行
Page<OrderVO> selectOrderPage(Page<OrderVO> page, @Param("name") String name);
xml
<select id="selectOrderPage" resultType="com.vo.OrderVO">
SELECT o.*,p.product_name
FROM order_info o
LEFT JOIN product p ON o.product_id = p.id
<where>
<if test="name != null">p.product_name like concat('%',#{name},'%')</if>
o.is_delete = 0
</where>
</select>
二、方式 2:PageHelper 自定义分页(独立分页插件,原生 MyBatis 专用)
1. Maven 引入依赖
xml
<!-- SpringBoot3适配 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.7</version>
</dependency>
2. yml 简单配置
yaml
pagehelper:
helperDialect: mysql
reasonable: true # 页码小于1查第一页,超过总页数查最后一页
pageSizeZero: false
3. 核心使用语法(两行代码)
关键点:PageHelper.startPage(pageNum,pageSize) 必须紧跟查询 Mapper 方法,中间不能有其他 SQL 查询
java
运行
// 1. 设置分页参数,自动拦截下一条SQL拼接limit
PageHelper.startPage(1,10);
// 2. 执行普通全量查询(无需写分页逻辑)
List<OrderInfo> list = orderMapper.selectAllOrder();
// 3. 封装分页结果
PageInfo<OrderInfo> pageInfo = new PageInfo<>(list);
// 分页参数获取
List<OrderInfo> data = pageInfo.getList();
long total = pageInfo.getTotal();
int pages = pageInfo.getPages();
4. Mapper XML 就是普通查询,不需要处理分页
xml
<select id="selectAllOrder" resultType="OrderInfo">
select * from order_info where is_delete = 0
</select>
5. 安全注意
startPage 仅对紧随其后第一条 select 生效,中间如果执行其他查询会导致分页错乱; 禁止循环内使用 PageHelper,容易分页污染。
两种分页核心对比
表格
| 对比项 | MyBatis-Plus 分页 | PageHelper 分页 |
|---|---|---|
| 依赖关系 | MP 内置,无需额外包 | 独立第三方插件,额外引入 |
| 使用方式 | 方法第一个参数传入 Page 对象 | 查询前调用PageHelper.startPage()静态方法 |
| 多表自定义 SQL | 支持,自动拼接 limit | 完全兼容原生 XML,无需改造 SQL |
| Lambda 条件 | 支持 LambdaQueryWrapper,无硬编码字段 | 仅原生 MyBatis,无 Lambda |
| 分页参数传递 | 方法入参传递,代码直观 | 基于线程 ThreadLocal 存储分页参数,隐式生效 |
| 主流场景 | SpringBoot+MyBatis-Plus 项目(你的项目) | 纯原生 MyBatis 无 MP 的老项目 |
补充 Controller 标准返回封装示例
MP 分页返回
java
运行
@GetMapping("/order/page")
public Result<Page<OrderInfo>> page(
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize
){
Page<OrderInfo> page = new Page<>(pageNum, pageSize);
LambdaQueryWrapper<OrderInfo> wrapper = new LambdaQueryWrapper<>();
Page<OrderInfo> res = orderService.page(page,wrapper);
return Result.success(res);
}
PageHelper 分页返回
java
运行
@GetMapping("/order/page")
public Result<PageInfo<OrderInfo>> page(
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize
){
PageHelper.startPage(pageNum,pageSize);
List<OrderInfo> list = orderMapper.selectAllOrder();
PageInfo<OrderInfo> pageInfo = new PageInfo<>(list);
return Result.success(pageInfo);
}