第八章 Spring 对 DAO 的支持
Spring 对持久化技术提供的支持 : Hibernate, iBatis, JDO, JPA, TopLink
Spring 通过 Spring JDBC 框架对 JDBC API 进行简化
Spring 面向 DAO 制定了通用的异常体系,屏蔽具体持久化技术的异常。
Spring 提供了模板类简化各种持久化技术的使用
总结 : 持久化支持, JDBC简化,模板类 + 通用异常
8.1 Spring 的 DAO 理念
DAO层抽象的好处是 : (1), 方便构造模拟对象,有利于单元测试
(2), 使用切面,可以使用 JDK 动态代理,CGLib动态代理
Spring 本质希望以统一的方式整合底层的持久化技术:以统一的方式进行调用及事务管理,避免让具体的实现侵入到业务层代码。
8.2 统一的异常体系
Spring 提供了与实现技术无关的,面向DAO层语义的异常体系,并通过转换器将不同持久化技术的异常转换成Spring异常。
8.2.1 Spring 的 DAO 异常体系
Spring 的异常体系都是建立在运行期异常的基础上,开发者可以根据需要捕捉感兴趣的异常
Spring 在 org.springframework.dao 包中提供了优雅的 DAO 异常体系,这些异常都继承 DataAccessException
而 DataAccessException extends NestedRuntimeException
框架自动处理异常,(如发生运行期异常时自动回滚事务)
8.2.2 JDBC 的异常转换器
传统的 JDBC API 在发生几乎所有的数据操作问题都抛出相同的 SQLException,细节封装在异常属性中。
e.getErrorCode(), e.getSQLState() Spring 框架替我们将 SQLException 翻译成 Spring DAO 异常体系。
8.2.3 异常转换器
Spring 也支持 iBatis ORM 持久化技术,由于 iBatis 抛出的异常 和 JDBC 的 SQLException 异常相同。
8.3 统一数据访问模板
(1), 我们为什么要时不时下下馆子 : 因为我们只 需要, 点菜 --> 用餐 --> 买单。幕后的烹饪制作,刷锅等不关心。
后幕后,餐馆拥有一个服务的模板,模板中定义的流程可以用于应付所有的顾客。
对比 :
我们在直接使用具体的持久化技术时,我们大多需要处理整个流程,并没有享受餐馆用餐式的便捷。
Spring 为支持的持久化技术分别提供了模板访问的方式,降低了使用各种持久化技术的难度,可以大幅提供开发效率。
8.3.1 使用模板和回调机制
JDBC 繁琐弊端 : 1, 准备资源 2, 启动事务 3, 在事务中执行具体数据访问操作 4, 提交/回滚事务 5,关闭资源,处理异常
Spring 将这个数据访问流程固化到模板类中,将数据访问中固定(Dao模板)和变化(Dao回调)的部分分开,同时保证模板类是线程安全的。
8.3.2 Spring 为不同持久化技术所提供的模板类
ORM 持久化技术 模板类
JDBC org.springframework.jdbc.core.JdbcTemplate
iBatis org.springframework.orm.ibatis.SqlMapClientTemplate
如果我们直接使用模板类,一般都需要在 DAO 中定义一个模板对象并提供数据资源,Spring为每一个持久化技术都提供了支持类,。
我们只需要扩展这些支持类就可以直接编写实际的数据访问逻辑。
不同持久化技术的支持类
ORM 持久化技术 支持类
JDBC org.springframework.jdbc.core.JdbcDaoSupport
iBatis org.springframework.orm.ibatis.SqlMapClientTemplate
* 这些支持类都继承于 dao.support.DaoSupport 类,DaoSupport 实现了 InitializingBean 接口,在 afterPropertiesSet() 接口方法中检查模板对象和数据源是否被正确设置,否则将抛出异常。
8.4 数据源
持久化技术,需要拥有数据连接,Spring 中数据连接通过数据源获得。Spring 中 数据源不依赖于容器了,便于单元测试。
Mysql 的 8 小时问题。 284P 解决。
8.4.1 配置一个数据源
DBCP 数据源, DBCP 是一个依赖 Jakarta commons-pool 对象池机制的数据库连接池。
<bean id = "dataSource" class = "org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
BasicDataSource 提供了 close() 方法关闭数据源,所以必须设定 destroy-method="close",以便容器关闭,数据源关闭。
8.4.2 Spring 数据源的实现类
DriverManagerDataSource, 位于 org.springframework.jdbc.datasource 包中。
不需要额外的依赖包,也没有池子的概念。
8.5 小结
(1), Spring 支持目前大多数常用的持久化技术
(2), Spring 定义了一套面向 DAO 层的异常体系
(3), 并为各种持久化技术提供了异常转化器
不管采用什么持久化技术,访问数据的流程是相对固定的。Spring 将数据访问流程划分为 固定 和 变化两部分。
模板的方式定义好流程,回调接口将变化的部分开放出来,留给开发者自行定义,Spring为简化模板类的使用,提供了支持类,支持类不但包含 数据访问模板,还包含数据源或会话等内容。通过扩展支持类定义自己的数据访问类是最简单的数据访问方式。
转载于:https://www.cnblogs.com/robbychan/p/3786504.html