Spring Boot 3 整合 MyBatis-Plus:JDK 17 环境配置与分页插件实战

简介:这份资源是面向Java后端开发者与初学者的Spring Boot 3整合MyBatisPlus实战示例工程,针对企业级Web应用中数据访问层配置繁琐、CRUD模板代码重复等痛点,提供一套可直接运行的整合方案。压缩包共24个文件,约85KB,包含7个Java源码、7个class编译文件、2个yaml配置、1个properties、1个pom.xml及mvnw构建脚本等,覆盖依赖管理、数据源配置、Mapper接口、实体注解与Service、Controller分层结构,目录组织清晰,便于对照学习。目前已有1435人学习下载,说明该整合方案在开发者社区中具有较高的参考价值。读者可从中获取Spring Boot 3与MyBatisPlus协同工作的完整工程骨架,理解BaseMapper通用CRUD、条件构造器与自动填充等核心用法,并可直接基于该结构扩展业务模块,减少重复搭建环境的时间成本。

1. Spring Boot 3 整合 MyBatis-Plus:从 JDK 17 到分页插件跑通

很多人第一次在 Spring Boot 3 里配 MyBatis-Plus,都会卡在同一个地方:依赖能下、项目能起,但一调 Mapper 就报Invalid bound statement,或者分页查出来总数永远是 0。这不是代码写错了,而是 Spring Boot 3 把底层依赖整体抬到了 JDK 17 和 Jakarta EE 9+,而 MyBatis-Plus 的 starter 如果版本没跟上,扫描和自动装配就会静默失效。这套组合在后台管理系统、数据中台、内部工具里出现频率极高,几乎每个 Java 后端都会碰到。下面按我实际装环境的顺序,把 JDK、Maven、依赖、配置、分页和排错一次讲清,照着走能少熬两个晚上。

2. 环境准备:JDK 17、Maven 与 Spring Boot 3 的版本对齐

2.1 为什么必须是 JDK 17 起步

Spring Boot 3 的最低要求是 JDK 17,这不是建议,是硬门槛。用 JDK 8 或 11 编译,spring-boot-starter-web里的jakarta.servlet包根本加载不了,启动直接抛NoClassDefFoundError。我一般用 Temurin 17 或 21,LTS 版本稳定,IDE 里把编译级别和运行级别都设成 17。

# 检查当前 JDK 版本,必须 >= 17 java -version # 输出示例:openjdk version "17.0.9" 2023-10-17 # 如果系统有多个 JDK,用 JAVA_HOME 显式指定 export JAVA_HOME=/usr/lib/jvm/temurin-17-jdk export PATH=$JAVA_HOME/bin:$PATH

java -version看的是运行时,javac -version看的是编译器,两个都要确认。Maven 编译时用的是JAVA_HOME指向的 JDK,如果 IDE 里配了别的,会出现命令行能编译、IDE 报错的玄学问题。

2.2 Maven 版本与镜像配置

Maven 用 3.8 以上即可,3.9 更稳。关键是settings.xml里配好镜像,否则拉 Spring Boot 3 的依赖会慢到怀疑人生。

<!-- ~/.m2/settings.xml 片段 --> <mirrors> <mirror> <id>aliyun-central</id> <mirrorOf>central</mirrorOf> <name>aliyun central</name> <url>https://maven.aliyun.com/repository/central</url> </mirror> </mirrors>

mirrorOf写central表示只代理中央仓库,不要写*,否则连公司私服也会被劫持。配完后执行mvn help:effective-settings确认镜像生效。

2.3 版本对照表:别让 starter 版本打架

Spring Boot 3 和 MyBatis-Plus 的版本必须成对选,下面是我验证过能跑通的组合:

组件推荐版本说明
JDK17 / 21LTS,21 性能更好
Spring Boot3.2.x3.0/3.1 也可,3.2 最稳
MyBatis-Plus3.5.5+必须用mybatis-plus-spring-boot3-starter
MySQL 驱动8.0.33+用com.mysql.cj.jdbc.Driver
Lombok1.18.30+低版本在 JDK 21 下会编译失败

