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=true username: root password: 123456 mybatis-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 的灵活性。尤其适合需要快速迭代的企业级项目,其丰富的企业级特性可轻松应对复杂业务场景。