一、核心概念

  1. MyBatis-Plus定位
    MyBatis的增强工具,提供通用Mapper、分页插件、代码生成器等,简化CRUD操作。
  2. Spring Cloud整合价值
    在微服务中简化数据层开发,支持多数据源、分布式事务(如Seata),提升开发效率。

二、详细操作步骤

1. 添加依赖

<!-- 根pom声明版本 -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.2</version>
        </dependency>
    </dependencies>
</dependencyManagement>

<!-- 业务模块引入 -->
<dependencies>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.17</version>
    </dependency>
</dependencies>

注:需移除原生MyBatis依赖避免冲突。

2. 配置数据源与MyBatis-Plus

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

mybatis-plus:
  mapper-locations: classpath*:mapper/**/*Mapper.xml  # XML映射文件路径
  type-aliases-package: com.example.**.domain          # 实体类包扫描
  configuration:
    map-underscore-to-camel-case: true               # 自动驼峰转换
  global-config:
    db-config:
      id-type: ASSIGN_ID                             # 雪花算法ID
      logic-delete-value: 1                          # 逻辑删除标记
      logic-not-delete-value: 0

多数据源配置时需禁用自动装配:

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) 

3. 配置类与插件

@Configuration
@EnableTransactionManagement
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 分页
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());       // 乐观锁
        interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());            // 防全表更新
        return interceptor;
    }
}

需在spring.factories注册配置类。

4. 实体类与Mapper

@Data
@TableName("sys_user")  // 指定表名
public class User {
    @TableId(type = IdType.ASSIGN_ID)
    private Long id;
    private String name;
    @TableLogic  // 逻辑删除字段
    private Integer isDeleted;
}

public interface UserMapper extends BaseMapper<User> { 
    // 继承基础CRUD方法
}

5. Service层封装

public interface UserService extends IService<User> {}

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> 
    implements UserService {}

6. 分布式事务集成(Seata)

# 配置Seata
seata:
  tx-service-group: my_tx_group
  service:
    vgroup-mapping:
      my_tx_group: default
@GlobalTransactional  // 在Service方法上添加注解
public void crossServiceTransfer() { ... }

需创建undo_log表存储回滚日志。


三、常见错误与解决方案

问题现象 原因与解决
启动报错DataSource冲突 排除自动配置:@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
分页插件失效 检查配置类是否注入PaginationInnerInterceptor,并确保spring.factories注册
逻辑删除不生效 确认全局配置logic-delete-value与实体类@TableLogic值匹配
ID生成策略冲突 实体类@TableIdtype需与全局id-type一致(如ASSIGN_ID

四、注意事项

  1. 多模块依赖管理
    父pom声明依赖版本,子模块按需引入(避免版本冲突)。
  2. XML映射文件位置
    mapper-locations路径需与实际位置一致,支持classpath*:多模块扫描。
  3. 实体注解规范
    表名@TableName、主键@TableId、逻辑删除@TableLogic缺一不可。

五、使用技巧

  1. 代码生成器
    使用MyBatis-Plus Generator自动生成Entity/Mapper/Service代码。
  2. Lambda表达式
    避免硬编码字段名:
    userService.lambdaQuery()
         .eq(User::getName, "Alice")
         .list();
    
  3. 多数据源动态切换
    结合@DS("slave")注解实现读写分离。

六、最佳实践与性能优化

  1. 批量操作
    List<User> userList = new ArrayList<>();
    saveBatch(userList, 1000);  // 分批次插入,每批1000条
    
    性能对比:批量插入比单条循环快10倍以上
  2. 索引与查询优化
    • 对高频查询字段(如create_time)添加索引
    • 避免SELECT *,改用明确字段列表。
  3. 二级缓存策略
    读多写少场景启用缓存:
    mybatis-plus:
      configuration:
        cache-enabled: true
    
  4. 监控与日志
    开启SQL日志审计:
    configuration:
      log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    

七、分布式事务场景示例

@GlobalTransactional
public void placeOrder(Order order) {
    // 1. 扣减库存
    inventoryService.deduct(order.getProductId());
    // 2. 创建订单
    orderService.save(order);
    // 3. 扣减账户余额
    accountService.withdraw(order.getUserId(), order.getAmount());
}

异常时Seata自动回滚所有数据源操作。


总结

关键步骤回顾

  1. 依赖管理:确保版本统一,排除冲突
  2. 配置精准:数据源、插件、扫描路径缺一不可
  3. 注解规范:实体类与Mapper严格匹配数据库结构
  4. 性能优先:批量操作 + 索引优化 + 缓存策略

推荐组合

  • 简单CRUD → MyBatis-Plus基础功能
  • 分库分表 → ShardingSphere + MyBatis-Plus
  • 分布式事务 → Seata + @GlobalTransactional

通过合理配置和优化,MyBatis-Plus在Spring Cloud中可提升开发效率50%以上,降低SQL错误率。建议结合MybatisX插件(IDEA)实现XML与Mapper的快速跳转。