MyBatis-Plus(简称 MP)是 MyBatis 的增强工具库,在保留 MyBatis 所有特性的基础上,提供了更简洁高效的 CRUD 操作、强大的条件构造器、分页插件等企业级开发常用功能,大幅提升开发效率。
⚡️ MyBatis-Plus 核心优势
| 特性 | 价值说明 |
|---|---|
| 无侵入增强 | 只做增强不做修改,引入后不影响原 MyBatis 功能 |
| 强大的 CRUD 封装 | 通用 BaseMapper/IService 接口实现单表 90% 操作,无需手写 XML |
| Lambda 条件构造器 | 链式调用+Lambda 表达式防误写字段名,支持复杂 SQL 拼接(例:eq()/like()) |
| 全局主键策略 | 支持雪花算法、UUID、自增等分布式 ID 生成 |
| ** ActiveRecord 模式** | 实体类直接操作数据库(user.insert()) |
| 插件扩展机制 | 分页插件、性能分析插件、乐观锁插件等开箱即用 |
| 代码生成器 | 自动生成 Entity/Mapper/Service/Controller 层代码 |
🛠️ 典型使用场景示例
1. 极简 CRUD 操作
// 插入(自动填充主键)
User user = new User().setName("John").setAge(28);
userMapper.insert(user); // 查询(Lambda 避免硬编码字段名)
List<User> users = userMapper.selectList(Wrappers.<User>lambdaQuery().like(User::getName, "J").gt(User::getAge, 25)
);
2. 分页查询(含总数统计)
Page<User> page = new Page<>(1, 10); // 第1页,每页10条
Page<User> result = userMapper.selectPage(page, Wrappers.<User>query().orderByDesc("create_time")
);
// 获取记录列表
List<User> records = result.getRecords();
// 获取总数
long total = result.getTotal();
3. 字段自动填充(如创建时间)
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;// 实现 MetaObjectHandler 接口
@Override
public void insertFill(MetaObject metaObject) {this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
}
4. 逻辑删除配置
mybatis-plus:global-config:db-config:logic-delete-field: deleted # 实体类中标记删除的字段logic-delete-value: 1 # 删除状态值logic-not-delete-value: 0 # 未删除状态值
🔌 关键插件推荐
| 插件名称 | 功能描述 |
|---|---|
PaginationInnerInterceptor | 自动分页(支持多种数据库方言) |
OptimisticLockerInnerInterceptor | 乐观锁(基于 @Version 注解) |
BlockAttackInnerInterceptor | 防止全表更新/删除 |
DynamicTableNameInnerInterceptor | 动态表名(适合分表场景) |
🚀 与 Spring Boot 集成步骤
-
添加依赖:
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.6</version> <!-- 使用最新版本 --> </dependency> -
配置数据源 & MP 全局设置:
spring:datasource:url: jdbc:mysql://localhost:3306/db?useUnicode=trueusername: rootpassword: 123456mybatis-plus:configuration:map-underscore-to-camel-case: true # 自动转驼峰global-config:db-config:id-type: assign_id # 雪花算法生成ID -
定义 Mapper 接口继承
BaseMapper:public interface UserMapper extends BaseMapper<User> {// 自定义复杂SQL可在此扩展@Select("SELECT * FROM user WHERE age > #{age}")List<User> selectCustom(@Param("age") Integer age); }
⚠️ 避坑指南
-
实体类字段映射:
- 表字段名与属性名不一致时用
@TableField("db_column")显式指定 - 避免实体类中存在数据库不存在的字段(可用
@TableField(exist = false)忽略)
- 表字段名与属性名不一致时用
-
分页失效问题:
确保注册分页插件到 Spring 容器:@Bean public MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor());return interceptor; } -
更新时字段丢失:
使用UpdateWrapper或lambdaUpdate()明确更新字段,避免全字段覆盖:userMapper.update(null, Wrappers.<User>lambdaUpdate().set(User::getEmail, "new@mail.com").eq(User::getId, 1) );
💡 进阶实践:AI表单系统整合建议
若将 MyBatis-Plus 作为您的 AI 表单系统后端 ORM 框架:
-
动态表处理:
通过DynamicTableNameInnerInterceptor实现按租户分表存储表单数据。 -
JSON 字段映射:
利用@TableField(typeHandler = FastjsonTypeHandler.class)处理表单 JSON 配置。 -
审计字段自动化:
结合MetaObjectHandler自动填充创建人/修改人信息。 -
高性能批量插入:
使用saveBatch()方法 + 开启rewriteBatchedStatements=true优化批量提交。
总结:MyBatis-Plus 是 Java 后端开发的“效率加速器”,减少 70% 样板代码的同时保留 MyBatis 的灵活性。尤其适合需要快速迭代的企业级项目,其丰富的企业级特性可轻松应对复杂业务场景。