- 内容提要
- 序
- 前言
- 第一部分 背景知识
- 第 1 章 Spring Data 项目
- 第 2 章 Repository:便利的数据访问层
- 第 3 章 使用 Querydsl 实现类型安全的查询
- 第二部分 关系型数据库
- 第 4 章 JPA Repository
- 第 5 章 借助 Querydsl SQL 实现类型安全的 JDBC 编程
- 第三部分 NoSQL
- 第 6 章 MongoDB: 文档存储
- 第 7 章 Neo4j:图数据库
- 第 8 章 Redis:键/值存储
- 第四部分 快速应用开发
- 第 9 章 使用 Spring Roo 实现持久层
- 第 10 章 REST Repository 导出器
- 第五部分 大数据
- 第 11 章 Spring for Apache Hadoop
- 第 12 章 使用 Hadoop 分析数据
- 第 13 章 使用 Spring Batch 和 Spring Integration 创建大数据管道
- 第六部分 数据网格
- 第 14 章 分布式数据网格:GemFire
- 关于封面
6.4 MongoTemplate
现在基本设施已经就绪,我们也掌握了对象映射与配置的方法,接下来继续探讨与存储进行交互的 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 实现
这里有一个使用 @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(…) 经过转换后的查询对象
在 6.3.4 小节“实现自定义转换器”中,针对 EmailAddress 类我们使用了自定义的转换器,所以字段键被正确地转换成了 Email,而值对象也是正确的内联格式。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论