ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:27.29KB ,
资源ID:5444322      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5444322.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Spring中文指南离线版本.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Spring中文指南离线版本.docx

1、Spring中文指南离线版本1 第十一章-使用ORM工具进行数据访问1.1 简介Spring在资源管理,DAO实现支持以及实物策略等方面提供了与Hibernate,JDO和iBATISSQL映射的集成。对Hibernate,Spring使用了很多IoC的方便的特性提供了一流的支持,帮助你处理很多典型的Hibernate整合的问题。所有的这些都遵守Spring通用的事务和DAO异常体系。当您选择使用O/R映射来创建数据访问应用程序的时候,Spring的增加部分就会向您提供重要的支持。首先你应该了解的是,一旦你使用了Spring对O/R映射的支持,你不需要亲自作所有的事情。在决定花费力气,冒着风险

2、建造类似的内部底层结构之前,我们都建议您考虑和利用Spring的解决方案。不管你使用的是何种技术,大部分的O/R映射支持都可以以library样式被使用,因为所有的东西都是被设计成一组可重复利用的JavaBeans。在ApplicationContext和BeanFactory中使用更是提供了配置和部署简单的好处,因此,这一章里的大多数例子都是在ApplicationContext中配置。使用Spring构建你的ORM应用的好处包括: 避免绑定特殊的技术,允许mix-and-match的实现策略虽然Hibernate非常强大,灵活,开源而且免费,但它还是使用了自己的特定的API。此外有人也许会

3、争辩:iBatis更轻便而且在不需要复杂的O/R映射策略的应用中使用也很优秀。能够选择的话,使用标准或抽象的API来实现主要的应用需求,通常是更好的。尤其,当你可能会因为功能,性能或其他方面的原因而需要切换到另一个实现的时候。举例来说,Spring对Hibernate事务和异常的抽象,以及能够让你轻松交换mapper和DAO对象(实现数据访问功能)的IoC机制,这两个特性可以让你在不牺牲Hibernate性能的情况下,在你的应用程序中隔离Hibernate的相关代码。处理DAO的高层次的service代码不需要知道DAO的具体实现。这个方法可以很容易使用mix-and-match方案互不干扰地

4、实现数据访问层(比如在一些地方用Hibernate,一些地方使用JDBC,其他地方使用iBatis),mix-and-match有利于处理遗留下来的代码以及利用各种技术(JDBC,Hibernate,iBatis)的长处。 测试简单Spring的IoC使得很容易替换掉不同的实现,HibernateSessionFacotory的位置,datasource,事务管理,映射对象的实现。这样就很容易隔离测试持久化相关代码的各个部分。 普通的资源管理Spring的applicationcontext能够处理诸如Hibernate的SessionFactory,JDBC的datasource,iBati

5、s的SQLMaps配置对象以及其他相关资源的定位和配置。这使得这些配置的值很容易被管理和修改。Spring提供了有效,简单和安全的HibernateSession处理。一般的使用Hibernate的代码则需要使用同一个HibernateSession对象以确保有效和恰当地事务处理。而Spring让我们可以很容易透明地创建和绑定一个session到当前线程;你可以使用以下两种办法之一:声明式的AOP方法拦截器,或通过使用一个外部的template包装类在Java代码层次实现。这样,Spring就解决了在很多Hibernate论坛上出现的使用问题。 异常包装Spring能够包装Hibernate异

6、常,把它们从专有的,checkedexception变为一组抽象的runtimeexception。这样你就可以仅仅在恰当的层处理大部分的不可恢复的异常,使你避免了很多讨厌的catch/throw以及异常声明。你还是可以在你需要的地方捕捉和处理异常。回想一下JDBC异常(包括与DB相关的方言)被转变为同样的异常体系,这就意味着你可以在一致的编程模型中处理JDBC操作。 综合的事务管理Spring允许你包装你的ORM代码,通过使用声明式的AOP方法拦截器或者在代码级别使用外部的template包装类。不管使用哪一种,事务相关的语义都会为你处理,万一有异常发生也会帮你做适当的事务操作(比如roll

7、back)。就象我们下面要讨论的一样,你能够使用和替换各种transactionmanagers,却不会使你的Hibernate相关的代码受到影响。更好的是,JDBC相关的代码可以完全和Hibernate代码integratetransactionaly。这对于处理那些没有用Hibernate或iBatis实现的功能非常有用。1.2 Hibernate1.2.1 资源管理典型的应用经常会被重复的资源管理代码搞胡乱。很多项目尝试创造自己的方案解决这个问题,有时会为了编程方便牺牲适当的故障处理。对于恰当的资源处理Spring提倡令人瞩目的简单的解决方案:使用templating的IoC,比如基础的

