MyBatis-Plus 基础

MyBatis-Plus(简称 MP)可以说是 MyBatis 的“增强版”。它不是为了替代 MyBatis,而是在其基础上做了增强,让你能更轻松地操作数据库。简单来说,使用它之后,很多基础的增删改查(CRUD)工作你甚至可以不用写一行 SQL 代码,开发效率会大大提高。

💡 核心原理:只做增强,不改动MyBatis

MP 的设计理念是在 MyBatis 的基础上“只做增强,不做改变”。这意味着你原有的 MyBatis 代码和功能完全不受影响,你只需要添加 MP 的依赖,就能在需要的地方使用它提供的强大功能,整个过程非常顺滑。

🚀 快速上手:3分钟跑通流程

  1. 引入依赖:创建一个 Spring Boot 工程,添加 MP 和数据库驱动依赖。注意! 要移除或注释掉原有的 mybatismybatis-spring 依赖,以避免版本冲突。

  2. 配置数据源:在 application.ymlapplication.properties 文件中,像配置普通 MyBatis 一样,配置数据库连接信息。

  3. 编写实体和Mapper:创建一个实体类(例如 User),再写一个 Mapper 接口继承 MP 的 BaseMapper
    java

    1
    2
    3
    4
    // 让 UserMapper 继承 MyBatis-Plus 提供的 BaseMapper
    public interface UserMapper extends BaseMapper<User> {
    // 里面甚至可以什么都不用写
    }

    至此,UserMapper 就拥有了 insertselectByIdupdateByIddeleteById 等近 20 个单表操作方法,可以直接在 Service 层调用,非常方便。

🏷️ 常用注解:为实体类建立数据库映射

为了让 MP 知道你的实体类对应数据库中的哪张表、哪个字段,你需要使用以下注解:

  • @TableName:标注在实体类上,指定其映射的数据库表名。如果类名和表名一致,则可以省略。
  • @TableId:标注在实体类的主键字段上,用于指定该字段为主键。它支持多种主键生成策略,如 IdType.AUTO(数据库自增)、IdType.ASSIGN_ID(雪花算法,MP 默认)等。
  • @TableField:标注在非主键字段上,用于处理字段名不一致或特殊字段。比如,当 Java 实体中的 userName 字段对应数据库表中的 user_name 字段时,就需要使用此注解。
  • @TableLogic:用于逻辑删除字段,MP 会自动在查询时过滤掉已删除的数据。
  • @Version:用于乐观锁的版本号字段。

🎣 条件构造器:告别复杂SQL的烦恼

条件构造器是 MP 的核心功能,它允许你用 Java 代码来“编织”复杂的 SQL 查询条件,主要分为两种:

  • QueryWrapper / UpdateWrapper:直接以字符串形式传入数据库字段名,更接近原生 SQL 的写法。
  • LambdaQueryWrapper / LambdaUpdateWrapper:通过 Lambda 表达式引用实体类的属性(如 User::getAge),这种方式是类型安全的,强烈推荐使用,因为它能让你的代码更健壮,即使重构实体类字段名也不会导致未知的 SQL 错误。

⚙️ 核心功能一览:开箱即用的强大武器

  • 通用 CRUD 与 Service 封装:除了 BaseMapper,MP 也提供了 IService 接口和 ServiceImpl 实现类,封装了更多批量操作,让 Service 层的代码也能快速搭建。
  • 分页查询:通过 PaginationInnerInterceptor 插件实现物理分页。只需将 Page 对象作为第一个参数传递给 Mapper 方法,MP 会自动处理分页 SQL 和总数查询,并对所有数据库使用方言。
  • 乐观锁:通过 @Version 注解和插件,解决数据更新并发冲突。比如处理秒杀等场景。更新时会检查版本号,它必须与查询时的版本号一致才能更新成功,否则会失败。
  • 逻辑删除:通过 @TableLogic 注解,用标记代替物理删除(UPDATE ... SET deleted=1),查询时会自动过滤掉已标记的记录,为数据恢复提供可能,保障数据安全。
  • 自动填充:通过实现 MetaObjectHandler 接口,为 create_timeupdate_time 等字段自动填充值,避免重复代码。
  • 代码生成器:它能根据数据库表结构,反向生成 Entity、Mapper、Service、Controller 等各层的基础代码。开发测试阶段还可以配置性能分析插件来监控 SQL 执行情况,定位慢查询。
  • 多数据源:在需要连接多个数据库时,官方推荐使用 dynamic-datasource 这个第三方插件,配置清晰,使用方便。
  • 预防误操作:内置的全局拦截插件,可以智能阻断恶意的全表 deleteupdate 操作,防止数据灾难。