源码:
https://github.com/nieandsun/mongstudy
- 我觉得我现在应该是我们组里mongo用的最菜的,因此打算系统的学习一下mongo!!!
1.简介
java里会用BigDecimal类型来表示精度要求较高的数字,而mongo从3.4开始也有了一个表示高精度数字的类型即Decimal128;但是两者之间不能直接进行转换.
描述一下现象,大家可以自己亲手试一下:
- 如果java对象里有BigDecimal类型的变量,直接存到mongo,在mongo里的类型将变为String类型
- java可以将mongo里为String类型的数字读成BigDecimal类型.
这样一看,BigDecimal和Decimal128的转换貌似成了鸡肋.其实并非如此,举个最简单的栗子,在做查询时,如果查某两个数之间满足条件的数据,字符串的比较和数字的比较就会变得不同.
2.Demo
- 实体类
package com.nrsc.mongostudy.domain;
import lombok.Data;
import org.springframework.data.annotation.Id;
import java.math.BigDecimal;
@Data
public class Book {
@Id
private String id;
/**书名*/
private String name;
/** 价格*/
private BigDecimal price;
/**简介*/
private String info;
/**出版社*/
private String publish;
@Override
public String toString() {
return "Book{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", price=" + price +
", info='" + info + '\'' +
", publish='" + publish + '\'' +
'}';
}
}
- BigDecimalToDecimal128Converter
package com.nrsc.mongostudy.convert;
import org.bson.types.Decimal128;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.convert.WritingConverter;
import java.math.BigDecimal;
/**
* java-->mongo 即BigDecimal变为Decimal128的转换器
*/
@WritingConverter//告诉spring往数据库写的时候用这个转换
public class BigDecimalToDecimal128Converter implements Converter<BigDecimal, Decimal128> {
@Override
public Decimal128 convert(BigDecimal bigDecimal) {
return new Decimal128(bigDecimal);
}
}
- Decimal128ToBigDecimalConverter
package com.nrsc.mongostudy.convert;
import org.bson.types.Decimal128;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.convert.ReadingConverter;
import java.math.BigDecimal;
/**
* mongo--->java 即Decimal128变为BigDecimal的转换器
*/
@ReadingConverter //告诉spring从数据库读的时候用这个转换
public class Decimal128ToBigDecimalConverter implements Converter<Decimal128, BigDecimal> {
@Override
public BigDecimal convert(Decimal128 decimal128) {
return decimal128.bigDecimalValue();
}
}
- MongoCustomConversions
package com.nrsc.mongostudy.config;
import com.nrsc.mongostudy.convert.BigDecimalToDecimal128Converter;
import com.nrsc.mongostudy.convert.Decimal128ToBigDecimalConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
import java.util.ArrayList;
import java.util.List;
@Configuration
public class MongoConvertConfig {
/**
* mongoCustomConversions会由spring进行管理,
* 按照加入的转换器,在数据库读写时对数据类型进行转换
*
* @return
*/
@Bean
public MongoCustomConversions mongoCustomConversions() {
List<Converter<?, ?>> converterList = new ArrayList<>();
converterList.add(new BigDecimalToDecimal128Converter());
converterList.add(new Decimal128ToBigDecimalConverter());
return new MongoCustomConversions(converterList);
}
}
- 测试类
package com.nrsc.mongostudy;
import com.nrsc.mongostudy.domain.Book;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import java.math.BigDecimal;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest
public class MongostudyApplicationTests {
@Autowired
private MongoTemplate mongoTemplate;
@Test
public void testSave() {
Book book = new Book();
//id不写mongo会自动生成_id,如果写了会用我们自己写的
//book.setId("3");
book.setName("新华字典");
book.setInfo("好书啊");
//注意如果用new BigDecimal(22.9900001)无法完成转换---异常有兴趣的可以自己看一下
book.setPrice(BigDecimal.valueOf(22.9900001));
book.setPublish("新华出版社");
mongoTemplate.save(book);
}
@Test
public void testQueryAll() {
List<Book> all = mongoTemplate.findAll(Book.class);
System.err.println(all);
}
}
3.结果展示
- 运行完testSave可以在数据库里看到如下结果
- 运行完testQueryAll可以在控制台看到如下结果:
版权声明:本文为nrsc272420199原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。