1. MyBatis-Plus核心功能解析
MyBatis-Plus作为MyBatis的增强工具,在Spring Boot项目中能显著提升开发效率。最新3.5.9版本针对Spring Boot 3.x做了深度适配,下面我将结合多年实战经验,详细解析其核心用法。
1.1 基础环境搭建
首先需要引入正确的starter依赖,这里特别注意Spring Boot 3.x的兼容性问题:
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-spring-boot3-starter</artifactId> <version>3.5.9</version> </dependency>关键提示:Spring Boot 2.x项目请使用
mybatis-plus-boot-starter,3.x项目必须使用带spring-boot3标识的starter,否则会出现兼容性问题
基础配置建议采用以下yml配置模板:
mybatis-plus: type-aliases-package: com.example.entity # 实体类包路径 configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启SQL日志 global-config: db-config: id-type: assign_id # 雪花算法ID生成 logic-delete-field: deleted # 逻辑删除字段 logic-delete-value: 1 logic-not-delete-value: 01.2 实体类映射技巧
实体类与表字段映射是ORM的核心,MyBatis-Plus提供了灵活的注解配置:
@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; }常见踩坑点:
- 布尔类型字段命名建议避免is前缀,否则可能引发序列化问题
- 使用关键字作为字段名时,必须用反引号包裹:@TableField("
order") - 枚举字段建议使用@EnumValue注解标记存储值
2. 核心功能深度实践
2.1 逻辑删除实现方案
逻辑删除是业务系统的常见需求,MyBatis-Plus提供了开箱即用的支持:
# 配置逻辑删除字段 mybatis-plus: global-config: db-config: logic-delete-field: deleted logic-delete-value: 1 logic-not-delete-value: 0实现原理:
- 删除操作自动转为UPDATE语句
- 查询操作自动附加
deleted=0条件 - 需要手动处理关联表查询时的逻辑删除条件
经验分享:在涉及多表关联查询时,建议使用XML方式编写SQL,通过
<if test="逻辑删除条件">动态处理
2.2 JSON字段处理
处理MySQL JSON类型字段时,需要特殊配置:
@Data @TableName(autoResultMap = true) // 必须开启 public class User { @TableField(typeHandler = JacksonTypeHandler.class) private UserInfo userInfo; // 自定义JSON对象 }配套的JSON处理器配置:
@Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new DynamicTableNameInnerInterceptor()); return interceptor; }性能优化建议:
- 频繁访问的JSON字段考虑拆分为普通字段
- 大数据量JSON字段建议单独存储到MongoDB等文档数据库
3. 高级特性应用
3.1 枚举类型处理
优雅处理状态枚举可以提升代码可读性:
@Getter public enum UserStatus { NORMAL(1, "正常"), LOCKED(2, "锁定"); @EnumValue // 标记存储值 private final int code; private final String desc; // 构造方法等 }配置枚举处理器:
mybatis-plus: configuration: default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler3.2 自动填充功能
实现元数据自动填充(如创建时间、更新时间):
@Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); } @Override public void updateFill(MetaObject metaObject) { this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); } }实体类注解配置:
public class BaseEntity { @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; }4. 实战问题排查指南
4.1 常见异常处理
Invalid bound statement异常
- 检查Mapper接口是否添加@Mapper注解
- 确认mapper.xml文件位置是否正确
- 检查mybatis-plus.mapper-locations配置
TypeHandler不生效
- 确认@TableName(autoResultMap = true)已添加
- 检查typeHandler配置是否正确
- 确保字段类型与处理器匹配
逻辑删除失效
- 检查yml配置是否正确
- 确认实体类字段名与配置一致
- 自定义SQL需要手动处理逻辑删除条件
4.2 性能优化建议
- 批量操作使用
saveBatch方法,配合rewriteBatchedStatements=true参数 - 复杂查询建议使用LambdaQueryWrapper避免SQL注入
- 分页查询注意配置合理的pageSize
- 关联查询考虑使用@TableField(exist = false)+@Select注解方式
5. 扩展功能集成
5.1 多数据源配置
结合dynamic-datasource实现多数据源:
<dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>3.6.1</version> </dependency>配置示例:
spring: datasource: dynamic: primary: master datasource: master: url: jdbc:mysql://localhost:3306/master username: root password: 123456 slave: url: jdbc:mysql://localhost:3306/slave username: root password: 1234565.2 代码生成器使用
MyBatis-Plus提供了强大的代码生成功能:
FastAutoGenerator.create("jdbc:mysql://localhost:3306/test", "root", "123456") .globalConfig(builder -> builder.author("baomidou")) .packageConfig(builder -> builder.parent("com.baomidou.mybatisplus.samples.generator")) .strategyConfig(builder -> builder.addInclude("t_simple")) .execute();生成配置建议:
- 实体类添加lombok注解
- 启用Swagger注解
- 使用RestController风格
- 开启文件覆盖提示
在实际项目开发中,合理运用MyBatis-Plus的特性可以提升至少30%的开发效率。特别是在快速迭代的业务场景下,其CRUD接口的自动化能力可以让我们更专注于业务逻辑的实现。建议团队建立统一的MyBatis-Plus使用规范,避免因个性化配置导致的维护成本增加。