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);
}
相关推荐
就改了14 小时前
MyBatis核心类用法详解
java·spring boot·后端·mybatis
momo2 天前
Java+WebAI黑马知识点
java·spring boot·mybatis
snow@li2 天前
MyBatis:动态 SQL 全景梳理
数据库·sql·mybatis
就改了2 天前
Mybatis快速入门大全(详细版)
java·spring boot·mybatis
qq_171538852 天前
深入浅出 MyBatis XML:从入门到精通
xml·java·mybatis
万亿少女的梦1682 天前
基于SSM、JSP与MySQL的秦皇岛旅游服务管理系统设计与实现
mysql·mybatis·ssm·jsp·spring mvc
jaysee-sjc3 天前
【JavaWeb】JDBC与Mybatis零基础入门详解
java·开发语言·前端·mybatis
dear_bi_MyOnly3 天前
【MyBatis 操作数据库】
java·数据库·学习·mybatis·学习方法
用户3126874877203 天前
分页插件到底怎么拦截 SQL?MyBatis-Plus 插件机制原理一次讲透
mybatis
马优晨4 天前
pring Boot + MyBatis + Redis 项目分层架构详解 —— 各层职责、关系与工作流程
架构·mybatis·spring项目分层架构详解·spring项目架构详解·spring各层职责·spring关系与工作流程