Spring Boot 3.5与MyBatis-Plus整合开发实战指南
2026/7/21 21:35:15 网站建设 项目流程

1. 为什么选择Spring Boot 3.5与MyBatis-Plus组合

在Java企业级应用开发领域,Spring Boot 3.5和MyBatis-Plus的组合已经成为许多开发团队的首选技术栈。Spring Boot 3.5作为Spring框架的最新稳定版本,带来了对Java 17+的全面支持、GraalVM原生镜像编译能力的显著提升,以及更完善的响应式编程模型。而MyBatis-Plus作为MyBatis的增强工具,在保留MyBatis灵活性的同时,通过内置通用Mapper、分页插件、代码生成器等实用功能,大幅减少了样板代码的编写。

这个组合特别适合需要快速开发但又不想牺牲灵活性的项目。Spring Boot 3.5提供了自动配置、依赖管理等便利,而MyBatis-Plus则填补了传统MyBatis在CRUD操作上的重复劳动问题。两者结合,既能享受Spring生态的丰富功能,又能保持对SQL的精细控制能力。

2. 环境准备与项目初始化

2.1 创建Spring Boot 3.5项目

首先确保你的开发环境满足以下要求:

  • JDK 17或更高版本
  • Maven 3.6+或Gradle 7.x
  • IDE(IntelliJ IDEA或Eclipse)

使用Spring Initializr创建项目时,选择以下依赖:

  • Spring Web
  • Lombok(可选但推荐)
  • MySQL Driver(或其他数据库驱动)

对于Maven项目,pom.xml中需要添加Spring Boot 3.5的父POM:

<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.5.0</version> </parent>

2.2 添加MyBatis-Plus依赖

在pom.xml中添加MyBatis-Plus的starter依赖:

<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3.1</version> </dependency>

注意版本兼容性:MyBatis-Plus 3.5.x版本专为Spring Boot 3.x优化,不建议在Spring Boot 2.x项目中使用。

3. 核心配置详解

3.1 数据源配置

在application.yml中配置数据源和MyBatis-Plus基本设置:

spring: datasource: url: jdbc:mysql://localhost:3306/your_db?useSSL=false&serverTimezone=UTC username: root password: yourpassword driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启SQL日志 global-config: db-config: id-type: auto # 主键策略 logic-delete-field: deleted # 逻辑删除字段名 logic-delete-value: 1 # 逻辑已删除值 logic-not-delete-value: 0 # 逻辑未删除值

3.2 MyBatis-Plus配置类

创建一个配置类来定制MyBatis-Plus行为:

@Configuration @MapperScan("com.yourpackage.mapper") public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 添加分页插件 interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 添加乐观锁插件 interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); return interceptor; } }

4. 实体与Mapper开发

4.1 实体类定义

使用Lombok简化实体类代码:

@Data @TableName("user") // 指定表名 public class User { @TableId(type = IdType.AUTO) // 主键自增 private Long id; private String username; private Integer age; @TableField(fill = FieldFill.INSERT) // 自动填充 private LocalDateTime createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; @TableLogic // 逻辑删除标记 private Integer deleted; }

4.2 Mapper接口

继承BaseMapper获得CRUD方法:

public interface UserMapper extends BaseMapper<User> { // 自定义方法 @Select("SELECT * FROM user WHERE age > #{age}") List<User> selectUsersOlderThan(@Param("age") Integer age); }

MyBatis-Plus的强大之处在于,即使不编写任何XML文件,UserMapper已经具备了基本的CRUD操作能力。通过继承BaseMapper,你自动获得了以下方法:

  • insert: 插入一条记录
  • deleteById: 根据主键删除
  • updateById: 根据主键更新
  • selectById: 根据主键查询
  • selectList: 查询所有记录
  • 以及更多...

5. 服务层与控制器实现

5.1 服务层实现

@Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { public Page<User> getUsersByPage(int pageNum, int pageSize) { Page<User> page = new Page<>(pageNum, pageSize); return baseMapper.selectPage(page, null); } @Transactional public boolean updateUserAge(Long id, Integer newAge) { User user = getById(id); if (user == null) { return false; } user.setAge(newAge); return updateById(user); } }

5.2 控制器示例

@RestController @RequestMapping("/users") public class UserController { @Autowired private UserService userService; @GetMapping("/{id}") public Result<User> getUser(@PathVariable Long id) { User user = userService.getById(id); return Result.success(user); } @GetMapping("/page") public Result<Page<User>> getUsersByPage( @RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "10") int pageSize) { return Result.success(userService.getUsersByPage(pageNum, pageSize)); } }