最容易翻车的是 starter 名字:Spring Boot 3 要用mybatis-plus-spring-boot3-starter,不是老的mybatis-plus-boot-starter。用错了不会报错,只会扫描不到 Mapper。

3. 依赖引入与 application.yml 配置落地

3.1 pom.xml 里到底写哪几个依赖

父工程锁定 Spring Boot 版本,子模块只引 starter,不要手动指定 MyBatis-Plus 的版本号,交给 BOM 管理。

<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.5</version> <relativePath/> </parent> <dependencies> <!-- Web 基础,Spring Boot 3 自带 jakarta 命名空间 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 关键:Spring Boot 3 专用 starter,别用错 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-spring-boot3-starter</artifactId> <version>3.5.5</version> </dependency> <!-- MySQL 驱动,scope 用 runtime --> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies>

mybatis-plus-spring-boot3-starter内部已经带了mybatis-spring和mybatis,不要再单独引mybatis-spring-boot-starter,两个一起引会导致自动配置冲突,启动时报BeanDefinitionOverrideException。

3.2 application.yml 的最小可用配置

spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/demo_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false username: root password: your_password mybatis-plus: # Mapper XML 位置,多个路径用逗号分隔 mapper-locations: classpath*:/mapper/**/*.xml # 实体类别名包,XML 里可直接写类名 type-aliases-package: com.example.demo.entity configuration: # 下划线转驼峰,数据库 user_name -> 实体 userName map-underscore-to-camel-case: true # 开发期打印 SQL,上线关掉 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: # 主键自增,实体不写 @TableId 也能识别 id-type: auto

mapper-locations里的classpath*:带星号,表示扫描所有 jar 和目录下的匹配文件,漏了星号在多模块项目里只能扫到当前模块。serverTimezone必须写,不写 MySQL 8 会报时区错误。

3.3 启动类加 @MapperScan

@SpringBootApplication @MapperScan("com.example.demo.mapper") // 扫描 Mapper 接口 public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }

@MapperScan的包路径要精确到 mapper 接口所在包,不要写com.example.demo这种大范围,否则会把 Service 也当 Mapper 扫描,启动报No statement found。如果每个 Mapper 上都加了@Mapper,可以省略这个注解,但多模块下我建议统一用@MapperScan,省得漏。

4. 分页插件与代码生成器:两个最容易配错的模块

4.1 分页插件必须手动注册

MyBatis-Plus 3.5.x 的分页插件不会自动生效,必须写配置类。不注册的话Page查询返回全部数据,total为 0,这是最高频的坑。

@Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 分页插件,指定数据库类型 interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 乐观锁插件,按需加 interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); return interceptor; } }

DbType.MYSQL要和你实际数据库一致,写成DbType.OTHER分页 SQL 会拼错。多个内部拦截器有顺序要求:分页插件放最后加,否则可能被其他拦截器改写 SQL 导致分页失效。

4.2 分页查询的写法与验证

// Service 层 public IPage<User> pageQuery(int pageNum, int pageSize) { Page<User> page = new Page<>(pageNum, pageSize); // 第二个参数是查询条件,null 表示查全部 return userMapper.selectPage(page, null); }

Page的pageNum从 1 开始,不是 0。传 0 会返回空列表但不报错,很容易误判成没数据。验证时看控制台打印的 SQL 有没有LIMIT,有LIMIT且total正确,说明插件生效。

4.3 代码生成器在 Spring Boot 3 下的调整

MyBatis-Plus 的代码生成器依赖freemarker和velocity,Spring Boot 3 下要单独引,且模板引擎版本要新。

FastAutoGenerator.create(url, username, password) .globalConfig(builder -> builder .author("dev") .outputDir(System.getProperty("user.dir") + "/src/main/java") .disableOpenDir()) // 生成后不自动打开目录 .packageConfig(builder -> builder .parent("com.example.demo") .entity("entity") .mapper("mapper") .service("service")) .strategyConfig(builder -> builder .addInclude("user", "order") // 指定表名 .entityBuilder().enableLombok()) .execute();

