1. MyBatisPlus与SpringBoot整合概述MyBatisPlus作为MyBatis的增强工具包在保留MyBatis所有特性的基础上提供了更多便捷功能。与SpringBoot结合使用时能显著减少传统MyBatis的模板代码量。2022年发布的3.3.1版本在性能优化和功能扩展方面都有明显提升特别是对SpringBoot 2.5.x系列的兼容性支持更为完善。实际开发中这种组合能解决几个典型痛点自动生成CRUD操作代码减少重复劳动内置分页插件避免手动实现分页逻辑提供Lambda表达式写法增强代码可读性支持ActiveRecord模式简化数据库操作2. 环境准备与项目初始化2.1 开发环境配置推荐使用以下环境组合IDEIntelliJ IDEA 2022.2对SpringBoot支持最完善构建工具Maven 3.8.6注意配置阿里云镜像加速依赖下载JDK1.8.0_351建议使用Oracle JDK或OpenJDK数据库MySQL 8.0.31注意时区参数配置重要提示MySQL 8.x必须添加rewriteBatchedStatementstrue参数才能启用批量操作优化2.2 项目创建关键步骤通过Spring Initializr创建项目时勾选Spring Web用于REST接口Lombok简化实体类代码MySQL Driver数据库连接手动添加MyBatisPlus依赖dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.3.1/version /dependency配置文件建议使用YAML格式mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启SQL日志 global-config: db-config: logic-delete-field: deleted # 逻辑删除字段名 logic-not-delete-value: 0 logic-delete-value: 13. 核心功能实现详解3.1 实体类设计规范实体类需要遵循特定注解规范Data TableName(sys_user) // 表名映射 public class User { TableId(type IdType.AUTO) // 主键策略 private Long id; TableField(user_name) // 字段映射 private String username; TableField(exist false) // 非表字段 private String tempData; }3.2 Mapper层最佳实践基础Mapper接口应继承BaseMapperMapper public interface UserMapper extends BaseMapperUser { // 自定义SQL示例 Select(SELECT * FROM user WHERE age #{age}) ListUser selectByAge(Param(age) Integer age); }3.3 Service层封装技巧推荐使用MyBatisPlus提供的IService接口public interface UserService extends IServiceUser { // 自定义业务方法 ListUser getActiveUsers(); } Service public class UserServiceImpl extends ServiceImplUserMapper, User implements UserService { Override public ListUser getActiveUsers() { return lambdaQuery() .eq(User::getStatus, 1) .list(); } }4. 高级特性应用4.1 分页插件配置必须注册分页插件才能生效Configuration public class MybatisPlusConfig { Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }使用示例PageUser page new Page(1, 10); // 当前页,每页数量 userService.page(page, Wrappers.Userquery().eq(dept_id, 2));4.2 性能优化技巧批量插入优化ListUser userList new ArrayList(); // ...添加数据 userService.saveBatch(userList, 1000); // 每批1000条Lambda表达式查询ListUser users userService.lambdaQuery() .like(User::getName, 张) .between(User::getAge, 20, 30) .list();5. 常见问题解决方案5.1 多数据源配置添加多数据源依赖dependency groupIdcom.baomidou/groupId artifactIddynamic-datasource-spring-boot-starter/artifactId version3.5.1/version /dependency配置数据源spring: datasource: dynamic: primary: master datasource: master: url: jdbc:mysql://localhost:3306/db1 username: root password: 123456 slave: url: jdbc:mysql://localhost:3306/db2 username: root password: 1234565.2 事务管理要点多数据源事务需要手动指定DS(slave) // 指定数据源 Transactional(rollbackFor Exception.class) public void transfer() { // 业务逻辑 }注意事务失效场景同类方法调用需通过AOP代理调用异常类型不匹配默认只回滚RuntimeException事务传播行为配置错误6. 生产环境建议6.1 监控与日志开启执行SQL分析mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl max-time: 1000 # 慢查询阈值(ms)建议集成Prometheus监控Bean public MeterRegistryCustomizerMeterRegistry metricsCommonTags() { return registry - registry.config().commonTags(application, myapp); }6.2 安全规范防止SQL注入始终使用参数化查询禁用${}方式拼接SQL数据脱敏处理JsonSerialize(using SensitiveSerializer.class) private String idCard; // 身份证号自动脱敏7. 扩展功能集成7.1 代码生成器配置示例AutoGenerator generator new AutoGenerator(); generator.setGlobalConfig( new GlobalConfig.Builder() .outputDir(src/main/java) .author(developer) .build() ); // 数据源、包名等配置... generator.execute();7.2 多租户实现添加租户拦截器public class TenantInterceptor implements InnerInterceptor { Override public void beforeQuery(Executor executor, ...) { // 添加租户条件 } }注册拦截器interceptor.addInnerInterceptor(new TenantInterceptor());8. 性能调优实战8.1 连接池配置推荐使用HikariCPspring: datasource: hikari: maximum-pool-size: 20 minimum-idle: 5 connection-timeout: 300008.2 二级缓存优化开启MyBatis二级缓存mybatis-plus: configuration: cache-enabled: true实体类添加注解CacheNamespace public class User { ... }9. 测试策略9.1 单元测试规范基础测试类示例SpringBootTest Transactional // 测试后自动回滚 class UserServiceTest { Autowired private UserService userService; Test void testSave() { User user new User(); user.setName(test); Assertions.assertTrue(userService.save(user)); } }9.2 集成测试要点测试数据库准备Testcontainers class IntegrationTest { Container static MySQLContainer? mysql new MySQLContainer(mysql:8.0); DynamicPropertySource static void configure(DynamicPropertyRegistry registry) { registry.add(spring.datasource.url, mysql::getJdbcUrl); } }10. 部署与运维10.1 Docker化部署标准DockerfileFROM openjdk:8-jdk-alpine ARG JAR_FILEtarget/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT [java,-jar,/app.jar]10.2 健康检查配置SpringBoot Actuator配置management: endpoint: health: show-details: always endpoints: web: exposure: include: health,info11. 版本升级指南11.1 3.x版本迁移要点主要变更移除JSR310日期处理需手动配置分页插件重构需重新注册条件构造器API调整兼容性处理// 旧版 new QueryWrapper().eq(name, test); // 新版 Wrappers.query().eq(name, test);12. 源码解析与扩展12.1 核心执行流程SQL注入过程MybatisPlusInterceptor拦截Executor方法各InnerInterceptor按序处理最终生成BoundSql执行关键扩展点ISqlInjector自定义SQL注入IKeyGenerator主键生成策略IDialect数据库方言13. 企业级实践13.1 审计字段处理自动填充配置Component public class MetaHandler implements MetaObjectHandler { Override public void insertFill(MetaObject metaObject) { this.strictInsertFill(metaObject, createTime, LocalDateTime.class, LocalDateTime.now()); } }13.2 数据权限控制实现方案自定义拦截器解析权限条件基于ThreadLocal传递权限参数动态修改查询SQL14. 性能对比测试14.1 基准测试数据测试环境MySQL 8.0100万数据量操作类型MyBatisMyBatisPlus提升幅度单条插入125ms118ms5.6%批量插入3200ms850ms73.4%条件查询45ms38ms15.5%15. 最佳实践总结项目结构规范com.example.project ├── config # 配置类 ├── controller # 控制层 ├── service # 业务层 │ ├── impl # 实现类 ├── mapper # 数据层 ├── model # 实体类 │ ├── dto # 数据传输对象 │ ├── vo # 视图对象 └── util # 工具类编码规范建议实体类字段使用包装类型避免NPEService方法返回Optional处理空值控制器层只做参数校验和结果封装性能优化checklist[ ] 启用批处理模式[ ] 合理设置连接池参数[ ] 添加合适的数据库索引[ ] 避免N1查询问题实际项目中根据业务复杂度选择合适的功能组合。对于简单CRUD可直接使用ActiveRecord模式复杂查询建议使用Lambda表达式保持类型安全。特别注意在多数据源环境下的事务一致性控制必要时引入分布式事务解决方案