一、核心概念与优势

  1. 增强特性
    • 通用 CRUD 操作(BaseMapper
    • 条件构造器(QueryWrapper/LambdaQueryWrapper
    • 分页插件(PaginationInnerInterceptor
    • 代码生成器(AutoGenerator
    • 逻辑删除、乐观锁、自动填充等企业级功能。

二、详细集成步骤

1. 依赖配置

<dependencies>
    <!-- Spring Boot 3.x 兼容版本 -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
        <version>3.5.7</version>
        <!-- 排除冲突的 MyBatis 依赖 -->
        <exclusions>
            <exclusion>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis-spring</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <!-- 显式声明兼容的 MyBatis 版本 -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>3.0.3</version>
    </dependency>
    <!-- 数据库驱动(以 MySQL 为例) -->
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <scope>runtime</scope>
    </dependency>
</dependencies>

注意:Spring Boot 3.x 需排除默认 MyBatis 依赖并手动指定兼容版本,避免 ClassNotFoundException 或 API 不匹配。

2. 数据源与配置(application.yml

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis-plus:
  configuration:
    map-underscore-to-camel-case: true  # 开启驼峰映射
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  # 打印 SQL 日志
  global-config:
    db-config:
      id-type: auto  # 主键自增策略
      logic-delete-value: 1  # 逻辑删除值
      logic-not-delete-value: 0

关键配置说明: | 配置项 | 作用 | 默认值 | |-------------------------------|------------------------------------------|-------------------| | map-underscore-to-camel-case | 数据库下划线字段转 Java 驼峰属性 | false | | log-impl | 开发阶段输出 SQL 便于调试 | 无(需手动开启) | | id-type | 主键策略(AUTO/INPUT/ASSIGN_ID等) | ASSIGN_ID |

3. 实体类与 Mapper

// 实体类
@Data
@TableName("user")  // 指定表名
public class User {
    @TableId(type = IdType.AUTO)  // 主键自增
    private Long id;
    private String name;
    @TableField(fill = FieldFill.INSERT)  // 插入时自动填充
    private LocalDateTime createTime;
}

// Mapper 接口
@Mapper
public interface UserMapper extends BaseMapper<User> {}  // 继承通用 CRUD 接口

4. 代码生成器(快速生成 Entity/Mapper/Service)

FastAutoGenerator.create("jdbc:mysql://localhost:3306/test", "root", "123456")
    .globalConfig(builder -> builder
        .author("YourName")
        .outputDir(System.getProperty("user.dir") + "/src/main/java")
    )
    .packageConfig(builder -> builder
        .parent("com.example")
        .entity("entity")
        .mapper("mapper")
    )
    .strategyConfig(builder -> builder
        .addInclude("user", "order")  // 指定生成表
        .entityBuilder()
        .enableLombok()  // 启用 Lombok
    )
    .execute();

依赖:需添加 mybatis-plus-generator + 模板引擎(如 velocity-engine-core)。


三、高级特性与使用技巧

  1. 条件构造器

    // Lambda 表达式避免硬编码字段名
    LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
    wrapper.eq(User::getName, "John")
           .between(User::getAge, 20, 30)
           .orderByDesc(User::getCreateTime);
    List<User> users = userMapper.selectList(wrapper);
    
  2. 分页插件

    @Configuration
    public class MyBatisConfig {
        @Bean
        public MybatisPlusInterceptor mybatisPlusInterceptor() {
            MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
            interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); // 添加分页插件
            return interceptor;
        }
    }
    
    // 使用分页
    Page<User> page = new Page<>(1, 10);  // 第1页,每页10条
    Page<User> result = userMapper.selectPage(page, null);
    
  3. 自动填充与乐观锁

    // 自动填充处理器
    @Component
    public class MetaHandler implements MetaObjectHandler {
        @Override
        public void insertFill(MetaObject metaObject) {
            this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
        }
    }
    
    // 乐观锁字段(@Version)
    public class Product {
        @Version
        private Integer version;
    }
    

四、常见错误与解决方案

错误现象 原因 解决方案
No qualifying bean of type 'xxxMapper' 未扫描到 Mapper 启动类加 @MapperScan("com.xxx.mapper") 或 Mapper 接口加 @Mapper
Failed to determine a suitable driver class 多数据源冲突 启动类排除自动配置:@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
Method getLanguageDriver not found in MybatisConfiguration MyBatis 与 MP 版本冲突 显式声明兼容的 MyBatis 版本(如 3.5.16)
动态数据源下 MyBatis-Plus 配置失效 自定义 SqlSessionFactory 未注入配置 手动绑定 GlobalConfigMybatisConfiguration

五、最佳实践与性能优化

  1. 依赖管理

    • 使用 dependencyManagement 统一管理 MyBatis 与 MP 版本,避免传递依赖冲突。
    • 示例
      <dependencyManagement>
          <dependencies>
              <dependency>
                  <groupId>com.baomidou</groupId>
                  <artifactId>mybatis-plus-boot-starter</artifactId>
                  <version>3.5.7</version>
              </dependency>
              <dependency>
                  <groupId>org.mybatis</groupId>
                  <artifactId>mybatis</artifactId>
                  <version>3.5.16</version>
              </dependency>
          </dependencies>
      </dependencyManagement>
      
  2. 多数据源配置

    • 使用 @DS("slave") 注解切换数据源,需集成 dynamic-datasource-spring-boot-starter
    • 关键配置
      spring:
        datasource:
          dynamic:
            primary: master
            datasources:
              master: # 主库配置
              slave:  # 从库配置
      
  3. SQL 性能优化

    • 关闭 MyBatis 一级缓存:mybatis-plus.configuration.local-cache-scope=statement
    • 分页插件参数调优:PaginationInnerInterceptor.setMaxLimit(500L) 避免全表大分页。
  4. 安全防护

    • 启用防止全表更新插件:BlockAttackInnerInterceptor,避免误操作执行 UPDATEDELETEWHERE 条件的语句。

总结:MyBatis-Plus 的核心价值在于简化 CRUD 并增强 MyBatis 功能。重点注意:

  • 版本兼容性(Spring Boot 3.x 需 MP ≥3.5.5 + MyBatis ≥3.5.16);
  • 代码生成器快速搭建基础结构;
  • 条件构造器代替手写 SQL 提升可维护性;
  • 多数据源动态配置需手动注入组件。
    按此指南操作可规避 90% 的集成问题,高效实现企业级数据库操作。