MyBatis-Plus 核心注解详解:让你告别繁琐配置

MyBatis-Plus (简称 MP) 是一个 MyBatis 的增强工具,它在 MyBatis 的基础上进行了扩展,极大地简化了 CRUD 操作。MP 之所以能够实现这些自动化功能,除了BaseMapper 和 ServiceImpl 以外,很大程度上依赖于它提供的各种注解。

本文将为您深入讲解 MyBatis-Plus 实体类中最核心的几个注解,帮助您快速掌握如何配置实体类(Entity)以完美映射数据库表。

实体类与表映射核心注解

实体类(Entity)是 Java 对象和数据库表之间沟通的桥梁。下面这四个注解是配置实体映射的基础。

  1. @TableName:指定表名
    用于将一个 Java 类映射到数据库中的某张表。指定当前实体类对应的数据库表名。

语法:

复制代码
@TableName("table_name")
public class User {
    // ... 属性
}

注意:如果实体类名(如 User)和数据库表名(如 t_user 或 user)符合 MyBatis-Plus 的命名规范(默认是驼峰转下划线),则可以省略此注解。但为了明确性,强烈建议加上。像是(User ---- user 就可以不添加这个注解,但是最好还是声明一下,更加规范)

  1. @TableId:标识实体类中对应的数据库主键字段。
    在实体类中,必须有一个字段被标记为主键,MyBatis-Plus 才能正确执行查询、更新和删除操作。

语法及配置:

复制代码
@TableId(value = "id", type = IdType.AUTO)
private Long id;

核心属性 IdType (主键策略):

IdType 值 描述 适用场景
AUTO 数据库 ID 自增 MySQL, PostgreSQL 等支持自增的主键
ASSIGN_ID MP 自动分配 ID 默认策略,使用雪花算法生成 Long/String 类型 ID
NONE 不设置主键策略 需要手动设置主键值
INPUT 手动输入 ID 适用于分布式 ID(如雪花算法生成)

常用的是AUTO 和 ASSIGN_ID这两种。

  1. @TableField:配置普通字段,标识实体类中对应的非主键字段,并提供字段配置能力。

用于处理实体属性名和数据库字段名不一致,或需要特殊处理字段的场景。

语法及配置:

复制代码
// 1. 解决字段名不一致:属性名为 userName,但数据库字段名为 user_name_db
@TableField("user_name_db") 
private String userName;

// 2. 忽略该字段:该属性仅用于Java业务逻辑,不与数据库字段映射
@TableField(exist = false)
private String tempField;

核心属性:

  • value: 指定数据库字段名。
  • exist: 默认为 true,表示该属性在数据库中存在对应的字段。若设为 false,则 MP 在生成 SQL 时会忽略此字段。
  • select: 默认为 true,表示该字段参与查询。若设为 false,则 MP 在 select * 时不会查询该字段。

高级功能相关注解

MyBatis-Plus 提供的逻辑删除和乐观锁等高级功能,也依赖于特定的注解。

  1. @TableLogic:实现逻辑删除,逻辑删除是软删除,即不真正从数据库中删除数据,而是通过标记字段来标识数据状态。它的作用就是表示逻辑删除的字段。

语法:

复制代码
// 假设数据库中有一个字段 deleted,0 表示未删除,1 表示已删除
@TableLogic
private Integer deleted;

配合配置:

在 application.yml 中配置逻辑删除的字段值:

复制代码
mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: deleted # 逻辑删除字段名 (可选,默认为实体属性名)
      logic-delete-value: 1        # 删除后的值 (如:1, true)
      logic-not-delete-value: 0    # 未删除的值 (如:0, false)

启用后,当你调用 mapper.deleteById(id) 时,MP 实际执行的是 UPDATE table SET deleted = 1 WHERE id = #{id}。并且,所有查询操作都会自动带上 AND deleted = 0 的条件。

  1. @Version:实现乐观锁
    乐观锁通过版本号(或时间戳)机制,避免多线程并发更新导致的数据丢失问题。它的作用就是标识用于乐观锁的字段(通常是一个 Integer 或 Long 类型的版本号)。

语法:

复制代码
@Version
private Integer version;

工作机制:

  • 查询数据时,会将 version 值一同取出。
  • 更新数据时,MP 会在 WHERE 条件中带上原 version 值: UPDATE table SET name = 'new', version = version + 1 WHERE id = #{id} AND version = #{oldVersion}
  • 如果更新成功,version 会自增 1。如果更新失败(影响行数为 0),说明在本次操作期间,其他线程已经修改了数据,版本号不匹配,MyBatis-Plus 会抛出异常(通常需要开发者捕获并处理)。

总结

MyBatis-Plus 通过这几个核心注解,将实体类与数据库表之间的映射关系、主键生成、特殊字段处理、甚至高级的逻辑删除和乐观锁等功能都清晰地集成到了 Java 代码中,极大地提高了开发效率和代码的可读性。

总结为下表:

相关推荐
煎饼皮皮侠3 小时前
设计一个分页插件之二【基于mybatis实现分页插件】
mybatis·分页插件
czlczl2002092510 小时前
MyBatis-Plus SQL自动填充字段
sql·tomcat·mybatis
独断万古他化10 小时前
【MyBatis-Plus 进阶】注解配置、条件构造器与自定义 SQL的复杂操作详解
sql·mybatis·mybatis-plus·条件构造器
马猴烧酒.1 天前
【JAVA数据传输】Java 数据传输与转换详解笔记
java·数据库·笔记·tomcat·mybatis
962464i1 天前
mybatis-plus生成代码
java·开发语言·mybatis
小信丶1 天前
@MappedJdbcTypes 注解详解:应用场景与实战示例
java·数据库·spring boot·后端·mybatis
palomua1 天前
MyBatis-Plus实体类新增字段导致存量接口报错问题
数据库·mybatis
椎4951 天前
MybatisPlus插件-简化代码开发
mybatis
root666/1 天前
【Java-后端-Mybatis】DISTINCT 作用
数据库·sql·mybatis
墨雨晨曦881 天前
MyBatis框架篇
java·开发语言·mybatis