返回介绍

6.4 MongoTemplate

发布于 2025-04-22 19:57:19 字数 2541 浏览 0 评论 0 收藏

现在基本设施已经就绪,我们也掌握了对象映射与配置的方法,接下来继续探讨与存储进行交互的 API。正如其他 Spring Data 模块一样,核心 API 是 MongoOperations 接口,这个接口的实现是 MongoTemplate。在 Spring 中,模板实现有两个主要的目的:资源管理和异常转换。这就意味着 MongoTemplate 会通过已配置的 MongoDbFactory 取得连接,并且在与存储交互完成或者发生异常时正确地完成清理工作。由 MongoDB 抛出的异常会被显式地转换成 Spring DataAccessException 异常等级中的类,这样就能够避免用户端必须要了解所使用的持久化技术。

我们继续以 CustomerRepository 接口的存储实现来说明 API 的使用方法(见示例 6-32)。它名为 MongoDbCustomerRepository,位于 com.oreilly.springdata.mongodb. core 包中。

示例 6-32 MongoDbCustomerRepository 实现

c0632-1

c0632-2

这里有一个使用 @Repository 注解的标准 Spring 组件,这样在扫描类路径时,这个类就能够被发现。增加 @Profile 注解以确保只有在所配置的 Spring Profile 启动时,它才会被激活。这可以避免该类侵入到默认的 Bean 设置中,稍后介绍 MongoDB 的 Spring Data Repository 时将会用到。

这个类唯一的依赖关系是 MongoOperations,它是 MongoTemplate 的接口,在应用上下文中已经将它设置好了(见 application-context.xml 或 ApplicationConfig 类[示例 6-12])。MongoTemplate 提供两类可用方法。

  • 通用、高层次的方法只用一行语句就能执行常见的操作。它包含基本的方法如 findOne(…)、findAll(…)、save(…) 和 delete(…);还包括 MongoDB 特有的方法,如 updateFirst(…)、updateMulti(…) 和 upsert(…),除此之外,还有 map-reduce 和地理空间相关的操作,如 mapReduce(…) 和 geoNear(…)。以上所有方法会自动应用 6.3 小节“映射模块”所介绍的对象-存储映射。
  • 低层次、回调驱动的方法允许在高层次操作的功能无法满足需求时与 MongoDB 驱动 API 进行交互。这些方法以 execute 开头并且使用 Collection Callback(提供对 MongoDb DbCollection 的访问)、DbCallback(提供对 MongoDB DB 的访问)或者 DocumentCa llbackHandler(直接处理 DBObject)。

使用高层次 API 的最简单例子就是 MongoDbCustomerRepository 的 save(…) 方法。只需使用 MongoOperations 接口的 save(…) 方法并将 Customer 传给它处理,它会将领域对象转换成 MongoDB DBObject 并使用 MongoDB 驱动 API 对其进行保存。

实现中的其他两个方法 findOne(…) 和 findByEmailAddress(…),会使用 Spring Data MongoDB 提供的查询 API,从而简化访问 MongoDB 文档时所构建的查询。query(…) 方法实际上是 Query 类中所定义的静态工厂方法,我们在这个类声明的顶部导入了 Query 类。where(…) 方法也是一样,但它源自 Criteria。正如你所见,定义一个查询非常简单。同样的,这里有一些需要注意的事情。

在 findByEmailAddress(…) 中,引用了 Customer 类的 emailAddress 属性。由于它已经通过 @Filed 注解映射到 email 键,属性引用将会自动地转换到正确的字段引用。并且我们将普通的 EmailAddress 对象传递到条件中以建立相等的断言,在真正查询之前,映射模块会将它进行转换。其中也会包含为特定类型所注册的自定义转换器。因此,以 DBObject 表示的查询如示例 6-33 所示。

示例 6-33 findByEmailAddress(…) 经过转换后的查询对象

c0633

在 6.3.4 小节“实现自定义转换器”中,针对 EmailAddress 类我们使用了自定义的转换器,所以字段键被正确地转换成了 Email,而值对象也是正确的内联格式。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。