8、class和回调接口,或者提供AOP拦截器。基础的类负责固定的资源处理,以及将特定的异常转换为unchecked异常体系。Spring引进了DAO异常体系,可适用于任何数据访问策略。对于直接使用JDBC的情况,前面章节提到的JdbcTemplate类负责处理connection,正确地把SQLExeption变为DataAccessException体系(包括将与数据库相关的SQL错误代码变成有意义的异常类)。它同时支持JTA和JDBC事务,通过它们各自的Springtransactionmanagers。Spring同样也提供了对Hibernate和JDO的支持:一个HibernateTem

9、plate/JdoTemplate类似于JdbcTemplate,HibernateInterceptor/JdoInterceptor,以及一个Hibernate/JDOtransactionmanager。主要的目的是:能够清晰地划分应用层次而不管使用何种数据访问和事务技术;使应用对象之间的耦合松散。业务对象(BO)不再依赖于数据访问和事务策略;不再有硬编码的资源lookup;不再有难于替换的singletons;不再有自定义的服务注册。一个简单且坚固的方案连接了应用对象,并且使它们可重用尽可能地不依赖容器。虽然所有的数据访问技术都能独立使用,但是与Springapplicationcon

10、text结合更好一些,它提供了基于xml的配置和普通的与Spring无关的JavaBean实例。在典型的Springapp中,很多重要的对象都是JavaBeans:数据访问template,数据访问对象(使用template),transactionmanagers,业务对象(使用数据访问对象和transactionmanagers),webviewresolvers,webcontroller(使用业务对象)等等。1.2.2 在applicationcontext中定义资源为了避免将应用对象贴紧硬编码的资源lookup,Spring允许你像定义普通bean一样在applicationcont

11、ext中定义诸如JDBCDataSource,HibernateSessionFactory的资源。需要访问这些资源的应用对象只需要持有这些预定义实例的引用。下面的代码演示如何创建一个JDBCDataSource和HibernateSessionFactory:java:comp/env/jdbc/mydsproduct.hbm.xmlnet.sf.hibernate.dialect.MySQLDialect你可以将一个JNDI定位的DataSource换为一个本地定义的如DBCP的BasicDataSource,如下面的代码:org.hsqldb.jdbcDriverjdbc:hsqldb:

12、hsql:/localhost:9001sa当然你也可以把本地的SessionFactory换为JNDI定位的,但是如果不是在EJB上下文中,这是不需要的。(查看“容器资源vs本地资源”一节)1.2.3 反转控制:Template和Callback对于可以成为定制的数据访问对象或业务对象的方法来说,基本的模板编程模型看起来像下面所示的代码那样。对于外部对象没有任何实现特定接口的要求,它只需要提供一个Hibernate的SessionFacotry。它可以从任何地方得到,比较适宜的方法是作为从Spring的applicationcontext中得到的bean引用:通过简单的setSessionF

13、actory这个bean属性setter。下面的代码显示了在applicationcontext中一个DAO的定义,它引用了上面定义的SessionFactory,同时展示了一个DAO方法的具体实现。.publicclassProductDaoImplimplementsproductDaoprivateSessionFactorysessionFactory;publicvoidsetSessionFactory(SessionFactorysessionFactory)this.sessionFactory=sessionFactory;publicListloadProductsByCa

