- 内容提要
- 序
- 前言
- 第一部分 背景知识
- 第 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
- 关于封面
2.1 快速入门
我们选取领域模型中的 Customer 领域类,它会被持久化到任意的存储之中。这个类应该如示例 2-1 所示。
示例 2-1 Customer 领域类
传统的实现数据访问层的方式至少需要实现一个存储类(repository class),这个类会包含基本的 CRUD(Create、Read、Update 与 Delete)方法以及通过限制条件来访问实体子集的查询方法。Spring Data Repository 的方式能够避免大多数的代码,只需为这个实体存储声明简单的接口定义即可,如示例 2-2 所示。
示例 2-2 CustomerRepository 接口定义
正如你所见,我们扩展了 Spring Data 的 Repository 接口,它是通用的标识接口。它的主要职责是让 Spring Data 的基础设施识别出所有用户定义的 Spring Data Repository。除此之外,它还会捕获托管的领域类以及实体的 ID 类型,稍后这些功能会提供很大的便利性。为了能够自动发现所声明的接口,可以使用存储特定的 XML 命名空间中的<repositories />元素(如示例 2-3 所示),或是在使用 JavaConfig 时借助相关的 @Enable...Repositories 注解(如示例 2-4 所示)。在示例中会使用 JPA。我们只需将 XML 元素的 base-package 属性配置为我们的根包(root package),Spring Data 会扫描它来查找 Repository 接口。如果没有给出更进一步的配置,那么它只会简单地检查包中带有注解的类。
示例 2-3 使用 XML 激活 Spring Data Repository
示例 2-4 使用 Java Config 激活 Spring Data Repository
XML 和 JavaConfig 配置都需要添加存储专用的 Bean 声明来进行完善,如 JPA 的 EntityManagerFactory 以及 DataSource 等。对于其他形式的存储,我们只需使用对应的命名空间元素或注解即可。例如,示例 2-5 所示的配置片段,将会找到 Spring Data Repository 并创建 Spring Bean,这些 Bean 实际上是由一组实现了所发现接口的代理所组成的。因此,现在可以继续编写客户端,通过 Spring 的自动装配就能访问这个 Bean 了。
CustomerRepository 接口建立之后,我们就可以继续深入学习并添加一些易于声明的查询方法。常见的需求是通过电子邮件地址来获取 Customer。为了做到这一点,我们添加合适的查询方法,如示例 2-6 所示。
示例 2-5 客户端使用 Spring Data Repository
示例 2-6 声明查询方法
命名空间元素将会在容器启动的时候扫描到这个接口并触发 Spring Data 的基础设施为其创建 Spring Bean。基础设施会探查接口中声明的方法并确定方法调用时要执行的查询。如果只是这样简单地定义方法的话,那么 Spring Data 将会根据其名字衍生出一个查询。在定义查询方面还有其他的途径可选,可以阅读 2.2 小节“定义查询方法”来了解更多信息。
在示例 2-6 中,由于我们遵循了领域对象属性的命名约定,因而查询可以衍生得到。查询方法名中的 EmailAddress 部分其实就对应了 Customer 类的 emailAddress 属性,因此,在使用 JPA 模块时,Spring Data 会自动为声明的方法衍生出 select C from Customer c where c.emailAddress = ?1。它还会检查方法声明中属性引用的合法性,如果发现任何错误则会在容器启动时,出现启动失败。现在,客户端可以很容易地执行这个方法,给定的方法参数会绑定到根据方法名衍生出来的查询之中并且执行该查询,如示例 2-7 所示。
示例 2-7 执行查询方法
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论