Spring的数据访问
一、主要内容
1、Spring数据访问的异常体系
2、数据访问模版化
3、使用DAO支持类
二、前言
1、Spring对数据访问的支持同样遵循OO原则:针对接口编程
2、DAO(数据访问对象)提供对数据库进行数据访问的一种方式
3、服务对象(Service object)/业务对象(Business object)本身不会处理数据访问,而是将数据访问委托给DAO。DAO接口确保其和服务对象的松耦合
4、服务对象不与特定的数据访问实现绑定
5、数据访问层以与持久化技术无关的方式进行数据访问。持久化技术的选择独立于DAO(接口),只有相关的数据访问方式通过接口进行发布,可灵活切换持久化框架(实现策略模式)
6、数据访问对象DAO模式:是GoF Strategy策略模式的一种特殊形式。用途是将“与持久化相关的代码”从业务逻辑中分离出来
7、DAO模式需要一个DAO接口,以便将特定的数据访问实现细节掩藏起来
8、业务对象BO只应该关注业务逻辑,不应该关心数据存取细节;数据访问对象必须实现特定的持久化策略,并通过一个通用的DAO接口暴露给业务对象使用
9、数据访问对象需要参与到事务中,但通常不应该由它们来驱动事务,因为DAO中的操作一般都是细粒度的。应该由调用DAO的业务对象来负责划分事务——通常是在业务facade门面的层面上。一个业务对象可能调用多个DAO方法,甚至可能在一次事务中涉及多个DAO
10、示例:一个基于web的应用程序按照逻辑分为三层:web层、业务逻辑层、数据访问层。有一个OrderManager业务对象,需要存储一个订单(order),并对库存(inventory)数据库进行更新。
interface OrderDao {
void saveOrder(Order order);
void updateInventory(Order order);
}
public class OrderManager {
public void setOrderDao(OrderDao orderDao) {
this.orderDao = orderDao;
}
//业务方法
public void placeOrder(Order order) {
orderDao.saveOrder(order);
orderDao.updateInventory(order);
}
}
三、Spring数据访问异常体系
1、为了将数据访问层与应用程序的其它部分进行隔离,Spring提供贯穿DAO框架的统一异常体系
2、数据访问框架中,JDBC需强制捕获SQLException异常(问题复杂,难以恢复,受查异常);Hibernate提供独有的异常体系,可针对特定的数据访问问题,但不通用
3、Spring提供的数据访问异常体系,提供多个数据访问异常分别描述对应问题
4、Spring异常体系不与特定持久化方法相关;异常均继承自DataAccessException(非受查异常),不需要捕获
四、数据访问模板化
1、模板方法模式:将过程中与特定实现相关的部分委托给接口,接口的不同实现定义了过程中的具体行为
2、Spring将数据访问过程中固定的和可变的部分划分为:模板(template)和回调(callback)
简单的数据访问过程:
1)准备数据源
2)开启一个事务
3)在事务当中执行数据访问的逻辑
4)返回结果数据
5)提交或者回滚事务
6)回收资源,处理异常
3、Spring的DAO模板类处理数据访问的固定部分——事务控制、资源管理和异常处理等
4、自定义回调对象处理应用程序相关的数据访问——创建语句、绑定参数、处理结果集等
5、框架目标:只需关心数据访问逻辑
6、针对不同的持久化平台,Spring提供多个可选的模板
Spring为JDBC提供了三个模板
7、直接使用JDBC,可选择JdbcTemplate
8、使用对象关系映射框架(ORM),可选HibernateTemplate、JpaTemplate等
9、示例:使用JDBC模板的订单DAO
public class JdbcOrderDao implements OrderDao {
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate template) {
this.jdbcTemplate = template;
}
public void saveOrder(Order order) {
jdbcTemplate.update(...);
}
}
五、使用DAO支持类
1、基于模板-回调设计,Spring提供DAO支持类,将业务相关DAO类作为它的子类
2、编写应用程序业务相关DAO实现时,可以继承DAO支持类并调用模板获取方法来直接访问底层的数据访问模板
3、如需要访问底层的持久化平台,每个DAO支持类能访问其与数据库进行通信的类
4、Spring不仅提供多个数据访问模板实现,还为每种模板提供对应的DAO支持类
类名以Support结尾
5、示例:使用JDBC DAO支持类的订单DAO
public class JdbcOrderDao extends JdbcDaoSupport implements OrderDao {
public void saveOrder(Order order) {
getJdbcTemplate().update(...);
}
}
由DAO支持类持有模板,使代码更为简洁