Spring Data MongoDB

文档数据库适合处理没什么关联关系的独立实体

Spring Data MongoDB 提供了三种方式在 Spring 应用中使用 MongoDB:

  • 通过注解实现对象-文档映射;
  • 使用 MongoTemplate 实现基于模板的数据库访问;
  • 自动化的运行时 Repository 生成功能。

1 启用 MongoDB

@EnableMongoRepositories 注解启用 MongoDB

1.1 方法一

MongoFactoryBean、MongoTemplate

@Configuration
@EnableMongoRepositories(basePackages="orders.db")//Enable MongoDB repositories
public class MongoConfig {
//MongoClient bean
@Bean
public MongoFactoryBean mongo() {
MongoFactoryBean mongo = new MongoFactoryBean();
mongo.setHost("localhost");
return mongo;
}
//MongoTemplate bean
@Bean
public MongoOperations mongoTemplate(Mongo mongo) {
return new MongoTemplate(mongo, "OrdersDB");
}
}

1.2 方法二

配置类扩展 AbstractMongoConfiguration 并重载 getDatabaseName() 和 mongo() 方法。

@Configuration
@EnableMongoRepositories("orders.db")
public class MongoConfig extends AbstractMongoConfiguration {
@Override
protected String getDatabaseName() {
return "OrdersDB";
}
@Override
public Mongo mongo() throws Exception {
//认证
MongoCredential credential =
MongoCredential.createMongoCRCredential(
env.getProperty("mongo.username"),
"OrdersDB",
env.getProperty("mongo.password").toCharArray());
return new MongoClient(
new ServerAddress("localhost", 37017),
Arrays.asList(credential));
//无需认证
return new MongoClient("mongodbserver", 27017);
}
}

2 注解 MongoDB 持久化

Spring Data MongoDB 提供了一些将 Java 类型映射为 MongoDB 文档的注解。

注解 描述
@Document 标示映射到 MongoDB 文档上的领域对象
@Id 标示某个域为ID域
@DbRef 标示某个域要引用其他的文档, 这个文档有可能位于另外一个数据库中
@Field 为文档域指定自定义的元数据
@Version 标示某个属性用作版本域
@Document
public class Order {
@Id
private String id;

@Field("client")
private String customer;

private Collection<Item> items = new LinkedHashSet<Item>();
...
}

3 使用 MongoTemplate 访问 MongoDB

MongoOperations 是 MongoTemplate 所实现的接口, 不使用具体实现是一个好的做法, 尤其是在注入的时候

@Autowired
MongoOperations mongo;

long orderCount = mongo.getCollection("order").count();

Order order = new Order();
... // set properties and add line items
mongo.save(order, "order");

String orderId = ...;
Order order = mongo.findById(orderId, Order.class);

List<Order> chucksOrders = mongo.find(Query.query(
Criteria.where("client").is("Chuck Wagon")), Order.class);

List<Order> chucksWebOrders = mongo.find(Query.query(
Criteria.where("customer").is("Chuck Wagon")
.and("type").is("WEB")), Order.class);

mongo.remove(order);

4 编写 MongoDB Repository

扩展 MongoRepository。任何扩展 Repository 的接口将会在运行时自动生成实现。

MongoRepository 接口有两个参数, 第一个是带有 @Document 注解的对象类型, 也就是该 Repository 要处理的类型。 第二个参数是带有 @Id 注解的属性类型。

public interface OrderRepository extends MongoRepository<Order, String> {
}
Author: iMine
Link: https://imine141.github.io/2020/07/18/Spring/Data/Spring%20Data%20MongoDB/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.