扩展Spring(2) ---Spring对各种数据访问框架的集成机制
何为数据框架集成。
数据访问框架原本好好的,Spring都干了什么呢?
一是用template类封装了数据框架那些资源获取和异常事务处理的废话代码,而且按照自己的意见给出一些增强函数。
二是将其纳入了Spring的声明式事务管理中。
对比Spring对Hibernate、JDBC的集成,还有Spring Modules对O/R Broker的集成,发现Spring的DAO框架主要有六个类:
1.Template
著名的Template类,用callback机制封装了除业务代码外的所有必要但废话的代码,重新封装了数据框架的API,并再附送一些增强版。
2.TransactionManager
实现PlatformTransactionManager接口,数据访问框架就能与Spring的事务机制(TransactionTemplate或AOP声明式事务)结合。
重要的类仅以上两个,以下的类都只有少量标准代码,完全可以忽略。
3.DAOSupport
实际DAO类的基类,负责保持template变量。如果你觉得它破坏了你的类层次结构,完全可以不用。
4.Accessor
template类的基类,defining common properties like DataSource and exception translator,也没大用。
5.Operations
template所实现的接口,定义template支持的数据访问函数和增强函数,template有多个实现时才有用。
6.Exception Translate的相关类和函数
异常翻译,Spring DAO很重视的一个功能。
Template类的代码
因为Hibernate本身很复杂,所以HibernateTemplate也不适合畏高晕车的人士如我观看。JDBC简单很多,但JDBCTemplate又忙着增强JDBC的功能,多出好多代码。所以我选O/R broker的集成代码来看,代码一共才280行。
注:如果不熟O/R broker,可以简单的认为broker=connection, executable = statement ,其余一切同Jdbc。
1.1主干函数 Execute(BrokerCallback action)
step1. 获得Connection-- connecton = datasource.getConn();
step2. 准备Statement -- statement = new Statement(connection);
step3. 执行Action的回调函数doInBroker(Statement)。这个doInBroker()方法由客户定义,会拿着传入的statement,执行种种操作。
try
{
action.doInBroker(statement );
}
catch(
){
//
翻译异常}
1.2 template的API函数
虽然理论上大家可以直接使用execute(),在匿名内部类里调用数据访问框架的任何API。但java的匿名内部类不比闭包,代码难看无比,所以除了Robbin还没见到其他兄弟提倡直接用execute方法的。
因此,template也对数据框架的API进行了wrap,封装了用execute(StatementCallback action)来执行这些API的函数,如下段就是wrap 了O/R Broker的execute(String statementID.....)方法:
public int execute(final String statementID, final String[] paramNames, final Object[] values) throws DataAccessException {
return executeWithIntResult(new BrokerCallback() {
public Object doInBroker(Executable executable) throws BrokerException {
applyNamedParamsToExecutable(executable, paramNames, values);
return new Integer(executable.execute(statementID));
}
});
}
另外还提供一些增强型、便利型的API(如selectOne() ,selectMany()),在参数、返回值上极尽变化。
TransactionManager的代码
比较复杂,一下说不清。但JDBC的DatasourceTransactionManager和Hibernate的HibernateTransactionManager的代码都很相近,说明这个TransactionManager其实也比较固定埋头狂抄就是了。
有兴趣的同学,可以响应某大老号召,实现ofbiz与spring的集成:)
系列文章: