
在后端开发领域,数据访问层是核心模块之一,而 Spring Boot 与 Mybatis-Plus 的组合已成为主流技术选型。随着 Spring Boot3.5 的正式发布,其在原生镜像支持、性能优化、依赖管理等方面的升级,与 Mybatis-Plus 的高效 CRUD、条件构造器、分页插件等增强特性形成强互补,具体优势体目前三点:
开发效率倍增:Mybatis-Plus 封装了 Mybatis 原生操作,减少 80% 重复 SQL 编写,配合 Spring Boot3.5 的自动配置机制,无需繁琐 XML 配置即可快速搭建数据访问层;
性能优化升级:Spring Boot3.5 基于 Spring Framework6.1,在 Bean 初始化、资源加载等方面性能提升 15%-20%,与 Mybatis-Plus 的 SQL 优化器、缓存机制结合,进一步降低数据库访问延迟;
生态兼容完善:两者均保持对主流技术栈的兼容(如 MySQL8.0、PostgreSQL15、Redis 缓存等),同时支持 Spring Boot3.5 新增的 GraalVM 原生镜像构建,适配云原生部署场景。
对于后端开发者而言,该组合不仅能解决传统 Mybatis 配置繁琐、SQL 冗余的痛点,还能适配 Spring Boot3.5 的新特性,为中大型项目提供稳定、高效的数据访问解决方案。
要实现 Spring Boot3.5 与 Mybatis-Plus 的无缝整合,需先理解两者的核心交互原理,关键在于 “自动配置 + 增强扩展” 的双重机制:
Spring Boot 的核心是 “约定优于配置”,其自动配置机制通过 @EnableAutoConfiguration 注解触发,扫描 classpath 下的
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件,加载 Mybatis-Plus 对应的自动配置类
MybatisPlusAutoConfiguration。
Spring Boot3.5 相较于旧版本,在自动配置上的优化点:
Mybatis-Plus 作为 Mybatis 的增强工具,其核心是通过 SqlSessionFactory 扩展,在 Mybatis 原生流程中插入增强逻辑(如 SQL 自动生成、分页拦截、乐观锁实现等),整合时的关键原理:
两者整合的本质是依赖传递与配置联动,核心依赖树如下:
spring-boot-starter-web (Spring Boot3.5核心依赖)
└── spring-boot-starter-jdbc (数据源自动配置)
└── mybatis-plus-boot-starter (Mybatis-Plus自动配置依赖)
├── mybatis-plus-core (核心增强逻辑)
├── mybatis-plus-extension (分页、条件构造等扩展)
└── mybatis-spring-boot-autoconfigure (Mybatis与Spring Boot适配)当引入 mybatis-plus-boot-starter 后,Spring Boot3.5 会自动识别数据源配置,Mybatis-Plus 则基于该数据源初始化 SqlSessionFactory 和 MapperScannerConfigurer,完成整合的核心链路。
以下基于 Spring Boot3.5.3(最新稳定版)和 Mybatis-Plus3.5.4.1(兼容 Spring Boot3.x 版本),提供完整的整合步骤,包含核心配置、代码实现、测试验证:
在 pom.xml 中引入以下依赖,无需额外引入 Mybatis 原生依赖(Mybatis-Plus 已包含):
<!-- Spring Boot3.5 核心依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.3</version>
<relativePath/>
</parent>
<dependencies>
<!-- Web依赖(用于接口测试) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Mybatis-Plus 自动配置依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.4.1</version>
</dependency>
<!-- MySQL驱动(Spring Boot3.5 适配8.0+版本) -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<!-- lombok(简化实体类编写) -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- 测试依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>在 src/main/resources 下创建 application.yml,配置数据源、Mybatis-Plus 核心参数,无需配置 mybatis-config.xml:
spring:
# 数据源配置
datasource:
url: jdbc:mysql://localhost:3306/test_db?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
# Mapper接口扫描路径(需修改为你的包路径)
mapper-locations: classpath:mapper/*.xml
# 实体类扫描路径(用于别名配置)
type-aliases-package: com.example.demo.entity
# 全局配置
global-config:
db-config:
# 主键生成策略(自增主键用 AUTO,雪花算法用 ASSIGN_ID)
id-type: AUTO
# 逻辑删除字段配置(可选,用于软删除)
logic-delete-field: isDeleted
logic-delete-value: 1
logic-not-delete-value: 0
# 配置打印SQL(开发环境用,生产环境关闭)
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 驼峰命名自动转换(数据库字段下划线转实体类驼峰)
map-underscore-to-camel-case: true(1)实体类(Entity)
使用 Lombok 简化 getter/setter,通过 Mybatis-Plus 注解映射数据库表:
package com.example.demo.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.time.LocalDateTime;
@Data // Lombok注解,生成getter/setter/toString等方法
@TableName("sys_user") // 映射数据库表名
public class SysUser {
@TableId(type = IdType.AUTO) // 主键自增
private Long id;
private String username; // 用户名(数据库字段:username)
private String password; // 密码(实际项目需加密存储)
private String email; // 邮箱(数据库字段:email)
private Integer status; // 状态(0-禁用,1-正常)
private LocalDateTime createTime; // 创建时间(数据库字段:create_time,驼峰自动转换)
private LocalDateTime updateTime; // 更新时间
private Integer isDeleted; // 逻辑删除字段(对应配置文件中的logic-delete-field)
}(2)Mapper 接口
继承 Mybatis-Plus 的 BaseMapper,无需编写 XML 即可实现基础 CRUD:
package com.example.demo.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.SysUser;
import org.springframework.stereotype.Repository;
// 无需添加@Mapper注解,Spring Boot会自动扫描(需确保包路径在mapper-locations配置中)
@Repository
public interface SysUserMapper extends BaseMapper<SysUser> {
// 基础CRUD(增删改查)已通过BaseMapper实现,无需额外编写方法
// 如需自定义SQL,可在此处添加方法,然后在Mapper XML中编写SQL
}(3)Service 层(可选,封装业务逻辑)
继承 Mybatis-Plus 的 IService 和 ServiceImpl,获得更强劲的业务层支持:
// Service接口
package com.example.demo.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.entity.SysUser;
public interface SysUserService extends IService<SysUser> {
}
// Service实现类
package com.example.demo.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.SysUser;
import com.example.demo.mapper.SysUserMapper;
import com.example.demo.service.SysUserService;
import org.springframework.stereotype.Service;
@Service
public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements SysUserService {
// 继承ServiceImpl后,自动获得批量操作、条件查询等增强方法
}(4)Controller 层(接口测试)
编写接口测试整合效果,使用 Service 层或 Mapper 层进行数据操作:
package com.example.demo.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.example.demo.entity.SysUser;
import com.example.demo.service.SysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.util.List;
@RestController
@RequestMapping("/user")
public class SysUserController {
@Autowired
private SysUserService sysUserService;
// 新增用户
@PostMapping("/add")
public boolean addUser(@RequestBody SysUser user) {
user.setCreateTime(LocalDateTime.now());
user.setUpdateTime(LocalDateTime.now());
user.setIsDeleted(0);
return sysUserService.save(user);
}
// 根据用户名查询用户
@GetMapping("/getByUsername")
public List<SysUser> getByUsername(@RequestParam String username) {
// 使用Mybatis-Plus的Lambda条件构造器,避免硬编码字段名
LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<SysUser>()
.eq(SysUser::getUsername, username)
.eq(SysUser::getIsDeleted, 0);
return sysUserService.list(queryWrapper);
}
// 分页查询用户(需配置分页插件)
@GetMapping("/page")
public com.baomidou.mybatisplus.core.metadata.IPage<SysUser> page(@RequestParam Integer pageNum, @RequestParam Integer pageSize) {
// 创建分页对象
com.baomidou.mybatisplus.extension.plugins.pagination.Page<SysUser> page = new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(pageNum, pageSize);
// 分页查询(条件构造器可根据需求添加)
return sysUserService.page(page, new LambdaQueryWrapper<SysUser>().eq(SysUser::getIsDeleted, 0));
}
}5. 分页插件配置(关键)
Mybatis-Plus 的分页功能需手动配置插件,创建配置类:
package 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));
return interceptor;
}
}6. 测试验证
启动 Spring Boot 应用,确保无报错;
使用 Postman 或浏览器调用接口测试:
查看控制台输出的 SQL 日志,确认 SQL 自动生成正确,分页参数生效。
坑点描述 | 缘由分析 | 解决方案 |
启动报错 “找不到 Mapper 接口” | Mapper 接口路径未被扫描,或未添加 @Repository 注解 | 1. 确保 |
分页查询返回总条数为 0,数据正常 | 未配置分页插件,或分页插件版本与 Mybatis-Plus 不兼容 | 1. 按步骤配置 MybatisPlusConfig 类;2. 确保 mybatis-plus-boot-starter 版本与分页插件版本一致(推荐 3.5.4.1) |
数据库字段下划线转驼峰失效 | 未开启 | 在 application.yml 中添加 |
逻辑删除未生效 | 实体类未添加 @TableLogic 注解,或配置文件字段名错误 | 1. 实体类逻辑删除字段添加 @TableLogic 注解;2. 确保 |
SQL 日志关闭:生产环境需关闭
mybatis-plus.configuration.log-impl 配置,避免日志泄露敏感信息;
数据源优化:整合 Druid 或 HikariCP 连接池,提升数据库连接性能,配置示例:
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
initial-size: 5
max-active: 20
min-idle: 5
max-wait: 60000代码生成器使用:对于大型项目,可使用 Mybatis-Plus 的代码生成器(AutoGenerator)自动生成 Entity、Mapper、Service、Controller 代码,减少重复工作;
缓存优化:结合 Redis 缓存常用查询结果,减少数据库访问压力,可使用 Mybatis-Plus 的 @CacheNamespace 注解或 Spring Cache 整合;
版本兼容:升级 Spring Boot 或 Mybatis-Plus 时,需注意版本兼容性(Spring Boot3.x 需搭配 Mybatis-Plus3.5.3+ 版本),避免因版本冲突导致的问题。
多数据源整合:如需操作多个数据库,可使用 Mybatis-Plus 的
dynamic-datasource-spring-boot-starter 依赖,实现动态数据源切换;
代码生成器集成:结合 Mybatis-Plus Generator 3.5.4.1,通过配置生成模板,快速生成全套代码;
读写分离:配合 Sharding-JDBC,实现数据库读写分离,提升系统吞吐量。