数据库新建两个时间字段
Blog实体类(部分属性)
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@TableName("kss_blog")
public class Blog implements java.io.Serializable {
// 主键
@TableId(type = IdType.AUTO)
private Integer id;
// 内容标题
private String title;
//内容描述
private String description;
// 分类id
private Integer categoryId;
// 分类名称
private String categoryTitle;
// 创建时间
@TableField(fill = FieldFill.INSERT)
private Date createTime;
// 更新时间
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}
创建MeatObjectHandler类
方式一:当实体类创建时间和修改时间的修饰符为Date,就使用下面这个配置类
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill ....");
this.setFieldValByName("create_time", new Date(), metaObject);
this.setFieldValByName("update_time", new Date(), metaObject);
//第一个字段可以是数据库的字段,也可以是实体类的字段
//this.setFieldValByName("createTime", new Date(), metaObject);
// this.setFieldValByName("updateTime", new Date(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ....");
//第一个字段可以是数据库的字段,也可以是实体类的字段
this.setFieldValByName("update_time", new Date(), metaObject)
//this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
方式二:当实体类创建时间和修改时间的修饰符为LocalDateTime,就使用下面这个配置类
实体类属性:
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
// 更新时间
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
配置类(根据自己的版本号自己选择)
/**
* @Auther: liang
* @Date: 2021/11/24 20:00
* @Description:
*/
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill ....");
// this.setFieldValByName("createTime", new Date(), metaObject);
// this.setFieldValByName("updateTime", new Date(), metaObject);
// this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐使用)
// 或者
this.strictInsertFill(metaObject, "createTime", () -> LocalDateTime.now(), LocalDateTime.class); // 起始版本 3.3.3(推荐)
this.strictUpdateFill(metaObject, "updateTime", () -> LocalDateTime.now(), LocalDateTime.class); // 起始版本 3.3.3(推荐)
// 或者
// this.fillStrategy(metaObject, "createTime", LocalDateTime.now()); // 也可以使用(3.3.0 该方法有bug)
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ....");
// this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐)
// 或者
this.strictUpdateFill(metaObject, "updateTime", () -> LocalDateTime.now(), LocalDateTime.class); // 起始版本 3.3.3(推荐)
// 或者
// this.fillStrategy(metaObject, "updateTime", LocalDateTime.now()); // 也可以使用(3.3.0 该方法有bug)
}
}
如果时间的修饰符和配置类用错,就会报一下错误:
2021-11-24 21:25:56.003 ERROR 41244 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in
context with path [] threw exception [Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException:
Could not set property 'createTime' of 'class com.neutech.ksswebproject.eneity.Blog'
with value 'Wed Nov 24 21:25:56 CST 2021' Cause: java.lang.IllegalArgumentException: argument type mismatch] with root cause
这是因为date和localdate不同修饰符修饰创建时间和修改时间的问题。
以上内容属于个人笔记整理,如有错误,欢迎批评指正!