一、使用mongodb
1. 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
2. 配置mongodb连接地址
# application.properties
spring.data.mongodb.uri=mongodb://{user}:{pwd}@{ip}:{port}/{db}
3. 实现转换器
比如,我们的model中使用了Money类型的属性,持久化到mongodb中就是money类型的json,从mongo中取出来,要作相应转换。主要是指一些,框架处理不了的类型转换,需要写转换器。
package com.example.mongodb;
import org.bson.Document;
import org.joda.money.CurrencyUnit;
import org.joda.money.Money;
import org.springframework.core.convert.converter.Converter;
public class MoneyReadConverter implements Converter<Document, Money> {
@Override
public Money convert(Document source) {
Document moneyDocument = (Document) source.get("money");
Document currencyDocument = (Document) moneyDocument.get("currency");
double amount = Double.parseDouble(moneyDocument.getString("amount"));
return Money.of(CurrencyUnit.of(currencyDocument.getString("code")), amount);
}
}
实例化bean
@Bean
public MongoCustomConversions mongoCustomConversions() {
return new MongoCustomConversions(Arrays.asList(new MoneyReadConverter()));
}
4. 使用MongoRepository
使用 MongoRepository 要继承 org.springframework.data.mongodb.repository.MongoRepository<T, ID> 接口,其中 T 是实体类型, ID 是主键的类型。
package com.example.mongodb;
import java.util.List;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface CoffeeRepository extends MongoRepository<Coffee, String> {
List<Coffee> findByName(String name);
}
5. 调用
主要使用 MongoTemplate 和 MongoRepository
package com.example.mongodb;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import org.joda.money.CurrencyUnit;
import org.joda.money.Money;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import lombok.extern.slf4j.Slf4j;
@SpringBootApplication
@Slf4j
public class Application implements CommandLineRunner {
@Autowired
private MongoTemplate mongoTemplate;
@Autowired
private CoffeeRepository coffeeRepository;
@Bean
public MongoCustomConversions mongoCustomConversions() {
return new MongoCustomConversions(Arrays.asList(new MoneyReadConverter()));
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
public void run(String... args) throws Exception {
// mongoTemplate();
Coffee coffee = new Coffee().setName("latte").setPrice(Money.of(CurrencyUnit.of("CNY"), 12))
.setCreateTime(new Date()).setUpdateTime(new Date());
Coffee coffee2 = new Coffee().setName("latte red").setPrice(Money.of(CurrencyUnit.of("CNY"), 15))
.setCreateTime(new Date()).setUpdateTime(new Date());
List<Coffee> insert = coffeeRepository.insert(Arrays.asList(coffee, coffee2));
log.info("insert: {}", insert);
Thread.sleep(1000);
coffee2.setPrice(Money.of(CurrencyUnit.of("CNY"), 35.0));
coffee2.setUpdateTime(new Date());
Coffee saveOrUpdate = coffeeRepository.save(coffee2);
log.info("saveOrUpdate: {}", saveOrUpdate);
coffeeRepository.deleteAll();
}
private void mongoTemplate() throws InterruptedException {
Coffee coffee = new Coffee().setName("espresso").setPrice(Money.of(CurrencyUnit.of("CNY"), 12))
.setCreateTime(new Date()).setUpdateTime(new Date());
Coffee savedCoffee = mongoTemplate.save(coffee);
log.info("savedCoffee: {}", savedCoffee);
List<Coffee> find = mongoTemplate.find(Query.query(Criteria.where("name").is("espresso")), Coffee.class);
log.info("find: {}", find);
Thread.sleep(1000);
UpdateResult updateFirst = mongoTemplate.updateFirst(Query.query(Criteria.where("name").is("espresso")),
new Update().set("price", Money.of(CurrencyUnit.of("CNY"), 20)).currentDate("updateTime"), Coffee.class);
Coffee findOne = mongoTemplate.findById(savedCoffee.getId(), Coffee.class);
log.info("updateFirst: {}, findOne: {}", updateFirst, findOne);
DeleteResult remove = mongoTemplate.remove(findOne);
log.info("remove: {}", remove);
}
}