持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情
背景 最近公司产品重构,重构的重要的点是从Hibernate迁移到Mybatis,并使用了MybatisPlus来增强它,在写的过程中的确感觉方便了一些。但是由于长时间没有用到过MybatisPlus了,还是遇到了一些问题,不过由于文档和社区活跃很快就解决问题了,这里简单记录下。 解决问题
关于LocalDateTime
之前项目中不管是数据库Entity还是接口参数中时间类型均使用的是Date类型,但是现在已经Java17了,我们在Java8中就推荐使用LocalDateTime来代替Date了,所以既然是重构,那就辞旧迎新,全面使用LocalDateTime。但是在使用过程中我们发现转json数据时的时间格式不对。经过参考资料,原来是要做配置,加上!
@Configuration
public class LocalDateTimeSerializerConfig {
private static final String DATE_TIME_PATTEN = "yyyy-MM-dd HH:mm:ss";
private static final String DATA_PATTEN = "yyyy-MM-dd";
/**
* String 转 LocalDate
*
* @return
*/
@Bean
public Converter<String, LocalDate> localDateConverter() {
return new Converter<String, LocalDate>() {
@Override
public LocalDate convert(String s) {
if (StringUtils.isEmpty(s)) {
return null;
} else {
return LocalDate.parse(s, DateTimeFormatter.ofPattern(DATA_PATTEN));
}
}
};
}
/**
* String 转 LocalDateTime
*
* @return
*/
@Bean
public Converter<String, LocalDateTime> localDateTimeConverter() {
return new Converter<String, LocalDateTime>() {
@Override
public LocalDateTime convert(String s) {
if (StringUtils.isEmpty(s)) {
return null;
} else {
return LocalDateTime.parse(s, DateTimeFormatter.ofPattern(DATE_TIME_PATTEN));
}
}
};
}
/**
* 统一配置
*
* @return
*/
@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
JavaTimeModule module = new JavaTimeModule();
LocalDateTimeDeserializer localDateTimeDeserializer = new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DATE_TIME_PATTEN));
module.addDeserializer(LocalDateTime.class, localDateTimeDeserializer);
return builder -> {
builder.simpleDateFormat(DATE_TIME_PATTEN);
builder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern(DATA_PATTEN)));
builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATE_TIME_PATTEN)));
builder.modules(module);
};
}
}
自动填充字段
这次重构数据模型也重新设计,为了增加严谨性,在设计模型时所有表都加上了创建者、创建时间、修改者、修改时间,但是如果每次新增修改数据都去硬编码设置,那就太冗余了,而且代码难看。那有没有统一的自动填充的方法了,不得不感叹,你能想到了别人都想到了,MybaitsPlus可以做。 首先得在对应得实体上加上
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
然后也要做配置
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
/**
* 插入时的填充策略
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime", LocalDateTime.now(), metaObject);
this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
}
}
动态更新
Orm一直存在的一个问题就是空值的更新问题,因为更新的时候往往要传入的是一个对象,对象中的某个字段在此次更新中是不需要更新的,但是传参的时候可能传了个null或者"",这个时候原本希望是不去更新这个字段,而不是将该字段更新为null或者""。
解决的方法MybatisPlus也为你做到了,即使用
@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
真的好用!
总结 Mybatis很强,而MybatisPlus使他更强了,感觉开发中常见的业务场景和问题都能在MybatisPlus里找到答案,不禁感到框架的强大之处,给我们提供了太多方便。在使用的同时也好奇这一个个功能是怎么实现的,有空真的得去看看源代码,多向大神学习。