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;
}
}
本文来自博客园,作者:VipSoft 转载请注明原文链接:https://www.cnblogs.com/vipsoft/p/18511140