《Spring-数据访问》

Spring提供数据访问层


数据访问层分为以下几个部分

  • 统一的数据访问异常层次体系:将特定的数据访问技术相关的异常封装成一套标准的异常层次体系
  • JDBC API的最佳实践:JDBC是一套数据访问标准,规范了各个数据库厂商的之间的数据访问接口,但依旧存在问题,Spring在其基础上提供了更好的实践
  • 以统一的方式对各种ORM方案的集成:除了使用JDBC,还使用ORM(Object Relational Mapping,对象-关系映射)

总的来说,Spring的数据访问层就是以统一的数据访问异常层次体系为核心,以JDBC API集成ORM方案为两翼

DAO(Data Access Object 数据访问对象)设计模式
封装对于数据源的操作,数据源可能是文件、数据库等任意存储方式(可以与数据库或者文件进行交互,业务层在去操作数据层时,不需要知道数据层底层的存储实现)。DAO模式对于屏蔽不同数据访问机制的差异性起到举足轻重的作用

统一异常处理

不同的数据访问机制会抛出不同形式的异常,如果把这些异常交给客户处理,那定义统一的数据访问接口就会显得没有用,而且如果存着数据访问机制的添加,访问接口要不断修改,这就破坏了使用DAO设计模式的初衷

为解决上述问题,只要在DAO实现类内部,将不同的异常以统一的格式封装即可。不过依旧存在一个问题,不同数据库厂商表达具体的错误信息时,采用不同的方式,这意味着客户要根据不同的数据库厂商采取不同的信息提取方式来获取具体的错误信息,这是很糟糕的,为此我们通过异常的分类转译来屏蔽这种差异。因此我们需要完成两个任务,一是完成对错误信息的提取工作,二是对错误信息进行分类,抛出统一的异常(如获取资源失败、数据一致性冲突)等,可以通过定义RuntimeException的子类来实现

通过上面的机制,不管数据访问方式如何变化,只要将相应的数据访问方式的异常转译到这套自定义的完整异常体系中,对于客户端来说,异常处理逻辑就巍然不动了

Spring就根据上述思路实现了数据访问异常层次体系,这个异常体系以DataAccessException为统领,并根据职能划分为不同的异常子类型,具体信息可以查看Spring的Javadoc

上面介绍了统一的数据访问异常层次体系出现的背景演化过程

ORM集成

Spring对流行的ORM集成体现在

  • 统一的资源管理方式:Spring以统一的方式封装ORM,使得对JDBC和ORM都使用统一的方式
  • 特定于ORM的数据访问异常到Spring统一异常体系的转译
  • 统一的数据访问事物管理及控制方式

Spring对HibernateIBatis等ORM等方案都有集成包,虽然集成方案千篇一律,但我们应该根据具体场景选择具体的ORM方案

Hibernate比作自动步枪,JDBC是手动步枪,iBATIS就是半自动步枪,学习成本低