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 代码中,极大地提高了开发效率和代码的可读性。

总结为下表:

相关推荐
学习编程的Kitty12 小时前
Redis(1)——持久化
数据库·redis·mybatis
利刃大大14 小时前
【Mybatis】Mybatis入门 && 基础操作 && XML配置文件开发 && 多表查询 && 注入问题 && 数据库连接池
xml·数据库·mybatis
野蛮人6号1 天前
黑马微服务报错以及解决前23节课
spring boot·微服务·mybatis
悟能不能悟1 天前
mybatis sql where a=#{a},如果a为null,会返回什么
数据库·sql·mybatis
running up2 天前
MyBatis 核心知识点与实战
数据库·oracle·mybatis
落霞的思绪2 天前
Mybatis读取PostGIS生成矢量瓦片实现大数据量图层的“快显”
linux·运维·mybatis·gis
自在极意功。2 天前
MyBatis配置文件详解:environments、transactionManager与dataSource全面解析
java·数据库·tomcat·mybatis
苏小瀚2 天前
[JavaEE] Spring IoC&DI
spring·java-ee·mybatis
星星不打輰3 天前
SSM项目--SweetHouse 甜蜜蛋糕屋
java·spring·mybatis·ssm·springmvc
代码栈上的思考3 天前
MyBatis:注解方式实现数据库 CRUD 全操作
java·开发语言·mybatis