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);
}
相关推荐
代码不停1 天前
MyBatis操作数据库
数据库·mybatis
wno7041 天前
Spring Boot中JdbcTemplate与Mybatis使用PostgreSQL
spring boot·postgresql·mybatis
lzhdim2 天前
100条常用SQL语句
数据库·sql·mysql·mybatis
景熙55232 天前
2.什么是业务后台系统
java·spring·tomcat·mybatis·jdbc
2601_962885723 天前
AkShare 和 Tushare 哪个好?区别、场景与选型
mybatis
_Evan_Yao3 天前
Redis 缓存穿透、击穿、雪崩,一次讲清!
java·spring·mybatis
paopaokaka_luck3 天前
宠物门店经营管理系统(销售与库存联动、进货自动记账、 退换与退款关联、员工个人业绩、ECharts 经营分析、滞销识别与客户分层、宠物档案年龄计算)
前端·javascript·spring boot·mysql·echarts·mybatis·1024程序员节
2301_32241428044 天前
springboot农产品交易平台的设计与实现08055-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·spring boot·redis·mysql·tomcat·maven·mybatis
乐茵lin4 天前
Redis 持久化机制详解:RDB 与 AOF
redis·bootstrap·mybatis
bksczm5 天前
Redis数据结构之string
java·redis·mybatis