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 地址