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

总结为下表:

相关推荐
程序员JerrySUN16 小时前
Jetson Edge AI 实战01:Nano、Xavier、Orin 怎么选?Jetson 硬件选型详解【视频讲解】
java·数据库·redis·安全·mybatis
linmengmeng_131419 小时前
【总结】MyBatis-Plus批量插入与清表的正确姿势
java·spring boot·mysql·mybatis
vx_BS813301 天前
【项目编号:project51381】Spring Boot 婚纱摄影管理系统:套餐预约、在线咨询、支付与客片展示的一站式业务实现
java·spring boot·eclipse·tomcat·mybatis
jaysee-sjc2 天前
【苍穹外卖】Day01:从零认识企业级项目开发
java·开发语言·数据库·mysql·spring·intellij-idea·mybatis
程序猿乐锅2 天前
【黑马点评 | 第二篇】Redis 缓存更新策略与商铺缓存实现
java·网络·redis·spring·mybatis
萧瑟余晖2 天前
MyBatis 核心原理详解
架构·mybatis
MZA6662 天前
实战:基于 XXL-JOB + 策略模式 + Nacos 配置化的 CSV 导出任务系统设计
java·spring boot·mybatis
干到60岁退休的码农5 天前
15.创建获取用户接口与JWT认证器
java·spring boot·mybatis
干到60岁退休的码农5 天前
16.过滤器中处理异常响应返回
java·spring boot·mybatis
敲代码的嘎仔6 天前
互动问答系统实战:两级评论模型、ES 搜索集成、Caffeine 多级缓存全记录
java·开发语言·数据库·elasticsearch·缓存·mybatis·高并发