文档数据库适合处理没什么关联关系的独立实体
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> {
}