尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

JDK 17 + Spring Boot 3 + MyBatis-Plus 实战:从环境搭建到高级特性解析

JDK 17 + Spring Boot 3 + MyBatis-Plus 实战:从环境搭建到高级特性解析 这次我们来看一个 Java 后端开发中非常经典的组合在 JDK 17 和 Spring Boot 3 环境下使用 MyBatis-Plus。这个组合不是新概念但却是当前构建现代化、高性能 Java 应用的主流选择。很多开发者从 JDK 8 和 Spring Boot 2.x 升级过来或者新项目直接采用这套技术栈时会遇到一些配置、兼容性或特性使用上的困惑。这篇文章的重点不是讲基础概念而是直接切入实战告诉你这套组合能不能用、怎么用、有哪些坑以及如何高效地发挥其威力。对于后端开发者而言最关心的几个点无非是环境搭建是否顺畅、与 JDK 17 新特性如 Record、新 GC的兼容性如何、Spring Boot 3 带来的变化如 Jakarta EE 9对 MyBatis-Plus 有何影响、以及如何利用 MyBatis-Plus 的高级功能提升开发效率。本文将围绕这些核心问题通过一个完整的示例项目带你完成从环境准备、项目创建、基础配置、功能演示到性能调优和问题排查的全过程。如果你正在规划新项目技术选型或准备对旧项目进行技术栈升级这篇文章提供的思路和代码可以直接复用。1. 核心能力速览在深入细节之前我们先通过一个表格快速了解这套技术栈的核心特性和关注点。能力项说明与关注点技术栈版本JDK 17 Spring Boot 3.x MyBatis-Plus 最新稳定版如 3.5.x主要优势开发效率高内置CRUD、分页、代码生成、性能好JDK17 ZGC/Shenandoah、生态现代Spring Boot 3环境门槛需安装 JDK 17 或更高版本IDE如 IntelliJ IDEA建议较新版本以提供更好支持。启动方式标准 Spring Boot 应用启动方式mvn spring-boot:run或直接运行Application类。核心功能单表CRUD无需手写SQL、强大的条件构造器、分页插件、自动填充、逻辑删除、性能分析、多数据源支持等。兼容性重点注意 Spring Boot 3 使用 Jakarta EE 9 的jakarta包名替代了之前的javax。MyBatis-Plus 3.5 已全面适配。适合场景快速构建企业级后台管理系统、微服务中的数据访问层、需要高效数据库操作的中大型项目。2. 适用场景与使用边界这套组合拳非常适合追求开发效率和项目规范性的团队。MyBatis-Plus 在 MyBatis 的基础上只做增强其内置的通用 Mapper 和 Service 可以让你省去大量简单的单表操作 SQL而将精力集中在复杂查询和业务逻辑上。结合 JDK 17 的长期支持LTS和性能提升以及 Spring Boot 3 的现代化架构和原生编译支持前瞻技术选型上足够前沿和稳定。它非常适合以下场景新项目快速启动特别是后台管理类项目利用代码生成器几分钟内就能搭建出包含实体、Mapper、Service、Controller 的基础 CRUD 模块。旧项目技术栈升级从 JDK 8 Spring Boot 2.x MyBatis 升级可以平滑地引入 MyBatis-Plus 并享受新版本 JDK 和 Spring Boot 的特性。需要高度定制化 SQL 的项目MyBatis-Plus 不屏蔽 MyBatis 的原生能力复杂 SQL 依然可以使用 XML 或注解方式编写灵活度有保障。微服务架构中的数据层结合 Spring Cloud 生态可以快速构建出数据访问层服务。需要注意的边界学习成本虽然简化了开发但开发者仍需理解 MyBatis 的基本原理和 MyBatis-Plus 的封装思想否则遇到复杂问题时难以排查。过度封装风险应避免为了使用特性而使用对于极其简单的项目或团队技术栈不统一的情况直接使用 Spring Data JPA 或原生 MyBatis 可能更合适。版本依赖需要确保 MyBatis-Plus、MyBatis、Spring Boot 以及数据库驱动之间的版本兼容性建议使用 Spring Boot 官方提供的依赖管理spring-boot-dependencies来统一版本。3. 环境准备与前置条件在开始编码前请确保你的开发环境已就绪。以下是必需的准备清单JDK 17这是硬性要求。从 Oracle 官网或 Adoptium 等渠道下载并安装。安装后在终端执行java -version确认版本。java -version # 应输出类似openjdk version 17.0.10 2024-01-16Maven 3.6 或 Gradle 7.x用于项目构建和依赖管理。本文以 Maven 为例。IntelliJ IDEA (推荐) 或 Eclipse建议使用较新版本的 IDE它们对 JDK 17 新语法如record和 Spring Boot 3 有更好的支持。MySQL 5.7 或其他数据库MyBatis-Plus 支持多种数据库。本文以 MySQL 8.0 为例。请确保数据库服务已启动并创建一个用于测试的数据库如mybatis_plus_demo。网络环境能够正常访问 Maven 中央仓库以下载项目依赖。4. 项目创建与依赖配置我们使用 Spring Initializr 来快速生成项目骨架。你可以通过 start.spring.io 网站或 IDE 内置的 Spring Initializr 功能创建。项目基本信息Project: Maven ProjectLanguage: JavaSpring Boot: 3.2.x (选择最新的稳定版)Project Metadata:Group:com.exampleArtifact:demoName:demoPackage name:com.example.demoPackaging: JarJava: 17Dependencies: 添加Spring Web,Spring Data JDBC(或Spring Data JPA仅用于触发相关自动配置实际使用 MyBatis-Plus),MySQL Driver。点击生成并下载项目解压后用 IDE 打开。接下来我们需要在pom.xml中引入 MyBatis-Plus 的依赖。关键点由于 Spring Boot 3 使用了 Jakarta 命名空间我们必须使用 MyBatis-Plus 3.5.0 及以上版本。同时要排除 Spring Boot 自带的 MyBatis 自动配置如果存在或确保版本兼容。打开pom.xml添加如下依赖dependencies !-- Spring Boot 基础依赖 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- MySQL 驱动 -- dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId scoperuntime/scope /dependency !-- MyBatis-Plus 启动器 (核心) -- dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-spring-boot3-starter/artifactId version3.5.5/version !-- 请使用最新稳定版 -- /dependency !-- Lombok (可选用于简化实体类代码) -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency !-- Spring Boot 测试 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency /dependencies注意mybatis-plus-spring-boot3-starter这个 artifactId 是专门为 Spring Boot 3 适配的它内部已经处理了 Jakarta 包名的问题。这是与 Spring Boot 2.x 版本 (mybatis-plus-boot-starter) 的主要区别之一。5. 基础配置与数据库连接依赖添加完成后需要配置数据库连接和 MyBatis-Plus 的基本设置。编辑src/main/resources/application.yml文件或application.propertiesserver: port: 8080 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/mybatis_plus_demo?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai username: root password: your_password # 替换为你的数据库密码 # MyBatis-Plus 配置 mybatis-plus: configuration: # 控制台打印执行的 SQL 及其参数开发环境开启便于调试 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启下划线转驼峰映射数据库字段 user_name 映射到实体属性 userName map-underscore-to-camel-case: true global-config: db-config: # 全局逻辑删除字段名配置后删除操作变为更新此字段 logic-delete-field: deleted # 逻辑已删除值(默认为 1) logic-delete-value: 1 # 逻辑未删除值(默认为 0) logic-not-delete-value: 0 # 主键类型。AUTO-数据库自增INPUT-手动输入ASSIGN_ID-雪花算法ASSIGN_UUID-UUID id-type: ASSIGN_ID # 指定 Mapper XML 文件位置如果使用 XML 方式编写 SQL 需要配置 # mapper-locations: classpath*:/mapper/**/*.xml配置解读log-impl: StdOutImpl这是开发阶段的神器所有执行的 SQL 都会在控制台打印出来方便排查问题和优化 SQL。map-underscore-to-camel-case: true几乎必配符合 Java 属性命名和数据库字段命名的常见约定。logic-delete-field配置逻辑删除这是 MyBatis-Plus 的一大亮点通过一个字段标记数据是否删除而非物理删除确保数据安全。id-type: ASSIGN_ID使用 MyBatis-Plus 的雪花算法生成分布式 ID适合分布式系统。如果使用数据库自增可改为AUTO。6. 实体、Mapper 与 Service 层构建我们以一个简单的User用户表为例演示 MyBatis-Plus 的核心功能。第一步创建实体类在com.example.demo.entity包下创建User.java。package com.example.demo.entity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import java.time.LocalDateTime; Data TableName(t_user) // 指定表名如果表名与类名一致忽略大小写和下划线可省略 public class User { /** * 主键。TableId 注解标记主键type IdType.ASSIGN_ID 对应配置文件中的全局设置。 */ TableId(type IdType.ASSIGN_ID) private Long id; /** * 用户名 */ private String username; /** * 年龄 */ private Integer age; /** * 邮箱 */ private String email; /** * 创建时间。TableField 注解配置字段行为fill FieldFill.INSERT 表示插入时自动填充。 */ TableField(fill FieldFill.INSERT) private LocalDateTime createTime; /** * 更新时间。fill FieldFill.INSERT_UPDATE 表示插入和更新时自动填充。 */ TableField(fill FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; /** * 逻辑删除标记。TableLogic 注解标记逻辑删除字段。 */ TableLogic private Integer deleted; }第二步创建 Mapper 接口在com.example.demo.mapper包下创建UserMapper.java。继承 MyBatis-Plus 提供的BaseMapper接口即可获得全套单表 CRUD 方法。package com.example.demo.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.demo.entity.User; import org.apache.ibatis.annotations.Mapper; Mapper // 添加此注解Spring 会自动扫描并注册为 Bean。也可在主类加 MapperScan public interface UserMapper extends BaseMapperUser { // 无需编写任何方法BaseMapper 已提供 insert, deleteById, updateById, selectById, selectList 等。 // 复杂 SQL 可以在此处定义方法并在对应的 XML 文件中实现。 }第三步创建 Service 接口及其实现虽然可以直接使用 Mapper但按照分层架构我们通常会有 Service 层。MyBatis-Plus 提供了IService和ServiceImpl来进一步封装。创建 Service 接口UserService.java在com.example.demo.service包package com.example.demo.service; import com.baomidou.mybatisplus.extension.service.IService; import com.example.demo.entity.User; public interface UserService extends IServiceUser { // 可以在此定义业务相关的方法 User getByUsername(String username); }创建 Service 实现类UserServiceImpl.java在com.example.demo.service.impl包package com.example.demo.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.example.demo.entity.User; import com.example.demo.mapper.UserMapper; import com.example.demo.service.UserService; import org.springframework.stereotype.Service; Service public class UserServiceImpl extends ServiceImplUserMapper, User implements UserService { Override public User getByUsername(String username) { // 使用 Lambda 条件构造器避免硬编码字段名 LambdaQueryWrapperUser wrapper new LambdaQueryWrapper(); wrapper.eq(User::getUsername, username); return this.getOne(wrapper); } }第四步配置自动填充处理器实体类中createTime和updateTime字段配置了自动填充我们需要实现MetaObjectHandler接口来定义填充规则。创建MyMetaObjectHandler.java在com.example.demo.handler包或任意配置类package com.example.demo.handler; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; import java.time.LocalDateTime; Component public class MyMetaObjectHandler implements MetaObjectHandler { Override public void insertFill(MetaObject metaObject) { // 插入时为 createTime 和 updateTime 字段填充当前时间 this.strictInsertFill(metaObject, createTime, LocalDateTime.class, LocalDateTime.now()); this.strictInsertFill(metaObject, updateTime, LocalDateTime.class, LocalDateTime.now()); } Override public void updateFill(MetaObject metaObject) { // 更新时为 updateTime 字段填充当前时间 this.strictUpdateFill(metaObject, updateTime, LocalDateTime.class, LocalDateTime.now()); } }第五步创建数据库表在 MySQL 中执行以下 SQL 创建表CREATE TABLE t_user ( id bigint NOT NULL COMMENT 主键ID, username varchar(30) DEFAULT NULL COMMENT 姓名, age int DEFAULT NULL COMMENT 年龄, email varchar(50) DEFAULT NULL COMMENT 邮箱, create_time datetime DEFAULT NULL COMMENT 创建时间, update_time datetime DEFAULT NULL COMMENT 更新时间, deleted int DEFAULT 0 COMMENT 逻辑删除标记, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ci COMMENT用户表;7. 功能测试与效果验证现在基础框架已经搭建完成。我们通过编写一个简单的测试类或 Controller 来验证核心功能是否正常工作。创建测试 Controller在com.example.demo.controller包下创建UserController.javapackage com.example.demo.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.demo.entity.User; import com.example.demo.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; RestController RequestMapping(/user) public class UserController { Autowired private UserService userService; /** * 1. 插入数据 */ PostMapping(/save) public boolean saveUser(RequestBody User user) { // 调用 Service 的 save 方法会自动填充 createTime 和 updateTime return userService.save(user); } /** * 2. 根据ID查询 */ GetMapping(/{id}) public User getById(PathVariable Long id) { return userService.getById(id); } /** * 3. 条件查询查询年龄大于18岁的用户 */ GetMapping(/listByAge) public ListUser listByAge(RequestParam Integer age) { LambdaQueryWrapperUser wrapper new LambdaQueryWrapper(); wrapper.gt(User::getAge, age); // gt: greater than return userService.list(wrapper); } /** * 4. 分页查询 * 注意需要配置分页插件才能生效 */ GetMapping(/page) public IPageUser pageUsers(RequestParam(defaultValue 1) Long current, RequestParam(defaultValue 10) Long size) { PageUser page new Page(current, size); // 可以添加查询条件 // QueryWrapperUser wrapper new QueryWrapper(); // wrapper.like(username, 张); return userService.page(page); } /** * 5. 更新数据 */ PutMapping(/update) public boolean updateUser(RequestBody User user) { // updateById 只会更新非 null 的字段 return userService.updateById(user); } /** * 6. 逻辑删除 */ DeleteMapping(/{id}) public boolean deleteUser(PathVariable Long id) { // 调用 removeById 会触发逻辑删除将 deleted 字段更新为 1 return userService.removeById(id); } /** * 7. 自定义 Service 方法测试 */ GetMapping(/byUsername) public User getByUsername(RequestParam String username) { return userService.getByUsername(username); } }配置分页插件要使分页查询生效需要配置分页插件。创建一个配置类MybatisPlusConfig.javapackage com.example.demo.config; import com.baomidou.mybatisplus.annotation.DbType; 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 { Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); // 添加分页插件并指定数据库类型为 MYSQL interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 还可以添加其他插件如乐观锁插件 // interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); return interceptor; } }启动并测试启动 Spring Boot 应用运行DemoApplication主类。使用 Postman、curl 或浏览器访问以下接口进行测试插入用户POST http://localhost:8080/user/save{ username: 张三, age: 25, email: zhangsanexample.com }观察控制台会打印出执行的 INSERT SQL并且create_time和update_time被自动填充。分页查询GET http://localhost:8080/user/page?current1size5返回结果会包含分页信息当前页、每页大小、总记录数、总页数、数据列表。逻辑删除DELETE http://localhost:8080/user/1再次查询 ID 为 1 的用户会发现查询不到因为deleted1。查看数据库该条记录的deleted字段已变为 1。条件查询GET http://localhost:8080/user/listByAge?age18会查询出所有年龄大于 18 岁的用户。验证成功的关键点控制台能清晰打印出每条 SQL 语句及其参数。插入和更新操作能自动填充时间字段。删除操作是逻辑删除而非物理删除。分页查询返回的数据结构正确包含分页信息。自定义的 Service 方法能正确执行。8. 高级特性与性能考量8.1 条件构造器的灵活使用MyBatis-Plus 的QueryWrapper和LambdaQueryWrapper是构建动态查询条件的利器。LambdaQueryWrapper通过方法引用避免字段名硬编码更安全。// 复杂条件示例查询用户名包含“张”年龄在18到30之间邮箱不为空的用户按年龄倒序 LambdaQueryWrapperUser wrapper new LambdaQueryWrapper(); wrapper.like(User::getUsername, 张) .between(User::getAge, 18, 30) .isNotNull(User::getEmail) .orderByDesc(User::getAge); ListUser userList userService.list(wrapper);8.2 性能分析插件在开发环境可以启用性能分析插件输出每条 SQL 的执行时间帮助定位慢查询。// 在 MybatisPlusConfig 中添加性能分析插件仅开发环境使用 Bean Profile({dev, test}) // 指定环境 public PerformanceInterceptor performanceInterceptor() { PerformanceInterceptor performanceInterceptor new PerformanceInterceptor(); performanceInterceptor.setMaxTime(1000); // 设置 SQL 执行最大时间超过则抛出异常单位ms performanceInterceptor.setFormat(true); // 格式化 SQL 语句 return performanceInterceptor; }注意PerformanceInterceptor在较新版本中可能被标记为过时建议使用Profile控制其仅在测试环境生效。8.3 JDK 17 特性结合在实体类中可以考虑使用 JDK 14 引入的record类型作为简单的数据传输对象DTO但注意record默认是final且不可变作为持久化实体可能不太方便。更多是用于查询结果映射或 API 接口返回。// 例如一个用于统计的用户年龄分组 DTO public record UserAgeGroup(String ageRange, Long count) {}8.4 应对“单页500条限制”网络热词中提到了“接触mybatisplus单页500条限制”。这通常不是 MyBatis-Plus 的硬性限制而是出于性能考虑分页插件PaginationInnerInterceptor默认有一个maxLimit参数其默认值可能是-1无限制或一个较大的数取决于版本。如果你需要调整单页最大返回条数可以在配置分页插件时进行设置Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); PaginationInnerInterceptor paginationInnerInterceptor new PaginationInnerInterceptor(DbType.MYSQL); paginationInnerInterceptor.setMaxLimit(1000L); // 设置单页最大限制为1000条 interceptor.addInnerInterceptor(paginationInnerInterceptor); return interceptor; }重要提醒从数据库性能角度一次查询返回过多数据如数万条是极不推荐的应始终使用分页。这个设置只是为了应对某些特殊的导出或批处理场景。9. 常见问题与排查方法在整合使用过程中你可能会遇到以下典型问题问题现象可能原因排查方式解决方案启动报错java.lang.ClassNotFoundException: javax.xml.bind.JAXBExceptionJDK 版本过高9缺少 JAXB 模块。Spring Boot 3 一般已解决。检查错误堆栈。对于 Spring Boot 3 JDK 17通常无需处理。若出现可尝试添加依赖jakarta.xml.bind:jakarta.xml.bind-api。启动报错No qualifying bean of type ‘xxxMapper‘ availableMapper 接口未被 Spring 扫描到。检查是否在 Mapper 接口上添加了Mapper注解或在启动类上添加了MapperScan。确保Mapper注解存在或使用MapperScan(com.example.demo.mapper)扫描整个包。SQL 打印日志不显示mybatis-plus.configuration.log-impl配置错误或日志级别不对。检查application.yml配置并检查是否引入了其他日志框架冲突。确保配置为StdOutImpl并检查项目依赖中是否有slf4j和logback这是 Spring Boot 默认的日志框架。分页查询返回结果不正确如 total 为01. 未配置分页插件。2. 自定义 SQL 分页查询写法错误。1. 检查是否配置了MybatisPlusInterceptor并添加了PaginationInnerInterceptor。2. 检查 XML 中分页 SQL 是否正确。1. 确保分页插件配置正确。2. 自定义分页查询在 Mapper 方法中第一个参数必须是Page类型。逻辑删除不生效1. 实体类字段未加TableLogic。2. 全局配置logic-delete-field与实体字段名不一致。3. 使用的wrapper.eq()查询时未自动过滤已删除数据。1. 检查实体类字段和注解。2. 检查配置文件。3. 查看生成的 SQL。1. 确保注解和配置匹配。2. MyBatis-Plus 会自动在查询条件中追加AND deleted0。如果手动在 wrapper 中写了关于deleted的条件可能会覆盖。字段自动填充如时间不生效1. 实体类字段未加TableField(fill ...)。2. 未实现MetaObjectHandler或未将其注册为 Spring Bean。1. 检查实体类注解。2. 检查MyMetaObjectHandler类是否有Component注解。确保处理器被 Spring 管理且填充策略strictInsertFill/strictUpdateFill的字段类型与实体类字段类型完全一致。更新时字段被意外设置为null使用了updateById它默认会更新所有字段包括为 null 的字段。查看执行的 UPDATE SQL 语句。使用UpdateWrapper进行部分字段更新或者在实体类字段上使用TableField(strategy FieldStrategy.IGNORED)策略不推荐更推荐使用UpdateWrapper。升级到 Spring Boot 3 后报错提示javax包找不到MyBatis-Plus 版本过低未适配 Jakarta EE。检查pom.xml中 MyBatis-Plus 的版本和 starter。必须使用mybatis-plus-spring-boot3-starter3.5.0 及以上版本。10. 最佳实践与使用建议版本管理始终通过 Spring Boot 的spring-boot-dependencies来管理主版本对于 MyBatis-Plus 等第三方依赖明确指定一个与当前 Spring Boot 版本兼容的稳定版本。代码生成器对于大量标准表结构的 CRUD积极使用 MyBatis-Plus 的代码生成器AutoGenerator可以极大提升开发效率。编写一个生成器配置类一键生成 Entity、Mapper、Service、Controller。善用 Lambda 表达式在构造查询条件时优先使用LambdaQueryWrapper和LambdaUpdateWrapper利用方法引用User::getUsername这样在重构字段名时IDE 会提示错误避免运行时错误。区分开发与生产配置SQL 日志打印、性能分析插件等配置务必通过Profile(dev)或配置文件多环境application-dev.yml限定在开发环境生产环境一定要关闭。复杂 SQL 走 XML对于多表关联、复杂统计等 SQL不要强行使用条件构造器。老老实实在 XML 文件中编写清晰的 SQL这是 MyBatis 的核心优势。MyBatis-Plus 的 wrapper 适合单表动态条件。关注官方文档与社区MyBatis-Plus 更新活跃遇到问题首先查阅 官方文档 很多问题已有解决方案。Spring Boot 3 的更新也需关注其 发布说明 。性能监控在生产环境结合 Spring Boot Actuator、Micrometer 和 Prometheus 等工具对数据库连接池、慢 SQL 等进行监控。这套基于 JDK 17、Spring Boot 3 和 MyBatis-Plus 的技术栈为 Java 后端开发提供了高效、现代且稳健的基础。核心价值在于 MyBatis-Plus 极大简化了数据层开发而 JDK 17 和 Spring Boot 3 则确保了应用运行时的性能和长期可维护性。最先应该验证的就是自动 CRUD、条件构造器、分页和逻辑删除这几个核心功能它们能立即带来效率提升。最容易踩的坑通常是版本兼容性Jakarta 包和插件配置如分页。当你熟练使用后可以进一步探索其多数据源支持、动态表名、SQL 注入防护、以及与 Spring Cloud 微服务生态的深度集成。
返回列表