当前位置: 首页 > news >正文

SpringBoot 整合 MyBatis-Plus 分页插件完整教程

SpringBoot 整合 MyBatis-Plus 分页插件完整教程

一、前置说明

  1. MP 分页必须手动注册分页拦截器,不配置会出现分页 total 总条数为 0、不分页的问题;
  2. 适配 MP 3.5+ 新版写法(MybatisPlusInterceptor 统一插件入口),废弃旧版 PaginationInterceptor;
  3. 支持 MySQL、Oracle 等多种数据库,可指定数据库类型优化分页 SQL。

二、第一步:编写分页配置类

新建配置包com.config,创建MyBatisPlusConfig.java

java

运行

package com.config; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MyBatisPlusConfig { /** * 注册MyBatis-Plus统一拦截器 */ @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 分页插件 PaginationInnerInterceptor pageInterceptor = new PaginationInnerInterceptor(); // 可选:设置数据库类型,自动适配分页语法,MySQL可不写 // pageInterceptor.setDbType(DbType.MYSQL); // 可选:设置单页最大条数,防止恶意超大分页查询 pageInterceptor.setMaxLimit(1000L); interceptor.addInnerInterceptor(pageInterceptor); return interceptor; } }

参数说明

  1. setMaxLimit(1000L):限制单次查询最多 1000 条,避免LIMIT 1,100000深度分页拖垮数据库;
  2. DbType.MYSQL:数据库类型,MP 自动生成分页语句,多数据源场景建议显式指定。

三、分页使用方式(Service 层标准用法)

1. 分页对象构造

Page<T>两个参数:当前页码、每页条数

java

运行

// 第1页,每页10条 Page<OrderInfo> page = new Page<>(1, 10);

2. 配合 LambdaQueryWrapper 条件分页

java

运行

@Autowired private OrderInfoService orderInfoService; public Page<OrderInfo> getOrderPage(Integer pageNum, Integer pageSize) { // 1. 分页对象 Page<OrderInfo> page = new Page<>(pageNum, pageSize); // 2. 查询条件 LambdaQueryWrapper<OrderInfo> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(OrderInfo::getIsDelete, 0) .orderByDesc(OrderInfo::getCreateTime); // 3. 执行分页查询 Page<OrderInfo> pageResult = orderInfoService.page(page, wrapper); return pageResult; }

3. 返回分页对象常用属性

java

运行

// 当前页数据列表 List<OrderInfo> records = pageResult.getRecords(); // 总数据条数 long total = pageResult.getTotal(); // 总页数 long pages = pageResult.getPages(); // 当前页码 long current = pageResult.getCurrent(); // 每页条数 long size = pageResult.getSize();

四、Mapper 层直接分页(不推荐,优先 Service)

java

运行

Page<OrderInfo> page = new Page<>(1,10); LambdaQueryWrapper<OrderInfo> wrapper = new LambdaQueryWrapper<>(); Page<OrderInfo> pageResult = orderInfoMapper.selectPage(page, wrapper);

五、自定义 XML 多表联查分页(原生 SQL 分页兼容)

1. Mapper 接口

java

运行

Page<OrderVO> selectOrderPage(Page<OrderVO> page, @Param("name") String name);

2. XML 不需要手写 LIMIT,MP 自动拼接分页语句

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 and name != ''"> p.product_name LIKE CONCAT('%',#{name},'%') </if> o.is_delete = 0 </where> ORDER BY o.create_time DESC </select>

六、常见问题与解决方案

问题 1:分页查询 total 总条数为 0

原因:未配置MybatisPlusInterceptor分页插件; 解决:复制上方配置类,确保被 Spring 扫描到(加@Configuration)。

问题 2:深度分页 LIMIT 100000,10 很慢

优化:

  1. 配置setMaxLimit限制最大单页条数;
  2. 大分页使用主键偏移分页替代普通分页。

问题 3:XML 自定义 SQL 分页失效

  1. 方法第一个参数必须是Page<T>
  2. 不要自己手写limit,会重复拼接导致语法报错。

问题 4:分页插件与乐观锁 / 防全表更新插件共存

直接叠加添加内部拦截器即可:

java

运行

interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());

七、Controller 接收分页参数标准示例

java

运行

@GetMapping("/order/page") public Result<Page<OrderInfo>> orderPage( @RequestParam(defaultValue = "1") Integer pageNum, @RequestParam(defaultValue = "10") Integer pageSize ) { Page<OrderInfo> pageData = orderInfoService.getOrderPage(pageNum, pageSize); return Result.success(pageData); }
http://www.jsqmd.com/news/1163996/

相关文章:

  • 每日穿搭助手:鸿蒙AI应用开发实战——AI衣橱,每日穿搭不再愁
  • 中级OpenGL教程 014:Phong标准化渲染管线架构搭建|附完整C++源码四大避坑总结
  • Spine+Unity 2D骨骼动画全流程实战:从美术拆分到程序驱动与性能优化
  • 计算机大数据毕设实战-基于 Python 的热点微博舆情态势分析系统的设计与实现 基于 Python 的微博热门话题数据统计分析系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 2026 广州 GEO 优化服务商技术测评:自研系统与全意图能力深度对比 - GEO优化
  • ft_engine深度解析:如何用方天视窗引擎彻底改变Linux桌面体验
  • CCRC-DSA数据安全评估师认证信息整理
  • 2026年教学优质的长春雅思培训机构排行指南分享 - 互联网科技品牌测评
  • 2026GEO行业真实数据曝光:近半数企业选型踩坑,真正有效落地的只有一种 - GrowUME
  • 虚幻引擎脚本系统:游戏模组开发的技术架构与实现路径
  • 2026年7月最新成都雅典官方售后客户服务电话及线下网点地址 - 亨得利官方服务中心
  • 195、从 Bug 到经验沉淀:如何把一次排错变成团队的永久知识资产
  • OpenHarmony 完整项目工程整合规范 + 模块化分层架构(API23+ 标准企业级结构)
  • 基于MCP3202和PIC32的锂电池电压平衡系统设计
  • 身份证翻译件怎么弄?超全办理指南分享来喽
  • LTF架构深度剖析:如何实现高覆盖、低耦合的轻量级测试框架
  • WechatDecrypt技术解析:深入理解微信数据库AES-256-CBC解密机制
  • kconfigDetector在openEuler中的应用:提升内核配置质量的实战案例
  • 业务架构:业务的顶层设计
  • 前端错误监控工具链:Sentry 自建部署与 SourceMap 私密上传方案
  • TVA与VLA模型:具身智能跨模态桥梁(系列)
  • 为什么你需要OSAPIChecker?操作系统API合规性的10个关键挑战
  • 北辰架构 v1.0 · 超越 MoE 的下一代混合智能架构
  • 昆明盘龙区旧房翻新、二手房改造专业装修机构口碑推荐 - 空间设计
  • 解决A-FOT使用难题:从负优化到多实例限制,常见问题与解决方案
  • FastAPI python web开发- 路由与参数(路径参数查询参数请求体参数)
  • Linux gpm命令详解|纯文本终端鼠标启用、复制粘贴超实用教程
  • AI驱动混线生产
  • TVA与VLA模型:具身智能的跨模态桥梁(7)
  • Linux第18篇:Spring Boot 生产部署完全指南——从“能跑”到“敢拍胸脯”