MyBatisPlus介绍及使用

发布于:2025-07-01 ⋅ 阅读:(25) ⋅ 点赞:(0)

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 集成步骤

  1. 添加依赖

    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.6</version> <!-- 使用最新版本 -->
    </dependency>
    
  2. 配置数据源 & 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
    
  3. 定义 Mapper 接口继承 BaseMapper

    public interface UserMapper extends BaseMapper<User> {
        // 自定义复杂SQL可在此扩展
        @Select("SELECT * FROM user WHERE age > #{age}")
        List<User> selectCustom(@Param("age") Integer age);
    }
    

⚠️ 避坑指南

  1. 实体类字段映射

    • 表字段名与属性名不一致时用 @TableField("db_column") 显式指定
    • 避免实体类中存在数据库不存在的字段(可用 @TableField(exist = false) 忽略)
  2. 分页失效问题
    确保注册分页插件到 Spring 容器:

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }
    
  3. 更新时字段丢失
    使用 UpdateWrapperlambdaUpdate() 明确更新字段,避免全字段覆盖:

    userMapper.update(null, 
        Wrappers.<User>lambdaUpdate()
            .set(User::getEmail, "new@mail.com")
            .eq(User::getId, 1)
    );
    

💡 进阶实践:AI表单系统整合建议

若将 MyBatis-Plus 作为您的 AI 表单系统后端 ORM 框架:

  1. 动态表处理
    通过 DynamicTableNameInnerInterceptor 实现按租户分表存储表单数据。

  2. JSON 字段映射
    利用 @TableField(typeHandler = FastjsonTypeHandler.class) 处理表单 JSON 配置。

  3. 审计字段自动化
    结合 MetaObjectHandler 自动填充创建人/修改人信息。

  4. 高性能批量插入
    使用 saveBatch() 方法 + 开启 rewriteBatchedStatements=true 优化批量提交。


总结:MyBatis-Plus 是 Java 后端开发的“效率加速器”,减少 70% 样板代码的同时保留 MyBatis 的灵活性。尤其适合需要快速迭代的企业级项目,其丰富的企业级特性可轻松应对复杂业务场景。


网站公告

今日签到

点亮在社区的每一天
去签到