MyBatis Plus注解 @TableField
1. 概述
@TableField
是MyBatis-Plus
框架提供的核心注解之一,用于映射实体类字段与数据库表列的关系,并配置字段在 CRUD 操作中的行为策略。
作用范围:实体类的成员变量
2. 核心属性说明
@TableField
注解具有多个属性,其中最常用的有 value
、exist
和fill
。
-
value
属性: 用于指定字段在数据库表中的列名,如果实体类字段名与数据库表列名不一致时,通过该属性指定映射关系。示例:@TableField(value = "user_name") // 数据库列名为 user_name,实体字段为 userName private String userName;
-
exist
属性: 用于指定字段是否为数据库表中的字段,如果为false
,则表示该字段仅在Java实体类中存在,而不对应数据库表中的列,避免 MyBatis-Plus 生成 SQL 时包含该字段。示例:@TableField(exist = false) // 该字段不在数据库表中 private String tempData;
-
fill
属性: 用于指定字段的自动填充策略,结合 MetaObjectHandler 接口的实现,可以实现创建时间、更新时间等字段的自动填充。常用的策略有:FieldFill.DEFAULT
:不进行自动填充。FieldFill.INSERT
:只在插入数据时自动填充。FieldFill.UPDATE
:只在更新数据时自动填充。FieldFill.INSERT_UPDATE
:在插入和更新数据时都进行自动填充。
@TableField(fill = FieldFill.INSERT) private Date createTime;@TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime;
3. 策略配置
在 MyBatis-Plus 中,FieldStrategy
是用于控制实体类字段在 CRUD
操作 中如何被处理的核心枚举类,主要通过 @TableField
注解的 insertStrategy
(插入策略)、updateStrategy
(更新策略)、whereStrategy
(查询条件策略) 三个属性配置。
3.1 FieldStrategy 枚举的 5 种策略
策略值 | 核心含义 | 适用操作类型 | 典型场景 |
---|---|---|---|
IGNORED | 完全忽略字段的空值/空内容判断,无论字段值是什么(null /"" /有效值),都会参与操作。 | 插入、更新、查询 | 主动将字段设为 null (如清空数据)、必须插入空字符串("" )等场景。 |
NOT_NULL (默认) | 仅当字段值 不为 null 时,才参与操作(空字符串 "" 会被忽略)。 | 插入、更新、查询 | 大部分常规场景,避免 null 覆盖现有值,仅处理明确赋值的非空字段。 |
NOT_EMPTY | 仅当字段值 不为 null 且不为空字符串 "" 时,才参与操作(仅对字符串有效)。 | 插入、更新、查询 | 字符串字段需严格校验“非空且非空串”,如用户名、手机号等必填项。 |
NEVER | 字段始终不参与任何操作(CRUD 全忽略)。 | 插入、更新、查询 | 临时字段、计算属性(如 transient 修饰的字段),无需与数据库交互的字段。 |
DEFAULT | 跟随全局配置的策略(不常用,一般用具体策略替代)。 | 插入、更新、查询 | 需统一遵循全局策略时使用(优先级低于局部注解配置)。 |
3.2 三大注解属性的作用(@TableField
中配置)
@TableField
通过以下三个属性分别控制 插入、更新、查询 时的字段策略,默认值均为 NOT_NULL
:
注解属性 | 作用范围 | 说明 |
---|---|---|
insertStrategy | 插入操作(insert ) | 控制字段在执行 insert 时是否被写入 SQL 的 INSERT 语句。 |
updateStrategy | 更新操作(update ) | 控制字段在执行 update 时是否被写入 SQL 的 SET 语句。 |
whereStrategy | 查询操作(select ) | 控制字段在生成查询条件(如 WHERE 子句)时是否被纳入条件判断。 |
示例:
// 插入时允许为 null(如备注,可选填)@TableField(insertStrategy = FieldStrategy.IGNORED)private String remark;
// 更新时允许将 nickname 设为 null(如用户主动清空昵称)@TableField(updateStrategy = FieldStrategy.IGNORED)private String nickname;
3.3 全局策略
全局策略:可在配置文件中设置默认策略(如 application.yml),作用于所有未单独配置的字段:
mybatis-plus:global-config:db-config:field-strategy: not_null # 全局默认策略(插入、更新、查询)
局部策略:@TableField 的 insertStrategy/updateStrategy/whereStrategy 会 覆盖全局策略,优先级更高。
The End.