使用mybatisplus中遇到的小问题

147 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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里找到答案,不禁感到框架的强大之处,给我们提供了太多方便。在使用的同时也好奇这一个个功能是怎么实现的,有空真的得去看看源代码,多向大神学习。