Mybatis plus 默认值 @TableField(fill = FieldFill.INSERT_UPDATE)

Mybatis plus 默认值 @TableField(fill = FieldFill.INSERT_UPDATE)

@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:更新时间 - 创建和更新时自动填充

实体

public class BaseEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * 搜索值
     */
    @JsonIgnore
    @TableField(exist = false)
    private String searchValue;


    /**
     * 请求参数
     */
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    @TableField(exist = false)
    private Map<String, Object> params;


    /**
     * 备注
     */
    @Schema(description = "备注")
    @TableField(value = "remark")
    private String remark;

    /**
     * 创建时间
     */
    @Schema(description = "创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private Date createTime;

    /**
     * 更新时间
     */
    @Schema(description = "更新时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(value = "update_time", fill = FieldFill.UPDATE)
    private Date updateTime;

    /**
     * 状态(0:禁用、1:启用)
     */
    @Schema(description = "状态(0:禁用、1:启用)")
    @TableField(value = "status")
    private Integer status;

    .... getter & setter
}
@Schema(description = "角色信息")
@TableName("sys_role")
public class SysRole extends BaseEntity {
    private static final long serialVersionUID = 1L;

    /**
     * 主健ID
     */
    @Schema(description = "主健ID")
    @TableId(value = "id", type = IdType.ASSIGN_UUID)
    private String id;
    /**
     * 角色标识
     */
    @Schema(description = "角色标识")
    @TableField(value = "code")
    private String code;

   .... getter & setter
}

MetaObjectHandler


import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.util.ClassUtils;

import java.nio.charset.Charset; 
import java.util.Date;

/**
 * MybatisPlus 自动填充配置
 */
@Component
public class MybatisPlusMetaObjectHandler implements MetaObjectHandler {

    Logger logger = LoggerFactory.getLogger(this.getClass());

    @Override
    public void insertFill(MetaObject metaObject) {
        logger.info("start insert fill");
        Date now = new Date();
        // 创建时间使用当前时间填充
        fillValIfNullByName("createTime", now, metaObject, true);
        // 更新时间使用当前时间填充
        fillValIfNullByName("updateTime", now, metaObject, true);
        // 创建人id使用当前登录人id填充,没有的话默认设置1
        fillValIfNullByName("createBy", getUserName(), metaObject, true);
        // 更新人id使用当前登录人id填充,没有的话默认设置1
        fillValIfNullByName("updateBy", getUserName(), metaObject, true);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        logger.info("start update fill");
        // 更新时间使用当前时间填充
        fillValIfNullByName("updateTime", new Date(), metaObject, true);
        // 更新人id使用当前登录人id填充,没有的话默认设置1
        fillValIfNullByName("updateBy",  getUserName(), metaObject, true);
    }

    /**
     * 填充值,先判断是否有手动设置,优先手动设置的值,例如:job必须手动设置
     *
     * @param fieldName  属性名
     * @param fieldVal   属性值
     * @param metaObject MetaObject
     * @param isCover    是否覆盖原有值,避免更新操作手动入参
     */
    private static void fillValIfNullByName(String fieldName, Object fieldVal, MetaObject metaObject, boolean isCover) {
        // 0. 如果填充值为空
        if (fieldVal == null) {
            return;
        }

        // 1. 没有 set 方法
        if (!metaObject.hasSetter(fieldName)) {
            return;
        }
        // 2. 如果用户有手动设置的值
        Object userSetValue = metaObject.getValue(fieldName);
        String setValueStr = StrUtil.str(userSetValue, Charset.defaultCharset());
        if (StrUtil.isNotBlank(setValueStr) && !isCover) {
            return;
        }
        // 3. field 类型相同时设置
        Class<?> getterType = metaObject.getGetterType(fieldName);
        if (ClassUtils.isAssignableValue(getterType, fieldVal)) {
            metaObject.setValue(fieldName, fieldVal);
        }
    }


    /**
     * 获取 spring security 当前的用户名
     *
     * @return 当前用户名
     */
    private String getUserName() {
        return "Cuwor";
        //TODO 获取当前用户信息
//        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
//        // 匿名接口直接返回
//        if (authentication instanceof AnonymousAuthenticationToken) {
//            return null;
//        }
//
//        if (Optional.ofNullable(authentication).isPresent()) {
//            return authentication.getName();
//        }
//
//        return null;
    }
}
posted @ 2024-10-28 17:16  VipSoft  阅读(99)  评论(0编辑  收藏  举报