@TableField(fill = FieldFill.INSERT_UPDATE)是什么

@TableField(fill = FieldFill.INSERT)、@TableField(fill = FieldFill.INSERT_UPDATE)这两个注解经常在项目中使用到,他MyBatis-Plus 库中的注解,它用于指定字段在执行数据库表的插入和更新操作时的填充策略

@TableField(fill = FieldFill.INSERT_UPDATE)详细介绍

  1. 功能:
    @TableField(fill = FieldFill.INSERT_UPDATE) 注解用于指示在插入和更新操作期间自动填充字段的值。通常,该注解应用于实体类字段,这些字段映射到数据库表中的列。
  2. 填充策略:
    注解的 fill 属性指定了字段的填充策略。有几个选项可用:
  • FieldFill.DEFAULT:这是默认的填充策略,表示字段不应自动填充。
  • FieldFill.INSERT:该策略指示字段在插入操作时自动填充。
  • FieldFill.UPDATE:该策略指示字段在更新操作时自动填充。
  • FieldFill.INSERT_UPDATE:该策略指示字段在插入和更新操作时都自动填充。
  1. 使用方法:
    要使用 @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插入和更新时这四个字段就会赋值

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