《Spring Data实战》——第2章 Repository:便利的数据访问层 2.1快速入门

简介: 长期以来,实现应用程序的数据访问层一直是件繁琐的工作,因为我们经常需要编写大量的样板式代码,而且贫血(anemic)的领域类并没有按照真正面向对象或领域驱动方式来进行设计。因此Spring Data Repository抽象的目标就是大幅简化各种持久化存储持久层的实现。

本节书摘来自异步社区《Spring Data实战》一书中的第2章,第2.1节,作者: 【美】Mark Pollack , Oliver Gierke , Thomas Risberg , Jon Brisbin , Michael Hunger著,更多章节内容可以访问云栖社区“异步社区”公众号查看

第2章 Repository:便利的数据访问层

长期以来,实现应用程序的数据访问层一直是件繁琐的工作,因为我们经常需要编写大量的样板式代码,而且贫血(anemic)的领域类并没有按照真正面向对象或领域驱动方式来进行设计。因此Spring Data Repository抽象的目标就是大幅简化各种持久化存储持久层的实现。我们将会使用Spring Data JPA模块作为例子来讨论Repository抽象的基本理念。对于其他类型的存储,可以参考对应的例子。

2.1 快速入门

我们选取领域模型中的Customer领域类,它会被持久化到任意的存储之中。这个类应该如示例2-1所示。

示例2-1 Customer领域类

screenshot

传统的实现数据访问层的方式至少需要实现一个存储类(repository class),这个类会包含基本的CRUD(Create、Read、Update与Delete)方法以及通过限制条件来访问实体子集的查询方法。Spring Data Repository的方式能够避免大多数的代码,只需为这个实体存储声明简单的接口定义即可,如示例2-2所示。

示例2-2 CustomerRepository接口定义

screenshot

正如你所见,我们扩展了Spring Data的Repository接口,它是通用的标识接口。它的主要职责是让Spring Data的基础设施识别出所有用户定义的Spring Data Repository。除此之外,它还会捕获托管的领域类以及实体的ID类型,稍后这些功能会提供很大的便利性。为了能够自动发现所声明的接口,可以使用存储特定的XML命名空间中的元素(如示例2-3所示),或是在使用JavaConfig时借助相关的@Enable...Repositories注解(如示例2-4所示)。在示例中会使用JPA。我们只需将XML元素的base-package属性配置为我们的根包(root package),Spring Data会扫描它来查找Repository接口。如果没有给出更进一步的配置,那么它只会简单地检查包中带有注解的类。

示例2-3 使用XML激活Spring Data Repository

screenshot

示例2-4 使用Java Config激活Spring Data Repository

screenshot

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

screenshot

示例2-6 声明查询方法

screenshot

命名空间元素将会在容器启动的时候扫描到这个接口并触发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 执行查询方法

screenshot

相关文章
|
24天前
|
XML Java 数据库连接
spring boot 参数的过滤注解与实战
在Spring Boot应用中,对于入参的过滤,通常会涉及到对Web层的数据验证和处理。Spring Boot借助Spring框架提供了强大的验证框架支持,主要基于JSR-303/JSR-380(Bean Validation API)规范,以及Spring自身的@Valid或@Validated注解来实现请求参数的验证。以下是一些常见的使用案例来展示如何对参数进行过滤和验证。
24 1
|
17天前
|
安全 Java 数据安全/隐私保护
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
40 1
|
17天前
|
存储 XML 缓存
【深入浅出Spring原理及实战】「缓存Cache开发系列」带你深入分析Spring所提供的缓存Cache功能的开发实战指南(一)
【深入浅出Spring原理及实战】「缓存Cache开发系列」带你深入分析Spring所提供的缓存Cache功能的开发实战指南
40 0
|
3天前
|
数据采集 前端开发 Java
数据塑造:Spring MVC中@ModelAttribute的高级数据预处理技巧
数据塑造:Spring MVC中@ModelAttribute的高级数据预处理技巧
18 3
|
3天前
|
前端开发 Java Spring
数据之桥:深入Spring MVC中传递数据给视图的实用指南
数据之桥:深入Spring MVC中传递数据给视图的实用指南
19 3
|
3天前
|
Java 数据库 Spring
切面编程的艺术:Spring动态代理解析与实战
切面编程的艺术:Spring动态代理解析与实战
19 0
切面编程的艺术:Spring动态代理解析与实战
|
24天前
|
存储 缓存 安全
Spring Boot从入门到实战
本课程从SpringBoot的最基础的安装、配置开始到SpringBoot的日志管理、Web业务开发、数据存储、数据缓存,安全控制及相关企业级应用,全程案例贯穿,案例每一步的都会讲解实现思路,全程手敲代码实现。让你不仅能够掌SpringBoot的应用,还能了解背后的原理,学习完本课程后,能够让你动手独立完成一个中小型的SpringBoot Web应用开发。
17 1
Spring Boot从入门到实战
|
27天前
|
Java 数据库连接 数据库
Spring Boot整合MyBatis Plus集成多数据源轻松实现数据读写分离
Spring Boot整合MyBatis Plus集成多数据源轻松实现数据读写分离
26 2
|
1月前
|
Java 数据库 Spring
如何使用Spring Data JPA完成审计功能
如何使用Spring Data JPA完成审计功能
|
1月前
|
XML Java 数据库
【二十四】springboot整合spring事务详解以及实战
【二十四】springboot整合spring事务详解以及实战
91 0