Spring Data MongoDB提供了三种方式在Spring应用中使用MongoDB:
- 通过注解实现对象-文档映射;
- 使用MongoTemplate实现基于模板的数据库访问;
- 自动化的运行时Repository生成功能。
1 Spring Data MongoDB提供了XML配置的方案
2 为模型添加注解,实现MongoDB持久化(对象-文档映射)
2.1 用于对象-文档映射的Spring Data MongoDB注解
2.2 Spring Data MongoDB注解将Java类型映射为文档
我们可以看到,Order类添加了@Document注解,这样它就能够借助MongoTemplate或自动生成的Repository进行持久化。其id属性上使用了@Id注解,用来指定它作为文档的 ID。除此之外,customer属性上使用了@Field注解,这样的话,当文档持久化的时候customer属性将会映射为名为client的域。
注意,其他的属性并没有添加注解。除非将属性设置为瞬时态(transient)的,否则Java对象中所有的域都会持久化为文档中的域。并且如果我们不使用@Field注解进行设置的话,那么文档域中的名字将会与对应的Java属性相同。
3 使用MongoTemplate访问MongoDB(基于模板的数据库访问)
我们已经在配置类中配置了MongoTemplate bean。接下来,需要做的就是将其注入到使用它的地方:
注意,在这里我们将MongoTemplate注入到一个类型为MongoOperations的属性中。MongoOperations是MongoTemplate所实现的接口,不使用具体实现是一个好的做法,尤其是在注入的时候。MongoOperations暴露了多个使用MongoDB文档数据库的方法。
增
void save(Object objectToSave, String collectionName);
删
WriteResult remove(Object object);
改
WriteResult updateFirst(Query query, Update update, String collectionName);
查
(1)根据id查询
<T> T findById(Object id, Class<T> entityClass);
(2)构造Query对象并将其传递给find()方法
<T> List<T> find(Query query, Class<T> entityClass);
使用Query类中的静态方法query()构造Query对象
public class Query {
public static Query query(CriteriaDefinition criteriaDefinition) {
return new Query(criteriaDefinition);
}
}
query方法传递一个Criteria对象,Criteria实现了CriteriaDefinition
public class Criteria implements CriteriaDefinition {
}
Criteria中的方法
通常来讲,我们会将MongoOperations注入到自己设计的Repository类中,并使用它的操作来实现Repository方法。但是,如果你不愿意编写Repository的话,那么Spring Data MongoDB能够自动在运行时生成Repository实现。
4 编写MongoDB Repository
任何扩展Repository的接口将会在运行时自动生成实现。
尽管OrderRepository本身并没有定义任何方法,但是它会继承多个方法,包括对Order 文档进行CRUD操作的方法。
4.1 MongoRepository自带的方法
4.2 添加自定义的查询方法
Spring Data JPA支持方法命名约定,它能够帮助Spring Data为遵循约定的方法自动生成实现。实际上,相同的约定也适用于Spring Data MongoDB。这意味着我们可以为OrderRepository添加自定义的方法:
这里我们有四个新的方法,每一个都是查找满足特定条件的Order对象。其中第一个用来获 取customer属性等于传入值的Order列表;第二个方法获取customer属性like传入值的Order列表;接下来方法会返回customer和type属性等于传入值的Order对象;最后一个方法与前一个类似,只不过customer在对比的时候使用的是like而不是equals。其中,find这个查询动词并不是固定的。如果喜欢的话,我们还可以使用get作为查询动词:
4.3 指定查询
@Query注解可以为Repository方法指定自定义的查询。@Query能够像在JPA中那样用在MongoDB上。唯一的区别在于针对MongoDB时,@Query会接受一个JSON查询,而不是JPA查询。例如,假设我们想要查询给定类型的订单,并且要求customer的名称为“ChuckWagon”。OrderRepository中如下的方法声明能够完成所需的任务:
@Query中给定的JSON将会与所有的Order文档进行匹配,并返回匹配的文档。需要注意的是,type属性映射成了“?0”,这表明type属性应该与查询方法的第零个参数相等。如果有多个参数的话,它们可以通过“?1”、“?2”等方式进行引用。