Mybatis-Plus @TableField自动填充时间为null的问题解决
Chefng- 人气:0最近做的一个项目中用到了mybatis-plus的自动填充
主要服务于数据库表中的创建时间字段以及最后修改时间字段
期望效果是在执行添加或更新操作时自动填充相应时间
但是发现执行操作后相应字段填充值为null
省流:将实体类中的TableField的value项去掉,并将MetaObjectHandler实现类中的相应方法的fieldName都改为了驼峰式命名即可。(注意:java实体类中属性名一般为驼峰式命名)
我使用的mybatis-plus版本为3.5.1
首先是对应的实体类中的这两个字段如下:
/** * 创建时间 */ @TableField(value = "gmt_create", fill = FieldFill.INSERT) @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8") private LocalDateTime gmtCreate; /** * 修改时间 */ @TableField(value = "gmt_modified", fill = FieldFill.INSERT_UPDATE) @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8") private LocalDateTime gmtModified;
然后我实现的MetaObjectHandler接口如下:
package edu.web.utils; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; import java.time.LocalDateTime; @Slf4j // 添加日志 @Component // 注入Spring容器中 public class MyMetaObjectHandler implements MetaObjectHandler { /** * 插入时的填充策略 * * @param metaObject */ @Override public void insertFill(MetaObject metaObject) { // 添加日志 log.info("start insert fill............"); /** * String fieldName: 需要插入的字段 * Object fieldVal: 需要插入的类型 * MetaObject metaObject: 需要给哪个数据处理 */ this.strictInsertFill(metaObject, "gmt_create", LocalDateTime.class, LocalDateTime.now()); this.strictUpdateFill(metaObject, "gmt_modified", LocalDateTime.class, LocalDateTime.now()); } /** * 更新时的填充策略 * * @param metaObject */ @Override public void updateFill(MetaObject metaObject) { log.info("end update fill............"); /** * 更新的时候需要更新的字段 */ this.strictUpdateFill(metaObject, "gmt_modified", LocalDateTime.class, LocalDateTime.now()); } }
乍一看貌似没有任何问题,但实际使用中的结果....见下图:
上图为指定行记录的更新操作结果,我们发现更新值为null
这时候来看看IDEA中输出的日志吧
因此,我在网上查阅了许多博主的相关文章以及方法,但是没有一个能够解决我的问题
突然我灵光一闪,有没有可能是因为fieldname的命名有关呢,于是乎我将实体类中的TableField的value项去掉,并将MetaObjectHandler实现类中的相应方法的fieldName都改为了驼峰式命名,然后居然就成功了!
修改后的实体类如下:
/** * 创建时间 */ @TableField(fill = FieldFill.INSERT) @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8") private LocalDateTime gmtCreate; /** * 修改时间 */ @TableField(fill = FieldFill.INSERT_UPDATE) @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8") private LocalDateTime gmtModified;
修改后的MetaObjectHandler实现类如下:
package edu.web.utils; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; import java.time.LocalDateTime; @Slf4j // 添加日志 @Component // 注入Spring容器中 public class MyMetaObjectHandler implements MetaObjectHandler { /** * 插入时的填充策略 * * @param metaObject */ @Override public void insertFill(MetaObject metaObject) { // 添加日志 log.info("start insert fill............"); /** * String fieldName: 需要插入的字段 * Object fieldVal: 需要插入的类型 * MetaObject metaObject: 需要给哪个数据处理 */ this.strictInsertFill(metaObject, "gmtCreate", LocalDateTime.class, LocalDateTime.now()); this.strictUpdateFill(metaObject, "gmtModified", LocalDateTime.class, LocalDateTime.now()); } /** * 更新时的填充策略 * * @param metaObject */ @Override public void updateFill(MetaObject metaObject) { log.info("end update fill............"); /** * 更新的时候需要更新的字段 */ this.strictUpdateFill(metaObject, "gmtModified", LocalDateTime.class, LocalDateTime.now()); } }
加载全部内容