14、tegory(finalStringcategory)HibernateTemplatehibernateTemplate=newHibernateTemplate(this.sessionFactory);return(List)hibernateTemplate.execute(newHibernateCallback()publicObjectdoInHibernate(Sessionsession)throwsHibernateExceptionListresult=session.find(“fromtest.Productproductwhereproduct.category=?

15、”,category,Hibernate.STRING);/对结果list做一些处理returnresult;);一个callback的实现能在任何的Hibernate数据访问中有效使用。HibernateTemplate会确保Sessions正确的打开和关闭,并且会自动参与事务。Template实例是线程安全的,可重用的,因此可以作为外部类的实例变量而被保持。对于简单的一步操作,例如简单的find,load,saveOrUpdate,或者delete调用,HibernateTemplate提供了可选的简单方法可以用来替换这种一行的callback实现。此外,Spring提供了一个简便的Hib

16、ernateDaoSupport基类,这个基类提供了setSessionFactory()方法来接受一个SessionFactory,getSessionFactory()以及getHibernateTemplate()方法是子类使用的。这样对于典型的需求就可以有很简单的DAO实现:publicclassProductDaoImplextendsHibernateDaoSupportimplementsProductDaopublicListloadProductsByCategory(Stringcategory)returngetHibernateTemplate().find(“from

17、test.Productproductwhereproduct.category=?”,category,Hibernate.STRING);1.2.4 应用AOP拦截器(Interceptor)代替TemplateSpring的AOPHibernateInterceptor是作为HibernateTemplate的替换,它在一个委托的try/catch块中直接写Hibernate代码,以及在applicationcontext中的一个interceptor定义,从而代替callback的实现。下面演示了在applicationcontext中DAO,interceptor以及proxy定义,

18、同时还有一个DAO方法的具体实现:product.ProductDaomyHibernateInterceptormyProductDaoTargetpublicclassProductDaoImplextendsHibernateDaoSupportimplementsProdctDaopublicListloadProdctsByCategory(finalStringcategory)throwsMyExceptionSessionsession=SessionFactoryUtils.getSession(getSessionFactory(),false);tryListresult

19、=session.find(“fromtest.Productproductwhereproduct.category=?”,category,Hibernate.STRING);if(result=null)thrownewMyException(“invalidsearchresult”);returnresult;catch(HibernateExceptionex)throwSessionFactoryUtils.convertHibernateAccessException(ex);这个方法必须要有一个HibernateInterceptor才能工作。getSession方法中的”f

20、alse”标志为了确保Session已经存在,否则SessionFactoryUtils会创建一个新的。如果线程中已经存在一个SessionHolder比如一个HibernateTransactionManager事务,那SessionFactoryUtils就肯定会自动参与进来。HibernateaTemplate在内部使用SessionFactoryUtils,他们是一样的底层结构。HibernateInterceptor最主要的优点是允许在数据访问代码中抛出checked应用异常,而HibernateTemplate在回调中严格限制只能抛出uncheckedexception。值得注意的

21、是我们可以把各种check以及抛出应用异常推迟到回调之后。Interceptor的主要缺点是它需要在context进行特殊的装配。HibernateTemplate的简便方法在很多场景下更简单些。11.2.5编程式的事务划分在这些低层次的数据访问服务之上,可以在应用的高层次上划分事务,让事务横跨多个操作。这里对于相关的业务对象(BO)同样没有实现接口的限制,它只需要一个Spring的PlatformTransactionManager。同SessionFactory一样,这个manager可以来自任何地方,但是最好是作为一个经由setTransactionManager方法设置的bean引用。

22、下面演示了在Srpingapplicationcontext中一个transactionmanager和一个业务对象的定义,以及具体的业务方法是如何实现的:publicclassProductServiceImplimplementsProductServiceprivatePlatformTransactionManagertransactionManager;privateProductDaoproductDao;/上面两个的setter方法publicvoidincreasePriceOfAllProductsInCategory(finalStringcategory)TransactionTemplatetransactionTemplate=newTransactionTemplate(this.transactionManager);transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);transactionTemplate.execute(newTransactionCallbackWithoutResult()publi

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1