一、核心概念
- MyBatis-Plus定位
MyBatis的增强工具,提供通用Mapper、分页插件、代码生成器等,简化CRUD操作。 - 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生成策略冲突 | 实体类@TableId 的type 需与全局id-type 一致(如ASSIGN_ID ) |
四、注意事项
- 多模块依赖管理
父pom声明依赖版本,子模块按需引入(避免版本冲突)。 - XML映射文件位置
mapper-locations
路径需与实际位置一致,支持classpath*:
多模块扫描。 - 实体注解规范
表名@TableName
、主键@TableId
、逻辑删除@TableLogic
缺一不可。
五、使用技巧
- 代码生成器
使用MyBatis-Plus Generator
自动生成Entity/Mapper/Service代码。 - Lambda表达式
避免硬编码字段名:userService.lambdaQuery() .eq(User::getName, "Alice") .list();
- 多数据源动态切换
结合@DS("slave")
注解实现读写分离。
六、最佳实践与性能优化
- 批量操作
性能对比:批量插入比单条循环快10倍以上。List<User> userList = new ArrayList<>(); saveBatch(userList, 1000); // 分批次插入,每批1000条
- 索引与查询优化
- 对高频查询字段(如
create_time
)添加索引 - 避免
SELECT *
,改用明确字段列表。
- 对高频查询字段(如
- 二级缓存策略
读多写少场景启用缓存:mybatis-plus: configuration: cache-enabled: true
- 监控与日志
开启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自动回滚所有数据源操作。
总结
关键步骤回顾:
- 依赖管理:确保版本统一,排除冲突
- 配置精准:数据源、插件、扫描路径缺一不可
- 注解规范:实体类与Mapper严格匹配数据库结构
- 性能优先:批量操作 + 索引优化 + 缓存策略
推荐组合:
- 简单CRUD → MyBatis-Plus基础功能
- 分库分表 → ShardingSphere + MyBatis-Plus
- 分布式事务 → Seata +
@GlobalTransactional
通过合理配置和优化,MyBatis-Plus在Spring Cloud中可提升开发效率50%以上,降低SQL错误率。建议结合MybatisX插件(IDEA)实现XML与Mapper的快速跳转。