outputDir用user.dir相对路径,别写死绝对路径,换机器就废。addInclude不写会生成全库所有表,生产库上跑一次能生成几百个文件。

5. 避坑排查:整合后启动报错的五条血泪记录

5.1 现象:Invalid bound statement (not found)

原因:Mapper 接口和 XML 没对上。要么mapper-locations路径写错,要么 XML 的namespace不是接口全限定名,要么 XML 放在src/main/java下没配资源过滤。

解决:先看target/classes/mapper下有没有 XML 文件,没有就是资源没打包。在pom.xml的<build>里加:

<resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources>

5.2 现象:分页 total 为 0,数据却查出来了

原因:分页插件没注册,或者注册了但DbType写错。还有一种情况是自定义 SQL 里用了UNION,分页插件生成的 count 语句不兼容。

解决:确认MybatisPlusInterceptor被 Spring 扫描到,自定义复杂 SQL 手动写 count 查询,用page.setTotal()设置。

5.3 现象:启动报 jakarta.servlet 相关 ClassNotFound

原因:引了老的javax.servlet依赖,或者某个第三方库还在用 javax。

解决:mvn dependency:tree | grep javax.servlet找出冲突源,排除掉。Spring Boot 3 下所有 servlet 相关依赖都必须是 jakarta 版本。

5.4 现象:Lombok 编译报错,提示找不到符号

原因:Lombok 版本低于 1.18.30,在 JDK 21 下注解处理器不工作。

解决:升级 Lombok 到 1.18.30+,并在maven-compiler-plugin里显式配置注解处理器路径。

5.5 现象:多模块下子模块 Mapper 扫描不到

原因:@MapperScan只写在启动类所在模块,子模块的 Mapper 包不在扫描范围。

解决:@MapperScan写多个包路径,或者用@MapperScan(basePackages = {"com.example.module1.mapper", "com.example.module2.mapper"})。

6. 装完怎么验证:三条命令确认整合真的跑通

环境装完别急着写业务,先跑一遍验证。我一般按下面三步走,任何一步不过就回去查对应配置。

第一步,启动应用看日志。控制台出现MyBatis-Plus的 banner 和Started DemoApplication才算启动成功。如果看到No MyBatis mapper was found的警告,说明@MapperScan路径不对。

第二步,调一个分页接口,看控制台 SQL。正常应该打印两条:一条SELECT COUNT(*),一条带LIMIT的查询。只有一条带LIMIT的,说明分页插件没生效。

# 用 curl 验证分页接口 curl "http://127.0.0.1:8080/user/page?pageNum=1&pageSize=10" # 期望返回:{"records":[...],"total":100,"size":10,"current":1}

total是真实总数,records长度等于pageSize,current等于传入的pageNum,三个都对才算过。

第三步,验证 XML 自定义 SQL。写一个带resultMap的查询,确认字段映射正确。如果返回对象字段全是 null,检查map-underscore-to-camel-case是否开启,以及 XML 里resultType写的是不是全限定名。

验证项通过标准失败先查
应用启动无 Mapper 警告@MapperScan 路径
分页查询有 COUNT 和 LIMIT分页插件注册
XML 查询字段有值mapper-locations
主键回填insert 后 id 有值id-type 配置

从那以后我每次搭 Spring Boot 3 加 MyBatis-Plus 的环境,都强制先跑这三步再写业务代码,省得写到一半发现分页是坏的、字段映射是错的,回头返工更费时间。希望帮到你。

本文还有配套的精品资源,点击获取

相关新闻

高光D35正式量产携手歌乐士,边缘AI端侧SoC选型新参考

高光D35正式量产携手歌乐士,边缘AI端侧SoC选型新参考

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 2:16:50 阅读更多 →
【AI技术】从 Tool 到 Workflow:AI 如何真正“做事”?