6. 高级特性与实战技巧

6.1 条件构造器使用

MyBatis-Plus的Wrapper提供了强大的查询条件构造能力:

// 查询年龄大于18且用户名包含"admin"的用户 LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); wrapper.gt(User::getAge, 18) .like(User::getUsername, "admin") .orderByDesc(User::getCreateTime); List<User> users = userMapper.selectList(wrapper);

6.2 自动填充功能实现

实现MetaObjectHandler接口来处理自动填充字段:

@Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); } @Override public void updateFill(MetaObject metaObject) { this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); } }

6.3 多数据源配置

对于需要连接多个数据库的场景:

@Configuration @MapperScan(basePackages = "com.yourpackage.mapper.db1", sqlSessionTemplateRef = "db1SqlSessionTemplate") public class Db1DataSourceConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource.db1") public DataSource db1DataSource() { return DataSourceBuilder.create().build(); } @Bean public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception { MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean(); factoryBean.setDataSource(dataSource); return factoryBean.getObject(); } @Bean public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } }

7. 常见问题与解决方案

7.1 分页插件不生效

可能原因及解决方案:

  1. 未在配置类中添加分页插件 - 确保已按照3.2节配置
  2. 分页参数传递不正确 - 前端需正确传递current和size参数
  3. 使用了自定义SQL但未保持参数一致 - 自定义SQL方法参数需包含Page对象

7.2 逻辑删除失效

检查要点:

  1. 实体类字段是否添加@TableLogic注解
  2. 全局配置中的逻辑删除字段名是否与实体类一致
  3. 数据库表是否有对应的逻辑删除字段

7.3 性能优化建议

  1. 批量操作:使用saveBatch、updateBatchById等方法替代循环单条操作
  2. 延迟加载:对于关联查询,考虑使用@TableField(exist = false)和单独查询
  3. SQL监控:启用mybatis-plus.configuration.log-impl查看执行SQL

8. 项目实战中的经验分享

在实际项目中使用Spring Boot 3.5整合MyBatis-Plus时,有几个关键点值得特别注意:

  1. 枚举处理:MyBatis-Plus对枚举类型的处理非常友好。可以通过实现IEnum接口或使用@EnumValue注解来优雅地处理数据库中的枚举值:
public enum GenderEnum implements IEnum<Integer> { MALE(1, "男"), FEMALE(2, "女"); @EnumValue private final int code; private final String desc; // 构造方法、getter等 }
  1. 多租户实现:对于SaaS应用,可以利用MyBatis-Plus的多租户插件轻松实现数据隔离:
public class TenantInterceptor implements InnerInterceptor { @Override public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) { // 添加租户条件 } }
  1. 动态表名:对于分表场景,可以实现动态表名处理器:
public class DynamicTableNameParser implements TableNameHandler { @Override public String dynamicTableName(String sql, String tableName) { // 根据业务逻辑返回实际表名 return getActualTableName(tableName); } }
  1. SQL注入器:对于需要扩展通用方法的场景,可以自定义SQL注入器:
public class MySqlInjector extends DefaultSqlInjector { @Override public List<AbstractMethod> getMethodList(Class<?> mapperClass) { List<AbstractMethod> methodList = super.getMethodList(mapperClass); methodList.add(new InsertBatchSomeColumn()); // 添加批量插入方法 return methodList; } }
  1. 与Spring Boot 3.5新特性结合:利用Spring Boot 3.5的GraalVM原生镜像支持,可以显著提升应用启动速度。在整合MyBatis-Plus时,需要特别注意反射配置:
# 在resources/META-INF/native-image下添加reflect-config.json [ { "name": "com.yourpackage.entity.User", "allDeclaredFields": true, "allDeclaredMethods": true } ]

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询