Mybatisplus实现MetaObjectHandler接口自动更新创建时间更新时间
踩坑:
直接实现该接口,发现进入该类后的entity已经重新处理updateTime了,但是更新数据库的时候,却不带updateTime更新。
原因:
由于对该接口等认识不足导致。
解决方案:
实体类中需要添加注解:fill = FieldFill.INSERT_UPDATE
代码:
/** * 更新时间 */ @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) private Long updateTime;
-
/** * 新增,更新时,自动更新字段 */ @Component public class MyMetaObjectHandler implements MetaObjectHandler { private static String CREATE_TIME = "createTime"; private static String UPDATE_TIME = "updateTime"; /** * 插入使用 */ @Override public void insertFill(MetaObject metaObject) { fillValue(metaObject, CREATE_TIME, () -> getDateValue(metaObject.getSetterType(CREATE_TIME))); fillValue(metaObject, UPDATE_TIME, () -> getDateValue(metaObject.getSetterType(UPDATE_TIME))); } @Override public void updateFill(MetaObject metaObject) { fillValue(metaObject, "et."+UPDATE_TIME, () -> getDateValue(metaObject.getSetterType("et."+UPDATE_TIME))); } private void fillValue(MetaObject metaObject, String fieldName, Supplier<Object> valueSupplier) { if (!metaObject.hasGetter(fieldName)) { return; } Object sidObj = metaObject.getValue(fieldName); if (sidObj == null && metaObject.hasSetter(fieldName) && valueSupplier != null) { setFieldValByName(fieldName, valueSupplier.get(), metaObject); } } private Object getDateValue(Class<?> setterType) { if (Date.class.equals(setterType)) { return new Date(); } else if (LocalDateTime.class.equals(setterType)) { return LocalDateTime.now(); } else if (Long.class.equals(setterType)){ return System.currentTimeMillis(); } return null; } }