【AI技术】从 Tool 到 Workflow:AI 如何真正“做事”?

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 2:16:50 阅读更多 →
【AI技术】Agent:AI 为什么需要“自主决策”?

【AI技术】Agent:AI 为什么需要“自主决策”?

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 2:16:50 阅读更多 →

最新新闻

AI辅助文献综述写作:从研究地图到落地实操

AI辅助文献综述写作:从研究地图到落地实操

1. 先想清楚&#xff1a;你需要的不是一篇"文献汇报"&#xff0c;而是一张"研究地图"1.1 综述为什么写不好&#xff1a;大多数人把它做成了资料汇编我在帮某高校实验室的几位研究生改开题报告时&#xff0c;见过太多"综述"其实是这样写出来的&am…

2026/10/21 2:57:03 阅读更多 →
JavaWeb运动健康管理系统源码解析与二次开发实战

JavaWeb运动健康管理系统源码解析与二次开发实战

简介&#xff1a;这份资源是面向JavaWeb初学者与课程设计开发者的运动与健康管理系统完整源码包&#xff0c;包含可运行的Web工程与配套数据库脚本&#xff0c;可用于毕业设计、课程实训或自学练手。压缩包共707个文件&#xff0c;约9.59MB&#xff0c;以gif、js、jsp、html、j…

2026/10/21 2:57:03 阅读更多 →
AI Agent与Subagent协作实战:任务分发、上下文管理与结果校验的稳定范式

AI Agent与Subagent协作实战:任务分发、上下文管理与结果校验的稳定范式

说实话&#xff0c;提到 AI Agent 和 Subagent 的协作&#xff0c;我最早是持怀疑态度的。大概两三个月前&#xff0c;我接手了一个任务&#xff1a;把几十份格式混乱的行业资料整理成结构化问答库。一开始我用单个 AI Agent 跑&#xff0c;前面几轮效果还行&#xff0c;但随着…

2026/10/21 2:57:03 阅读更多 →
EmEditor7 语法高亮配置与大文件正则替换实战指南

EmEditor7 语法高亮配置与大文件正则替换实战指南

简介&#xff1a;EmEditor7是一款面向程序员、网页设计师及文本处理工作者的专业文本编辑器&#xff0c;主打语法高亮与高效代码编辑&#xff0c;可解决系统记事本功能单一、大文件卡顿等问题。资源包共92个文件&#xff0c;约4.1MB&#xff0c;以47个dll核心组件为主&#xff…

2026/10/21 2:57:03 阅读更多 →
SpringBoot分布式库存订单与盘点一体化WMS系统实战

SpringBoot分布式库存订单与盘点一体化WMS系统实战

仓库管理系统&#xff08;WMS&#xff09;是Java方向里热度常年靠前的毕设选题&#xff0c;但也是翻车重灾区。我见过不少打着“基于SpringBoot的智能仓储信息管理平台”旗号的项目&#xff0c;点开一看&#xff0c;二十多张表、几十个接口&#xff0c;本质却还是增删改查。说实…

2026/10/21 2:57:03 阅读更多 →
NVFP4预训练大模型:从量化训练到部署的全面解析

NVFP4预训练大模型:从量化训练到部署的全面解析

最近把这篇《Pretraining Large Language Models with NVFP4》翻来覆去读了几遍&#xff0c;越读越觉得它不只是“又一篇4位精度论文”&#xff0c;更像是给整个量化生态指了一个新方向。过去大家默认FP4只能做推理阶段的压缩&#xff0c;谁在预训练里碰4位精度&#xff0c;谁就…

2026/10/21 2:56:03 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事&#xff1a;AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里&#xff0c;按宣传口径&#xff0c;本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”&#xff0c;而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起&#xff1a;用户到底在追求什么“封号重开”这四个字&#xff0c;放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流&#xff0c;背后是大量的时间和精力成本。正常情况下&#xff0c;没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”&#xff0c;而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时&#xff0c;就意识到&#xff1a;单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →