1 Spring在持久化中的应用

多年以来,关系型数据库一直是企业级应用中的统治者。在博客“Spring实现数据持久化(Spring+JDBC)”中,我们将会看到如何使用Spring的JDBC抽象来查询关系型数据库,这要比原生的JDBC简单得多。

如果你不喜欢JDBC风格的话,在博客“Spring实现数据持久化(Spring+ORM)”中,将会展现Spring如何与对象关系映射(ORM)框架进行集成,这些框架包括Hibernate以及其他的Java持久化API(Java Persistence API,JPA)实现。除此之外,还将会看到如何发挥Spring Data JPA的魔力,在运行时自动生成Repository实现。

关系型数据库不一定是所有场景下的最佳选择,因此,博客“Spring实现数据持久化(Spring+非关系型数据库)”将会研究其他的Spring Data项目,它们能够持久化各种非关系型数据库中的数据,包括MongoDB、Neo4j和Redis。

博客“Spring实现数据持久化(缓存数据)”为上述的持久化章提供了一个缓存层,如果数据已经可用的话,它会避免数据库操作,从而提升应用的性能。

与前端类似,安全性在后端也是一个很重要的方面。在博客“Spring实现数据持久化(保护方法应用)”中,将会把Spring Security应用于后端,它会拦截方法的调用并确保调用者被授予了适当的权限。

2 数据访问哲学

从某种类型的数据库中读取和写入数据时,我们一般遵循以下原则:

(1)为了避免持久化的逻辑分散到应用的各个组件中,最好将数据访问的功能放到一个或多个专注于此项任务的组件中。这样的组件通常称为数据访问对象(data access object,DAO)或Repository。

(2)为了避免应用与特定的数据访问策略耦合在一起,编写良好的Repository应该以接口的方式暴露功能。下图展现了设计数据访问层的合理方式。使用接口可以使持久化方式的选择独立于Repository,切换持久化框架对应用程序带来的影响很小。

1 Spring实现数据持久化(开篇)_持久化

Spring的目标之一就是允许我们在开发应用程序时,能够遵循面向对象(OO)原则中的“针对接口编程”。Spring对数据访问的支持也不例外。

3 Spring数据访问异常体系

如果你曾经编写过JDBC代码(不使用Spring),你肯定会意识到如果不强制捕获SQLException的话,几乎无法使用JDBC做任何事情。SQLException虽然表示出现了异常,但是却没有告诉你哪里出错了以及如何进行处理。

SQLException可以表示以下异常:可能导致抛出SQLException的常见问题包括:

  • 应用程序无法连接数据库;
  • 要执行的查询存在语法错误;
  • 查询中所使用的表和/或列不存在;
  • 试图插入或更新的数据违反了数据库约束。

对于所有的数据访问问题都会抛出SQLException,而不是对每种可能的问题都会有不同的异常类型。这种异常并不能给程序员有效的提示信息。

一些持久化框架提供了相对丰富的异常体系。例如,Hibernate提供了二十个左右的异常。即便如此,Hibernate的异常是其本身所特有的。因此,Hibernate的使用将会渗透到应用程序的其他部分。

Spring所提供的平台无关的持久化异常

(1)不同于JDBC,Spring提供了多个数据访问异常(比JDBC提供的异常多得多),分别描述了它们抛出时所对应的问题。

(2)尽管Spring的异常体系比JDBC简单的SQLException丰富得多,但它并没有与特定的持久化方式相关联。这意味着我们可以使用Spring抛出一致的异常,而不用关心所选择的持久化方案。这有助于我们将所选择持久化机制与数据访问层隔离开来。

4 Spring数据访问模块化

不管我们使用什么样的技术,都需要一些特定的数据访问步骤。例如,我们都需要获取一个到数据存储的连接并在处理完成后释放资源。这都是在数据访问处理过程中的固定步骤,但是每种数据访问方法又会有些不同,我们会查询   不同的对象或以不同的方式更新数据,这都是数据访问过程中变化的部分。

Spring将数据访问过程中固定的和可变的部分明确划分为两个不同的类:模板(template)和回调(callback)。模板管理过程中固定的部分,而回调处理自定义的数据访问代码。下图展现了这两个类的职责。

1 Spring实现数据持久化(开篇)_持久化_02

Spring的模板类处理数据访问的固定部分——事务控制、管理资源以及处理异常。同时,应用程序相关的数据访问——语句、绑定参数以及整理结果集——在回调的实现中处理。事实证明,这是一个优雅的架构,因为你只需关心自己的数据访问逻辑即可。

使用了模板事务控制,管理资源,异常处理都不用我们关注,我们只需要编写数据访问逻辑(参数传递,结果返回)。

针对不同的持久化平台,Spring提供了多个可选的模板。

1 Spring实现数据持久化(开篇)_持久化_03