Spring Boot3.5与Mybatis-Plus整合开发实战指南
2026/7/22 7:32:57 网站建设 项目流程

1. 项目概述:为什么选择Spring Boot3.5与Mybatis-Plus组合?

在Java企业级应用开发领域,Spring Boot3.5和Mybatis-Plus的组合已经成为技术选型的热门选择。Spring Boot3.5作为Spring框架的最新稳定版本,带来了对Java17+的全面支持、GraalVM原生镜像编译能力以及更强大的性能优化。而Mybatis-Plus作为Mybatis的增强工具,在保留Mybatis所有特性的基础上,提供了自动CRUD、强大的条件构造器、分页插件等开箱即用的功能。

这个组合特别适合需要快速迭代的中大型项目。我最近在一个电商后台系统中采用这个技术栈,原本需要2周完成的用户模块CRUD接口,借助Mybatis-Plus的代码生成器和Spring Boot的自动配置,3天就完成了基础功能开发。更重要的是,这种组合不会牺牲灵活性——当遇到复杂SQL查询时,你仍然可以回归到原生Mybatis的XML映射方式。

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

2.1 基础环境配置

在开始整合前,需要确保开发环境满足以下要求:

  • JDK17或更高版本(Spring Boot3.x的最低要求)
  • Maven3.6+或Gradle7.x+
  • IDE推荐IntelliJ IDEA 2023.x
  • 数据库准备(MySQL8.x或PostgreSQL15.x)

注意:Spring Boot3.x不再支持JDK8,如果你必须使用JDK8,只能选择Spring Boot2.7.x版本。

2.2 创建Spring Boot项目

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

  • Spring Web(用于构建Web接口)
  • Lombok(简化实体类编写)
  • MySQL Driver(或其他数据库驱动)

对于Mybatis-Plus,我们需要手动添加依赖。在pom.xml中添加:

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

3. 核心整合步骤详解

3.1 数据源配置

在application.yml中配置数据源是第一步:

spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/your_db?useSSL=false&serverTimezone=UTC username: root password: yourpassword

Mybatis-Plus的配置项通常以mybatis-plus开头:

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 实体类与Mapper接口

使用Mybatis-Plus时,实体类需要添加注解:

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

Mapper接口只需要继承BaseMapper即可获得CRUD方法:

public interface UserMapper extends BaseMapper<User> { // 自定义方法 @Select("SELECT * FROM sys_user WHERE username = #{name}") User selectByName(@Param("name") String username); }

3.3 Service层实现

Mybatis-Plus提供了IService接口和ServiceImpl实现类:

public interface UserService extends IService<User> { // 自定义业务方法 User getUserWithRoles(Long id); } @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { @Override public User getUserWithRoles(Long id) { // 复杂业务逻辑实现 } }

4. 高级特性与实战技巧

4.1 条件构造器的灵活使用

Mybatis-Plus的QueryWrapper和LambdaQueryWrapper可以构建复杂查询:

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

4.2 分页插件配置与使用

首先需要配置分页插件:

@Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }

使用分页查询:

Page<User> page = new Page<>(1, 10); // 当前页,每页大小 LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(User::getStatus, 1); Page<User> result = userMapper.selectPage(page, wrapper);

4.3 自动填充功能实现

实现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()); } }

5. 常见问题与解决方案

5.1 类型处理器问题

当使用Java8的新时间API(LocalDateTime等)时,需要确保Mybatis-Plus的版本支持:

mybatis-plus: configuration: default-enum-type-handler: org.apache.ibatis.type.EnumOrdinalTypeHandler map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

5.2 多数据源配置

在需要连接多个数据库的场景下,可以使用dynamic-datasource-spring-boot-starter:

@Configuration @MapperScan(basePackages = "com.example.mapper") public class DataSourceConfig { @Bean @ConfigurationProperties("spring.datasource.master") public DataSource masterDataSource() { return DataSourceBuilder.create().build(); } @Bean @ConfigurationProperties("spring.datasource.slave") public DataSource slaveDataSource() { return DataSourceBuilder.create().build(); } @Bean public DataSource dynamicDataSource() { Map<Object, Object> dataSourceMap = new HashMap<>(); dataSourceMap.put("master", masterDataSource()); dataSourceMap.put("slave", slaveDataSource()); DynamicDataSource dynamicDataSource = new DynamicDataSource(); dynamicDataSource.setTargetDataSources(dataSourceMap); dynamicDataSource.setDefaultTargetDataSource(masterDataSource()); return dynamicDataSource; } }

5.3 性能优化建议

  1. 批量操作使用executeBatch:
List<User> userList = new ArrayList<>(); // 添加数据... userService.saveBatch(userList, 1000); // 每1000条提交一次
  1. 复杂查询使用原生SQL:
@Select("SELECT u.*, r.role_name FROM sys_user u LEFT JOIN sys_user_role ur ON u.id = ur.user_id " + "LEFT JOIN sys_role r ON ur.role_id = r.id WHERE u.id = #{userId}") User selectUserWithRole(@Param("userId") Long userId);
  1. 合理使用二级缓存:
mybatis-plus: configuration: cache-enabled: true

6. 最佳实践与架构建议

在实际项目中,我总结出以下几点经验:

  1. 分层清晰:Controller只处理HTTP请求和响应,业务逻辑放在Service层,复杂SQL放在Mapper层

  2. 使用DTO进行数据传输:避免直接暴露实体类给前端

  3. 统一异常处理:使用@ControllerAdvice处理Mybatis-Plus和业务异常

  4. 接口文档化:整合Swagger或Knife4j自动生成API文档

  5. 监控与性能分析:整合Prometheus和Grafana监控SQL性能

  6. 测试策略:

  • 单元测试:测试Service层方法
  • 集成测试:测试Controller接口
  • SQL测试:验证复杂SQL的正确性
@SpringBootTest public class UserServiceTest { @Autowired private UserService userService; @Test public void testGetUserWithRoles() { User user = userService.getUserWithRoles(1L); Assert.notNull(user, "用户查询失败"); Assert.notEmpty(user.getRoles(), "用户角色为空"); } }

在项目后期,随着业务复杂度的增加,可以考虑引入Mybatis-Plus的租户插件、数据权限插件等高级功能,但这些需要根据实际业务需求谨慎评估。

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

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

立即咨询