@TableField(fill = FieldFill.INSERT_UPDATE)是什么
@TableField(fill = FieldFill.INSERT)、@TableField(fill = FieldFill.INSERT_UPDATE)这两个注解经常在项目中使用到,他MyBatis-Plus 库中的注解,它用于指定字段在执行数据库表的插入和更新操作时的填充策略
@TableField(fill = FieldFill.INSERT_UPDATE)详细介绍
- 功能:
@TableField(fill = FieldFill.INSERT_UPDATE) 注解用于指示在插入和更新操作期间自动填充字段的值。通常,该注解应用于实体类字段,这些字段映射到数据库表中的列。 - 填充策略:
注解的 fill 属性指定了字段的填充策略。有几个选项可用:
- FieldFill.DEFAULT:这是默认的填充策略,表示字段不应自动填充。
- FieldFill.INSERT:该策略指示字段在插入操作时自动填充。
- FieldFill.UPDATE:该策略指示字段在更新操作时自动填充。
- FieldFill.INSERT_UPDATE:该策略指示字段在插入和更新操作时都自动填充。
- 使用方法:
要使用 @TableField(fill = FieldFill.INSERT_UPDATE) 注解,按照以下步骤进行操作:
- 在实体类中,找到要应用填充策略的字段。
- 在字段上添加 @TableField(fill = FieldFill.INSERT_UPDATE) 注解。
实际使用案例
有一个student表对应Student实体类,包含一下四个字段:creatorId、createTime、updaterId、updateTime
需要实现如下功能:
- creatorId:创建人 - 创建时自动填充
- createTime:创建时间 - 创建时自动填充
- updaterId:更新人 - 创建和更新时自动填充
- updaterId:更新时间 - 创建和更新时自动填充
第一步:字段上添加注解
对应的字段分别加上@TableField(fill = FieldFill.INSERT)和@TableField(fill = FieldFill.INSERT_UPDATE)注解
具体如下:
Student实体类
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.util.Date;
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("student")
@ApiModel(value="Student对象", description="学生表")
public class Student implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "自增ID")
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty(value = "姓名")
private String name;
@ApiModelProperty(value = "性别")
private Integer sex;
@ApiModelProperty(value = "生日")
@JsonFormat(pattern = "yyyy-MM-dd")
private Date birthday;
@ApiModelProperty(value = "身份证号")
private String idCard;
@ApiModelProperty(value = "手机号")
private String phone;
@ApiModelProperty(value = "创建人")
@TableField(fill = FieldFill.INSERT)
private Integer creatorId;
@ApiModelProperty(value = "创建时间")
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@ApiModelProperty(value = "更新人")
@TableField(fill = FieldFill.INSERT_UPDATE)
private Integer updaterId;
@ApiModelProperty(value = "更新时间")
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}
第二步:添加元数据对象处理器
添加元数据对象处理器,实现MetaObjectHandler类
注意:这个类加上要加@Component注解,这样spring容器才能管理到
import cn.dev33.satoken.stp.StpUtil;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.Optional;
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill");
// 创建时间使用当前时间填充
this.setFieldValByName("createTime", new Date(), metaObject);
// 更新时间使用当前时间填充
this.setFieldValByName("updateTime", new Date(), metaObject);
// 创建人id使用当前登录人id填充,没有的话默认设置1
this.setFieldValByName("creatorId", Optional.ofNullable(StpUtil.getLoginIdDefaultNull()).orElse(1), metaObject);
// 更新人id使用当前登录人id填充,没有的话默认设置1
this.setFieldValByName("updaterId", Optional.ofNullable(StpUtil.getLoginIdDefaultNull()).orElse(1), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill");
// 更新时间使用当前时间填充
this.setFieldValByName("updateTime", new Date(), metaObject);
// 更新人id使用当前登录人id填充,没有的话默认设置1
this.setFieldValByName("updaterId", Optional.ofNullable(StpUtil.getLoginIdDefaultNull()).orElse(1), metaObject);
}
}
实现MetaObjectHandler中的insertFill、updateFill方法
创建人和更新人这里是基于SaToken中获取的,我这里项目使用SaToken来做认证和鉴权,大家可按自己实际情况进行赋值
这样student插入和更新时这四个字段就会赋值