MyBatis-Plus中FieldFill理解与应用
FieldFill
是 MyBatis-Plus 框架中用于字段自动填充功能的一个枚举类。它定义了字段在不同场景下的自动填充策略。具体来说,FieldFill
枚举有以下几个值:
DEFAULT
:默认值,表示该字段不会进行自动填充。INSERT
:插入记录时自动填充字段。UPDATE
:更新记录时自动填充字段。INSERT_UPDATE
:插入和更新记录时都自动填充字段。
使用场景
1. 插入记录时自动填充
当你希望某个字段在插入记录时自动填充,可以将该字段的 fieldFill
属性设置为 FieldFill.INSERT
。例如,创建时间字段通常在插入记录时自动填充:
@TableField(fill = FieldFill.INSERT)
private Date createTime;
2. 更新记录时自动填充
当你希望某个字段在更新记录时自动填充,可以将该字段的 fieldFill
属性设置为 FieldFill.UPDATE
。例如,更新时间字段通常在更新记录时自动填充:
@TableField(fill = FieldFill.UPDATE)
private Date updateTime;
3. 插入和更新记录时都自动填充
如果你希望某个字段在插入和更新记录时都自动填充,可以将该字段的 fieldFill
属性设置为 FieldFill.INSERT_UPDATE
。例如,某些版本控制字段可能需要在插入和更新时都自动填充:
@TableField(fill = FieldFill.INSERT_UPDATE)
private Integer version;
自动填充处理器
为了实现自动填充功能,你需要编写一个 MetaObjectHandler
类,实现 MetaObjectHandler
接口,并在其中定义具体的填充逻辑。例如:
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFilled(MetaObject metaObject) {this.strictInsertFill(metaObject, "createTime", LocalDateTime.now()); // 起始版本 3.3.0(推荐)this.strictInsertFill(metaObject, "updateTime", LocalDateTime.now()); // 起始版本 3.3.0(推荐)}@Overridepublic void updateFilled(MetaObject metaObject) {this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.now()); // 起始版本 3.3.0(推荐)}
}
示例
假设你有一个 User
实体类,其中包含 createTime
和 updateTime
字段:
@Data
public class User {private Long id;private String name;@TableField(fill = FieldFill.INSERT)private LocalDateTime createTime;@TableField(fill = FieldFill.UPDATE)private LocalDateTime updateTime;
}
代码解释
回到最初的代码:
methodList.add(new InsertBatchSomeColumn(i -> i.getFieldFill() != FieldFill.UPDATE));
这行代码的意思是:在批量插入记录时,只插入那些 getFieldFill
属性不是 FieldFill.UPDATE
的字段。也就是说,更新时间字段(如 updateTime
)不会被插入,因为它们通常是在更新记录时自动填充的。