【Spring Data Mongo 类型转换器】java 日期类如何转换为指定的 Mongo 格式

Spring 使用 mongo 系列

第三章 Spring Data mongo 使用之 类型转换器的使用



🌈 前言

在使用 Spring Data Mongo 时,发现日期类存储到 Mongo 中时,格式为 2022-11-11T13:54:12.086+0000
而我们日常使用的格式为 2022-11-11 13:54:12


1️⃣ 如何添加自定义Mongo类型转换器

👉 编写自定义类型转换器

即 将 Mongo 中的数据类型转换为 Java 数据类型

@ReadingConverter
public class StringToDateConverter implements Converter<String,Date> {
    @Override
    public Date convert(String source) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            return format.parse(source);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }
}

即 将 Java 数据类型转换为 Mongo 中的数据类型

@WritingConverter
public class DateToStringConverter implements Converter<Date,String> {
    @Override
    public String convert(Date source) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return format.format(source);
    }
}

👉 配置自定义类型转换器

    /**
     * Mongo 自定义转换器集合
     * @return mongo 自定义转换器集合
     */
    @Bean
    public MongoCustomConversions mongoCustomConversions(){
        List<Converter<?, ?>> converters = new ArrayList<>();
        // String -> Date 转换器
        converters.add(new StringToDateConverter());
        // Date -> String 转换器
        converters.add(new DateToStringConverter());
        return new MongoCustomConversions(converters);
    }

👉 测试插入数据

实体类

@Document("person")
public class Person {

    private String name;
    private Integer age;
    @Indexed(unique = true)
    private String idNumber;

    @CreatedDate
    private Date addDate;

    public Person(String name, Integer age, String idNumber) {
        this.name = name;
        this.age = age;
        this.idNumber = idNumber;
    }
	// 省略 get/set 方法
}

测试代码

    /**
     * 用于测试: insert
     */
    @Test
    public void test_insert() {
        Person entity = new Person("王五", 20, "123321200201011113");

        Person person = personRepository.save(entity);
        logger.info("测试结果: {}", JSON.toJSONString(person));

    }

执行结果

2022-11-11 22:05:33.390  INFO 38799 [main] com.tu.mongodb.test.TestApi: 测试结果: {"addDate":1668175533237,"age":20,"idNumber":"123321200201011113","name":"王五"}

在这里插入图片描述

我们查看结果,发下 addDate字段的值已经成为 yyyy-MM-dd HH:mm:ss格式了
1. 但是发现,我们插入数据之前并没有设置 addDate 的值,为什么数据库中又生成了呢,这得益于 Spring Data 的注解 @CreateDate 它可以在插入时生成当前时间值。但是只添加该注解是不生效的,需要在配置类中添加注解 @EnableMongoAuditing , demo 代码可以在文末链接中进行查看


总结

这一章,主要了解到了 Java 数据类型与 Mongo 对应的数据类型之间如何自定义转换,也接触到了 Spring Data 中的字段填充功能 @CreateDate ,而 Spring Data 的这些强大功能都能极大的简化开发,对于 Spring Data 我们只需要编写实体类,例如文中的 Person 类,并添加对应的注解,然后编写持久层访问接口集成 Respository的子接口,这样就完成了基本的增删改查操作。但往往越简单的使用,就意味着内部的逻辑的复杂性。而 Spring 家族的 Spring Ioc 容器 也是只需要配置 Xml 或者使用 @Bean 注解,之后使用 @Autowired Spring 就可以将复杂的类的依赖关系解决掉。


demo地址:demo 地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值