MyBatis-Plus 内置分页、PageHelper 自定义分页

一、方式 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);
}
相关推荐
paopaokaka_luck9 分钟前
非遗文物数字化小程序(AI非遗问答、ONNX图像识别、协同过滤推荐、ECharts数据分析、非遗知识浏览与互动、文创商城订单闭环、文化活动报名签到、社区交流)
javascript·spring boot·mysql·数据分析·echarts·mybatis
韩曙亮3 小时前
【JavaEE】MyBatis 基本用法 ⑤ ( 单条件查询 | 多条件查询 | 多条件动态查询 | 单条件动态查询 )
java·sql·java-ee·mybatis·mapper·sql映射
x-Achan4 小时前
Redis实现方案:更新策略、穿透、雪崩、击穿、工具封装
java·spring boot·redis·spring·bootstrap·mybatis
shuoshuohaohao2 天前
MyBatis 小知识点
java·spring·mybatis
CarIise3 天前
MyBatis动态SQL:从条件拼接到底层原理实战
mybatis
CarIise3 天前
Spring Boot图片展示与统一返回格式:从资源映射到泛型封装实战
mybatis
钝挫力PROGRAMER4 天前
开发踩坑记:MyBatis selectKey、空 SQL
数据库·sql·mybatis
自强的小白4 天前
核心功能(Service接口)
java·mybatis
自强的小白4 天前
mybatis-plus 的扩展功能
mybatis·mybatis_plus
自强的小白4 天前
MYbatis-plus(自定义sql)
java·sql·mybatis