Spring4.0 学习(第五天)------- NoSQL--------使用MongoDB持久化文档数据

MongoDB是最为流行的开源文档数据库之一。Spring Data MongoDB提供了三种方式在Spring应用中使用MongoDB

1. 通过注解实现对象-文档映射;

2. 使用MongoTemplate实现基于模板的数据库访问;

3. 自动化的运行时Repository生成功能。

Spring Data JPA不同的是,Spring Data MongoDB提供了将Java对象映射为文档的功能。(Spring Data JPA没有必要为JPA提供这样的注解,因为JPA规范本身就提供了对象-关系映射注解)。除此之外,Spring Data MongoDB为通用的文档操作任务提供了基于模板的数据访问方式。

启用MongoDB

为了有效地使用Spring Data MongoDB,我们需要在Spring配置中添加几个必要的bean。首先,我们需要配置MongoClient,以便于访问MongoDB数据库。同时,我们还需要有一个MongoTemplate bean,实现基于模板的数据库访问。此外,不是必须,但是强烈推荐启用 Spring Data MongoDB的自动化Repository生成功能。

我们通过@EnableJpaRepositories注解,启用了Spring Data的自动化JPA Repository生成功能。与之类似,@EnableMongoRepositories为MongoDB实现了相同的功能。 除了@EnableMongoRepositories之外,程序清单12.1中还包含了两个带有@Bean注解的方法。第一个@Bean方法使MongoFactoryBean声明了一个Mongo实例。这个beanSpring Data MongoDB与数据库本身连接了起来(与使用关系型数据时 DataSource所做的事情并没有什么区别)。尽管我们可以使用MongoClient直接创建Mongo实例,但如果这样做的话,就必须要处MongoClient构造器所抛出的UnknownHostException异常。在这里,使用Spring Data MongoDBMongoFactoryBean更加简单。

因为它是一个工厂bean,因此MongoFactoryBean会负责构建Mongo实例,我们不必再担心UnknownHostException异常。另外一个@Bean方法声明了MongoTemplate bean,在它构造时,使用了其他@Bean方法所创建的Mongo实例的引用以及数据库的名称。 稍后,你将会看到如何使用MongoTemplate来查询数据库。即便不直接使用MongoTemplate,我们也会需要这个bean,因为Repository自动化生成功能在底层使用了它。

除了直接声明这些bean,我们还可以让配置类扩展AbstractMongo-Configuration并重载getDatabaseName()mongo()方法。如下的程序清单展现了如何使用这种配置方式。

这个配置中没有直接声明MongoTemplate bean,当然它还是会被隐式地创建。我们在这里重载了getDatabaseName()方法来提供数据库的名称。mongo()方法依然会创建一 MongoClient的实例,因为它会抛出Exception,所以我们可以直接使用MongoClient,而不必再使用MongoFactoryBean了。

只要MongoDB服务器运行在本地即可。如果MongoDB服务器运行在其他的机器上,那么可以在创建MongoClient的时候进行指定: 另外,MongoDB服务器有可能监听的端口并不是默认的27017。如果是这样的话,在创建MongoClient的时候,还需要指定端口:

 

为了访问需要认证的MongoDB服务器,MongoClient在实例化的时候必须要有一个MongoCredential的列表。在程序清单12.3中,我们为此创建了一个MongoCredential。为了将凭证信息的细节放在配置类外边,它们是通过注入的Environment对象解析得到的。

为模型添加注解,实现MongoDB持久化

      Spring Data MongoDB注解将Java类型映射为文档

    

      

Order类添加了@Document注解,这样它就能够借助MongoTemplate或自动生成的Repository进行持久化。其id属性上使用了@Id注解,用来指定它作为文档的ID。除此之外,customer属性上使用了@Field注解,这样的话,当文档持久化的时候customer性将会映射为名为client的域。

如我前面所述,文档可以与其他的文档产生关联,但这并不是文档数据库所擅长的功能。在本例购买订单与行条目之间的关联关系中,行条目只是同一个订单文档里面内嵌的一部分(如图12.1所示)。因此,没有必要为这种关联关系添加任何注解。实际上,Item类本身并没有任何注解:

使用MongoTemplate访问MongoDB

在这里我们将MongoTemplate注入到一个类型为MongoOperations的属性中。MongoOperationsMongoTemplate所实现的接口,不使用具体实现是一个好的做法,尤其是在注入的时候。 MongoOperations暴露了多个使用MongoDB文档数据库的方法。在这里,我们不可能讨论所有的方法,但是可以看一下最为常用的几个操作,比如计算文档集合中有多少条文档。

编写MongoDB Repository

我们已经通过@EnableMongoRepositories注解启用了Spring Data MongoDBRepository功能,接下来需要做的就是创建一个接口,Repository实现要基于这个接口来生成。不过,在这里,我们不再扩展JpaRepository,而是要扩展MongoRepository。如下程序清单中的OrderRepository扩展了MongoRepository,为Order文档提供了基本的CRUD操作。

MongoRepository接口有两个参数,第一个是带有@Document注解的对象类型,也就是该Repository要处理的类型。第二个参数是带有@Id注解的属性类型。尽管OrderRepository本身并没有定义任何方法,但是它会继承多个方法,包括对Order文档进行CRUD操作的方法。表12.2描述OrderRepository继承的所有方法。

12.2中的方法使用了传递进来和方法返回的泛型。OrderRepository扩展了MongoRepository<Order, String>,那么T就映射为OrderID映射为String,而S映射为所有扩展Order的类型。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值