Skip to content

22. 结论

让我们回顾一下本文中我们所做的工作。我们通过以下两种架构之一,考察了两个 [DAO] 层:

[DAO1] 层使用 Spring JDBC 实现,[DAO2] 层使用 Spring JPA 实现[DAO1] 和 [DAO2] 层都实现了相同的 [IDAO] 接口,这使我们能够编写一个单一的测试类 [JUnitTestDao] 来测试这两个 [DAO] 层;

完成上述工作后,我们通过以下方式在 Web 上暴露了 [IDAO] 接口:

  • 在[1]中,[IDAO]层是通过使用Spring MVC实现的Web层[2]在Web上公开的。实际上公开的是[IDAO]接口,我们根据该接口是采用[DAO-JDBC]还是[DAO-JPA-JDBC]架构实现的,构建了两个版本的Web服务;
  • 在[B]中,远程客户端使用Web服务公开的URL,这些URL提供了对[IDAO-server]层方法的访问。我们确保[DAO-Client]层[3]实现了[IDAO-server]接口[1]。这使我们能够复用之前已使用过两次的同一[JUnitTestDao]测试;
  • 在[3]中,[DAO-Client]层是使用Spring RestTemplate实现的;

完成上述工作后,我们对 Web 服务访问进行了安全加固:

  • 在[5]中,客户端的HTTP请求会经过一个由Spring Security实现的身份验证层;

完成上述工作后,我们将之前的架构演进为如下形式:

  • 在[3]中,客户端应用程序本身是一个由Web服务器[4]托管的Web应用程序。客户端应用程序在浏览器中显示一个表单[5],用于查询安全Web服务的URL。对安全Web服务的HTTP访问由一个用JavaScript实现的[jS]层处理。该架构利用了所谓的跨域请求:
    • Web服务提供的URL采用[http://machine1:port1/]这种形式;
    • 客户端 Web 应用程序是从 URL [http://machine2:port2/] 下载的。如果 [http://machine2:port2/] 与 [http://machine1:port1/] 不相同(同一台机器、同一端口),则客户端浏览器将阻止来自 [DAO-client-js] 层的 HTTP 调用。为了解决此问题,Web 服务必须允许跨域请求;

所展示的项目已在以下六种数据库上进行了测试:

  • MySQL 5 社区版;
  • SQL Server 2014 Express;
  • PostgreSQL 9.4;
  • Oracle Express 11g Release 2;
  • IBM DB2 Express-C 10.5;
  • Firebird 2.5.4;

针对上述每种数据库管理系统,我们开发了四种不同的 [DAO] 层:

  • 一个基于 Spring JDBC 实现的层;
  • 一个基于 Spring JPA 和 Hibernate JPA 提供商实现的层;
  • 一个基于 Spring JPA 和 EclipseLink JPA 提供商实现的层;
  • 一个基于 Spring JPA 和 OpenJPA JPA 提供商实现的层;

因此,共呈现了二十四种不同的配置方案。在代码重构方面投入了大量精力:

  • 大部分代码仅编写一次。其基于两个 Maven 配置项目:
    • 一个用于配置 JDBC 层;
    • 另一个用于配置 JPA 层;

针对特定数据库管理系统(DBMS)的 JDBC 层 [1] 的 Maven 配置项目支持:

  • 导入 JDBC 驱动程序归档文件;
  • 定义所用数据库的访问凭据,以及 [DAO1] 层将发送给 JDBC 驱动程序的各种 SQL 语句。尽管 SQL 已标准化,但我们遇到了可移植性问题,主要原因是查询中包含的表名/列名在某些 DBMS 中被证明是受限关键字(例如 DB2 中的 ROLES 表,Firebird 中的 PASSWORD 列)。 此外,尽管列名通常不区分大小写,但在 PostgreSQL 中,我们遇到了与表中主键 ID 列相关的问题。该系统要求该列必须命名为小写的“id”

用于配置特定数据库管理系统(DBMS)的JPA层[2]的三个Maven项目支持:

  • 导入 JPA 实现存档;
  • 配置用于特定已连接数据库管理系统(DBMS)的 JPA 实现。实际上,正是 JPA 层向 JDBC 层发出 SQL 命令。为了有效工作,它必须识别数据库管理系统,以便发送其能够识别的 SQL 命令。这些命令可能使用该数据库管理系统的专有 SQL 以及其特定功能(数据类型、序列、触发器、存储过程、主键自动生成等);

因此,我们创建了二十四个 Maven 配置项目(4 种配置 × 6 种 DBMS),所有其他数据库操作项目均以此为基础。在上图中,由于 [DAO1] 和 [DAO2] 层提供相同的接口,因此使用单个测试类 [JUnitTestDao] 对上述两种架构的 24 种配置进行了测试。一旦这些架构得到验证,便不再有其他困难:

  • 用于将数据库发布到 Web 的 Maven 项目基于这两种架构。因此这里也有 24 种可能的配置;
  • 用于保障 Web 服务访问安全的 Maven 项目基于前一个项目构建,同样拥有 24 种可能的配置;
  • 最后,支持向安全 Web 服务发起跨域请求的 Maven 项目基于前一个项目构建,同样拥有 24 种可能的配置;

尽管本文档并未涵盖 Java 语言的所有功能或所有应用领域,但可作为该语言的学习资源。掌握本课程内容的读者将在语言使用和 Spring 框架应用方面达到“高级 Java”水平。随后,他们可通过以下书籍继续进行 Java 学习: