一.添加注解
//插入时更新字段
@TableField(fill = FieldFill.INSERT)
private Date createTime;
//插入时与修改时更新字段
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
二.自定义实现类MyMetaObjectHandler
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill");
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill");
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
}
注:
strictInsertFill、strictUpdateFill
为严格填充,属性存在值不覆盖,填充值为null不填充
若update语句中的User对象来自于查询,其中update_time字段已存在属性值,使用严格填充将不会对update_time字段进行更新
为避免以上情况,可选择对User对象进行设置:
setUpdateTime(null)
或使用通用填充:
setFieldValByName
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill");
this.setFieldValByName("createTime", LocalDateTime.now(), metaObject);
this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill");
this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
}
}
运行效果
第六行为新插入的数据
进行一次更新,将年龄设置为6岁:
可以看到update_time字段发生了改变
题外话:在创建数据库之初实现自动更新日期
在创建数据库字段时,选择类型datetime,填写默认值CURRENT_TIMESTAMP(切记创建时填写),并为update_time勾选根据当前时间戳更新