MyBatis-Plus (简称 MP) 是一个 MyBatis 的增强工具,它在 MyBatis 的基础上进行了扩展,极大地简化了 CRUD 操作。MP 之所以能够实现这些自动化功能,除了BaseMapper 和 ServiceImpl 以外,很大程度上依赖于它提供的各种注解。
本文将为您深入讲解 MyBatis-Plus 实体类中最核心的几个注解,帮助您快速掌握如何配置实体类(Entity)以完美映射数据库表。
实体类与表映射核心注解
实体类(Entity)是 Java 对象和数据库表之间沟通的桥梁。下面这四个注解是配置实体映射的基础。
- @TableName:指定表名
用于将一个 Java 类映射到数据库中的某张表。指定当前实体类对应的数据库表名。
语法:
@TableName("table_name")
public class User {
// ... 属性
}
注意:如果实体类名(如 User)和数据库表名(如 t_user 或 user)符合 MyBatis-Plus 的命名规范(默认是驼峰转下划线),则可以省略此注解。但为了明确性,强烈建议加上。像是(User ---- user 就可以不添加这个注解,但是最好还是声明一下,更加规范)
- @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这两种。
- @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 提供的逻辑删除和乐观锁等高级功能,也依赖于特定的注解。
- @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 的条件。
- @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 代码中,极大地提高了开发效率和代码的可读性。
总结为下表:
