Spring揭秘-第13章 统一的数据访问异常层次体系
DAO可以分离数据哭的访问和存储,屏蔽各种数据访问方式的差异性,下面以访问顾客信息为例,使用DAO模式
首先定义一个数据访问对象接口,如下
public interrface ICustomerDao{
Customer findCustomerByPK(String customerId);
void updateCustomerStatus(Customer customer);
之后,所有的数据访问都通过该接口进行,不论底层存储机制如何改变,DAO的实现因此会扩展,但客户端代码不需要调整
客户端要用的时候这样使用即可。
publicclassCustomerService
{
privateICustomerDao customerDao;
publicvoid disableCustomerCampain(String customerId)
{
Customer customer=getCustomerDao().findCustomerByPK(customerId);
customer.setCampainStatus(CampainStatus.DISABLE);
getCustomerDao().updateCustomerStatus(customer);
}
publicICustomerDao getCustomerDao()
{
return customerDao;
}
publicvoid setCustomerDao(ICustomerDao customerDao)
{
this.customerDao=customerDao;
}
我们只要针对不同的数据存储方式实现不同的Dao类即可。
我们开始实现具体的访问数据了。
publicCustomer findCustomerByPK(String customerId)
{
Connection con=null;
try{
con=getDataSource().getConnection();
Customer cust=..;
return cust;
}
catch(SQLException e){
//这里咋办,直接抛出还是直接处理?
}
finally{
releaseConnection(con);
}
}
privatevoid releaseConnection(Connection con){
}
SQLException 是checked exception,如果在DAO的实现类里直接处理掉,那么客户端怎么知道发生了问题,
于是,只能处理,那么客户端的签名就要改了
<span class="typ">Customer</span><span class="pln"> findCustomerByPK</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> customerId</span><span class="pun">)</span><span class="kwd">throws</span><span class="typ">SQLExcepiton</span><span class="pun">;</span>
ICustomerDao也要改了,可是这样的话
如果数据在其他方式存储,那么其他类型的异常捕获就要继续添加到方法签名。由于数据访问机制的不同,导致这个接口签名不断在变化。
那怎么办呢?DAO如此美好的远景。
直接抛出,的话,因此,可以根据发生的异常信息封装成不同的unchecked exception,然后抛出,这样方法签名不用改。因为unchecked不需要编译器检查。
要开始写了?Spring的数据访问异常层次体系已经给我们做完了
该体系下面所有的异常类型均以DataAccessException为统领,然后划分成不同的子类型

这些类是啥搜索一下,或者根据名字猜一下,之后我们就可以