entity中
/**
* 创建时间
*/
//注解@TableField,fill属性,配置自动填充,在插入时,自动插入创建时间。默认是不处理的
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
/**
* 修改时间
*/
//注解@TableField,fill属性,配置自动填充,在更新时,自动更新时间。默认是不处理的
@TableField(fill = FieldFill.UPDATE)
private LocalDateTime updateTime;
/**
* 逻辑删除标识(0为未删除,1为已删除)
*/
@TableField(select = false)
private Integer deleted;
使用注解@TableLogic,标识字段为逻辑删除字段
如果该表的逻辑删除字段的值和全局配置不同,则使用value属性配置未删除值,delval配置已删除值
@Data
public class User {
//省略其他字段...
/**
* 逻辑删除标识(0为未删除,1为已删除)
*/
//注解@TableLogic,标识该字段为逻辑删除字段
//你可以使用注解里面的value属性指定未删除的值,delval属性设置已删除的值,一般我们不指定,使用全局配置的,这里配置的是局部配置的
@TableLogic
private Integer deleted;
}
配置类称之为 元数据对象处理类,一般用于公共字段自动写入。
metaObject表示元数据对象,我们从该对象中获取实体数据信息
hasSetter(),判断是否有某个字段的set方法
setInsertFieldValByName(),在新增时,设置指定字段的值,例如这里是创建时间
getFieldValByName(),获取实体对象中,是否已经手动设置了值,如果设置了,就可以不进行自动填充
setUpdateFieldValByName(),在更新时,设置指定字段的值,例如这里是更新时间
建议设置值前,先判断是否有set方法,有set方法,就代表有字段,避免无意义的设置。
最好设置前,先判断是否已经有值,有值则不覆盖了,建立优先级关系
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
String fieldName = "createTime";
//有创建时间字段时,才进行填充,否则不处理
boolean hasCreateTimeField = metaObject.hasSetter(fieldName);
if (hasCreateTimeField) {
System.out.println("============== insert 触发自动填充... ==============");
//新增时,插入创建时间(注意传入的字段名是属性中的变量名,不是数据库中的字段名)
setInsertFieldValByName(fieldName, LocalDateTime.now(), metaObject);
}
}
@Override
public void updateFill(MetaObject metaObject) {
//存在更新时间字段时,再进行自动填充,否则不处理
String fieldName = "updateTime";
boolean hasUpdateTime = metaObject.hasSetter(fieldName);
//获取实体中,是否手动设置了值,如果设置了值,则不进行自动填充
Object val = getFieldValByName(fieldName, metaObject);
if (val == null && hasUpdateTime) {
System.out.println("============== update 触发自动填充... ==============");
//更新时,更新时间(注意传入的字段名是属性中的变量名,不是数据库中的字段名)
setUpdateFieldValByName(fieldName, LocalDateTime.now(), metaObject);
}
}
}