使用Spring访问数据
在开始访问数据之前,我们先来总览一下Spring生命之树。讲完了AOP的概念之后,我们继续往上走,来到了Spring对数据的访问层。
Spring的生命之树
为了简化Java应用程序的开发,Spring框架提供了数据访问层,它主要可以划分为如下三个部分:
- 统一的数据访问异常体系。通过这套标准异常体系,不管使用的数据访问技术如何变化,客户端对象只需要捕获标准异常即可。
- JDBC(Java DataBase Connectivity)API。是一套数据访问标准,规范了各个数据库厂商的数据访问接口。
- 统一的ORM集成方案。ORM(Object Relational Mapping,对象-关系映射),主要用来屏蔽对象与关系数据库之间结构的不一致性。
下面就根据以上三个部分,开始Spring访问数据库之旅。
0x01统一的数据访问异常体系
访问数据库产生的异常时unchecked exception,出现访问数据异常后,用户可以不用对异常进行捕获处理,以免数据库访问的代码繁琐。
此外,数据库访问异常必须有一定的分类,这样我们有需要的时候,可以对异常进行捕获处理。
spring异常层次体系图不论采用的是什么数据库服务器,也不论采用什么数据库访问方式,只要将它们自己的异常,通过某种方式转义为以上提到的这几种异常类型,对于客户端来说,只需要关注这几种类型,就可以知道数据访问到底出现了什么问题。
对于客户端来说,自身数据访问异常的处理逻辑从此岿然不动,这就是统一数据访问异常的魅力。
0x02 JDBC API的最佳实践
JDBC API的最佳实践方式有两种:
- 基于Template的JDBC使用方式
- 基于操作对象的JDBC使用方式
基于Template的JDBC使用方式
JDBC在Java平台上的数据访问领域一直占据着重要的地位,但在日常开发过程中,糟糕的实践方式让JDBC的使用多少有些声名狼藉。过于贴近底层的API设计,对于开发人员来说不一定是件好事。即使是简单的更新任务,也需要有一堆雷同的代码:一堆的try catch语句还有最后释放链接等。
为了解决JDBC API在实际使用的尴尬,Spring框架推出了org.springframework.jdbc.core.JdbcTemplate作为数据访问的Helper类。概括的说,JdbcTemplate主要关注如下两个事情:
- 封装所有基于JDBC的数据访问代码,以统一的格式和规范来使用JDBC API.
- 对SQLException所提供的异常信息在框架内进行统一转译,将基于JDBC的数据访问异常纳入Spring自身的异常层次体系中。简化客户端代码对数据访问异常的处理。
JdbcTemplate主要是通过模板方法模式,对基于JDBC的数据访问代码进行统一的封装。模板方法模式核心思想就是将相似的逻辑提取到模板方法类中实现,然后让相应的子类去处理变化的东西。
JdbcTemplate的继承体系
JdbcOperations接口定义界定JdbcTemplate可以使用的操作接口集合。JdbcTemplate的直接父类是org.springframework.jdbc.support.JdbcAccessor,这是一个抽象类,主要为子类提供一些公共的属性:
- DataSource:可以看做是JDBC的连接工厂,具体实现可以引入对数据库连接的缓冲池以及分布式事务支持,作为获取数据库资源的统一入口。
- SQLExceptionTranslator:Spring对SQLException的转译工作接口
基于操作对象的JDBC使用方式
Spring除了提供基于Template形式的JDBC使用方式,还对各种数据库操作以面向对象的形式进行建模,为我们使用JDBC进行数据访问提供了另一种视角。鉴于使用的情况也比较少,这里直接略过。
0x03 Spring对各种ORM的集成
不管是从对各种ORM产品集成理论以及集成的方式来看,还是从各种ORM产品集成关注点来看,Spring对各种ORM产品 的集成几乎是一脉相承的。
1. 集成理论和方式上
各种数据访问方式的管理和使用通过相应的模板方法类来统一建模,而具体的数据访问逻辑则统一由相应的回调接口提供,从而将数据访问资源的管理和具体的数据访问逻辑相分离。
例如HibernateTemplate的模板方法,统一对Session的获取以及释放等管理逻辑进行封装,将Session管理尽量保持在一处执行。对于不同的数据访问需求,HibernateTemplate提供了HibernateCallback回调接口,以便调用方可以根据不同的数据访问需求进行定制,并且在模板方法内部统一对数据访问异常进行处理。
HibernateTemplate的核心方法简化后如下:
2.集成的关注点上
Spring对各种数据访问技术的集成主要集中在以下三个关注点上。
- 数据访问资源管理
1)连接工厂(ConnectionFactory),代表的是创建数据访问会话资源的统一概念。对于JDBC来说,是DataSource,对于Hibernate来说是SessionFactory,iBATIS来说是SqlMapClient。
2)连接或者会话资源。如JDBC的Connection,Hibernate的Session,IBatis的SqlMapSession。- 特定数据访问异常的转译
- 将特定于数据访问技术的事务管理,统一纳入到Spring的事务管理抽象层。
总结
本文描述了使用Spring访问数据的概述,并没有深入里面的细节。只是说明了Spring访问数据的体系架构有哪些,在深入学习的时候,再往体系里面去填充知识吧。