4.DAO支持
Spring中的DAO(数据访问对象)支持主要的目标是便于以标准的方式使用数据访问技术, 如JDBC,Hibernate或者JDO。它不仅可以让你在这些技术间相当容易的切换,而且让你在编码的时候不需要考虑捕获各种技术中特定的异常。
4.1 一致的异常层次
Spring提供了一个简便的把某种技术特定的异常如SQLException 转化为它自身的异常层次中的基类异常DataAccessException的方法。这些异常包装了原始的异常,所以你不必担心会丢失任何可能造成错误的异常信息。
除了对JDBC异常的包装外,Spring也可以包装Hibernate的异常,把它们从专有的, checked exceptions转化为一系列抽象的runtime exceptions。 同样的情况也适用于JDO的异常。它可以让你处理大多数持久的异常而不需要讨厌的样板式catches/throws代码块和异常声明,这些异常是不可恢复的,只在一些适当的层出现.你仍然可以在需要的地方捕获并处理这些异常。像我们上面提到的一样,JDBC的异常(包括不同数据库特定的方言)也可以转化至同样的异常层次, 这意味着你可以在一致的编程模型下使用JDBC执行某些操作。
上述的情况适合于Template版本的ORM存取框架(JdbcTemplate、HibernateTemplate、JtaTemplate)。如果你使用基于拦截器的类(HibernateInterceptor),应用中就必须小心的处理HibernateExceptions和JDOExceptions,最好选择通过SessionFactoryUtils 中的convertHibernateAccessEx
4.3 一致的DAO支持抽象类
为了便于以一致的方式使用不同的数据访问技术如JDBC,JDO和Hibernate, Spring提供了一套抽象的DAO类供你继承。这些抽象类提供一些方法来设置数据源,以及你正在使用的技术中专有的一些配置设定。
Dao支持类:
·
·
·
4.4使用ORM工具进行数据访问
Spring在资源管理,DAO实现支持以及实物策略等方面提供了与Hibernate, JDO和iBATIS SQL映射的集成。 对Hibernate,Spring使用了很多IoC的方便的特性提供了一流的支持,帮助你处理很多典型的Hibernate整合的问题。所有的这些都遵守Spring通用的事务和DAO异常体系.
使用Spring构建你的ORM应用的好处包括:
·
·
·
·
·
4.5 DAO反向控制: 模板和回调的使用
对于可以成为定制的数据访问对象或业务对象的方法来说,基本的模板编程模型看起来像下面所示的代码那样。对于外部对象没有任何实现特定接口的要求,它只需要提供一个Hibernate的SessionFactory。它可以从任何地方得到,比较适宜的方法是作为从Spring 的application context中得到的bean引用: 通过简单的setSessionFactory这个bean属性setter。下面的代码显示了在application context中一个DAO的定义, 它引用了上面定义的SessionFactory,同时展示了一个DAO方法的具体实现。
<beans>
<bean id="myProductDao" lang="EN-US" style="font-size:9pt"> <property name="sessionFactory">
<ref bean="mySessionFactory"/>
</property>
</bean>
</beans>
public class ProductDaoImpl implements ProductDao {
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public List loadProductsByCategory(final String category) {
HibernateTemplate hibernateTemplate =
new HibernateTemplate(this.sessionFactory);
return (List) hibernateTemplate.execute(
new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
List result = session.find(
"from test.Product product where product.category=?",
category, Hibernate.STRING);
// do some further stuff with the result list
return result;
}
}
);
}
}
一个callback的实现能在任何的Hibernate数据访问中有效使用。HibernateTemplate会确保Session正确的打开和关闭,并且会自动参与事务。Template实例是线程安全的,可重用的,因此可以作为外部类的实例变量而被保持。对于简单的一步操作,例如简单的find,load, saveOrUpdate,或者delete调用,HibernateTemplate提供了可选的简单方法可以用来替换这种一行的callback实现。 此外,Spring提供了一个简便的HibernateDaoSupport基类,这个基类提供了setSessionFactory方法来接受一个SessionFactory,getSessionFactory 以及getHibernateTemplate方法是子类使用的。这样对于典型的需求就可以有很简单的DAO实现:
public class ProductDaoImpl extends HibernateDaoSupport implements ProductDao {
public List loadProductsByCategory(String category) {
return getHibernateTemplate().find(
"from test.Product product where product.category=?", category,
Hibernate.STRING);
}
}