1前面已經(jīng)介紹了_第1頁
1前面已經(jīng)介紹了_第2頁
1前面已經(jīng)介紹了_第3頁
1前面已經(jīng)介紹了_第4頁
1前面已經(jīng)介紹了_第5頁
已閱讀5頁,還剩79頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、企業(yè) Spring3王健本章簡介:前面已經(jīng)介紹了Spring的核心技術(shù),如容器BeanFactory,ApplicationContext和AOP。本部分主要介紹Spring對持久層的支持。使用數(shù)據(jù)庫定義Spring的數(shù)據(jù)訪問支持。配置數(shù)據(jù)庫資源。使用Spring的Jdbc框架。集成Hibernate。簡介:在掌握Spring的容器之后,我們要將它應用到實際的工作中去。一個很好的起點便是:數(shù)據(jù)持久。Spring對JDBC,Hibernate,iBatis等都支持的很好。Spring的數(shù)據(jù)訪問哲學Spring的目標之一,是讓我們遵循面向?qū)ο?OOP)原則中的“面向接口編程”的原則。Spring的

2、數(shù)據(jù)訪問也是如此。DAO代表數(shù)據(jù)訪問對像。下圖顯示了設計數(shù)據(jù)訪問層次的正確設計方式:ServiceObjectDaointerfaceDaoimplementation注入實現(xiàn)DataSource注入Spring的數(shù)據(jù)訪問哲學之異常處理:編寫JDBC代碼(不使用Spring)有一個非常明顯的問題,如果不捕獲異常SQLException就幾乎不能對JDBC進行任何操作。但即使捕獲異常很多情況下也不能在catch中將問題加以解決,如程序不能連接到數(shù)據(jù)庫、語法錯誤等。所以,SQLException大多數(shù)情況下代表致命錯誤。SpringJDBC提供的數(shù)據(jù)訪問異常體系能夠解決上述的問題。Spring自己

3、提供了多種數(shù)據(jù)訪問異常,即異常轉(zhuǎn)換。Spring處理數(shù)據(jù)異常都源于DataAccessException,它是個不受檢查的異常。有了DataAccessException之后,訪問數(shù)據(jù)庫的代碼將沒有try.catch代碼塊。為了能夠使用Spring的異常處理,我們必須使用Spring支持的數(shù)據(jù)訪問模板之一。Spring的數(shù)據(jù)訪問哲學之模板化處理:Spring將數(shù)據(jù)訪問過程中固定與變化的部分明確的劃分為兩部分:模板。模板管理過程中固定的部分?;卣{(diào)。處理自定義的數(shù)據(jù)訪問代碼。SpringDao模板訪問數(shù)據(jù)的過程:DAO Template1、準備物資2、開始事務5、提交、回滾事務6、關(guān)閉資源3、執(zhí)行

4、事務4、返回數(shù)據(jù)DaoCallBackSpring的數(shù)據(jù)訪問哲學之數(shù)據(jù)訪問模板:Spring提供了多個模板用于訪問不同的持久化平臺。模板類功能CciTemplateJacCci連接,適用于WebLogic,WebSphere平臺JdbcTemplateJDBC連接,目前已經(jīng)支持JDK1.5以上版本NameParameterJdbcTemplate支持參數(shù)命名的JDBC連接SimpleJdbcTemplateJDBC連接,支持1.5 從3.1之后,又重新使用JdbcTemplate.HibernateTemplate支持Hibernate2,3,4的會話,需要spring-orm.jar包。Jp

5、aTempateJava存儲JPA實體管理SqlMapClientTemplateiBatisSimpleJdbcCall調(diào)用存儲過程。使用DAO的支持類:前面說的是DAO的模板?,F(xiàn)在說的是DAO模板的支持類。數(shù)據(jù)訪問模板,并不是Spring的全部,每個模板還提供了一些有用的方法,讓我們不必創(chuàng)建明確的回調(diào)實現(xiàn)。同時,Spring提供了DAO的支持類,用于派生出我們自己的DAO類。如:如果程序DAO繼承了JdbcDaoSupport支持類,那么我們只需要調(diào)用getJdbcTemplate訪問就可以獲取一個JdbcTemplate模板。Spring提供的支持類如下:DAO支持類說明CciDaoSu

6、pportJdbcDaoSupportJdbc的支持類。NameParameterJdbcDaoSupportHibernateDaoSupportHibernate的支持類。SqlMapClientDaoSupportiBatis在Spring的配置文件中配置數(shù)據(jù)源:無論是什么樣的Dao支持,都需要數(shù)據(jù)源的引用.Spring提供了多個選項用于在Spring中配置數(shù)據(jù)源:由Jdbc驅(qū)動程序定義的數(shù)據(jù)源。由JNDI查詢的數(shù)據(jù)源。連接池的數(shù)據(jù)源基于JDBC驅(qū)動的數(shù)據(jù)源:Spring能夠配置最簡單的數(shù)據(jù)源都是基于JDBC的,Spring提供了兩個這樣的實現(xiàn):DriverManagerDataSour

7、ce在每個連接請求時都會新建立一個連接,沒有連接池的管理。由于每一次都是一個新的連接,所以速度上有些慢。SimpleDriverDataSource在每個連接請求時都返回同一個連接??梢詫⑺闯墒侵挥幸粋€連接的連接池。由于只有一個連接,所以,不太適合多線程的應用。強烈建議使用dbcp,c3p0連接池。基于JDBC的數(shù)據(jù)源配置: 使用JdbcTemplate實現(xiàn)的查詢:ApplicationContext ac = new ClassPathXmlApplicationContext(jdbc.xml);DataSource ds = ac.getBean(DataSource.class);J

8、dbcTemplate jt = new JdbcTemplate(ds);ListMap list = jt.queryForList(select * from student);System.err.println(list);/返回ListList list2 = jt.queryForList(select sname from student,String.class);System.err.println(list2);/只支持一列的查詢List list3 = jt.query(select * from student,new RowMapper()public Stud m

9、apRow(ResultSet rs, int rowNum) throws SQLException Stud stud= new Stud();/使用RowMapper自定義封裝結(jié)果stud.setId(rs.getInt(1);stud.setName(rs.getString(2);return stud;);System.err.println(list3);配置使用連接池:DBCP連接池。C3p0連接池。在Spring中使用JDBC1、使用JDBC模板JdbcTemplateNamedParameterJdbcTemplateSqlFunction數(shù)據(jù)封裝:RowMapper -

10、自動遍歷的實現(xiàn)ResultSetExecutor - 自已經(jīng)遍歷實現(xiàn)MappingSqlQuery - 內(nèi)部類的實現(xiàn)2、使用Spring對JdbcDao的支持類。JdbcDaoSupport Dao的實現(xiàn)類。1、使用JDBC模板:Spring的JDBC框架能夠承擔資源管理和異常處理的工作,從而簡化我們的JDBC代碼。對于JDBC來說,Spring提供了三個模板類JdbcTemplate : Spring當中最基本的JDBC模板,利用JDBC和簡單的索引參數(shù)對數(shù)據(jù)庫進行訪問。NamedParameterJdbcTemplate : 能夠在執(zhí)行查詢時將值綁定到SQL里面命名參數(shù)。而不是使用索引參數(shù)

11、。使用JdbcTemplate的簡單CRUD:Jt對像的queryForXxx用于查詢數(shù)據(jù)。Jt對像的update用于執(zhí)行update,delete,insert語句。JdbcTemplete其他方法1:queryForList(sql,Class elementType),此查詢只可以包含一個字段如:String sql = “select name from person”;List list = jt.queryForList(sql,String.class);注意上面,并不是封裝成一個JavaBean對像。此方法內(nèi)部使用statement做為查詢,如果要想使用preparedstat

12、ement作為查詢,可以傳一個空的參數(shù)即:queryForList(sql,String.clsss,null);queryForMap必須是唯一的行,如果查詢有多行或是沒有行則會拋出一個異常,這一不同于DBUtils,DBUtils有多行時,只返回第一行。queryForObject,可必須要返回唯一的一行。且必須是一列,如下:String sql = select id from person where id=1;jt.queryForObject(sql,Integer.class);JdbcTemplete其他方法2:query()方法變化多端,容易讓人摸不到頭腦。以下是兩個經(jīng)常的用

13、法:List list2 = jt.query(sql,new ResultSetExtractorList()它將查詢的結(jié)果集交給回調(diào)函數(shù)ResultSetExtractor的子類加以處理:JdbcTemplete的方法3:如果需要遍歷并封裝數(shù)據(jù),Spring建議使用RowMapping進行封裝:JdbcTempate在參數(shù)不固定情況下的查詢:批處理:NamedParameterJdbcTemplate:此類支持命名的參數(shù)。但需要說明的是此類不是JdbcTemplate的子類。其他方法與JdbcTemplate一樣,只是參數(shù)類型不同,就不在舉例了。其內(nèi)部通過MapSqlParameterSo

14、urce加以實現(xiàn)。配置-注入JdbcTemplate:另一種方式注入DataSource:其他處理類:SqlUpdate用于執(zhí)行insert,update,delete和簡化操作。BatchSqlUpdate用于執(zhí)行批處理的快速操作。flush用于確定執(zhí)行sql語句。MappingSqlQuery簡化回調(diào)函數(shù)的查詢。mapRow方法使用Spring對JDBC Dao的支持類:JdbcDaoSupport在繼承了JdbcDaoSupport支持類后,可以直接使用getXxx方法操作數(shù)據(jù)庫。當然必須要在xml中注入datasource屬性。另有其他類:NamedParameterJdbcDaoSu

15、pportSimpleJdbcDaoSupport事務管理事務:用戶的一次操作只有一種結(jié)果,成功或失敗。事務ACID原子性(Atomic)原子性確保在事務中的所有操作要么都發(fā)生,要么都不發(fā)生。一致性 (Consistent)一旦一個事務結(jié)束,不論是否成功,系統(tǒng)所處的狀態(tài)和它的業(yè)務規(guī)則是一致的。隔離性(Isolated)事務應該允許多用戶操作同一個數(shù)據(jù),一名用戶的操作不會和其他用戶的操作相混淆。持久性(Durable)一旦事務完成,事務的結(jié)果應該持久化。Spring對事務管理的支持Spring和EJB一樣,不僅提供對程序控制事務管理的支持,而且提供對聲明式事務管理的支持。但是Spring的事務管

16、理功能要超過EJB的那些。以下是Spring的事務管理器:管理器類說明DataSourceTransactionManager提供對JDBC,iBatis的支持,DataSourceHibernateTransactionManager在Hibernate的支持,SessionFactorySpring的聲明式事務Spring提供了三種聲明式事務的方式。代理事務。需要使用TransactionProxyFactoryBean來代理Serivce層的實例.聲明事務。需要使用tx命名空間。(首先方式,加強學習。)注解驅(qū)動的事務。在Service層添加注解。在開始之前先了解一下事務的參數(shù):Sprin

17、g中,聲明式事務是通過事務參數(shù)來定義的。并且定義了事務的幾種傳播行為:共為分7種:Spring在TransactionDefinition接口中規(guī)定了7種類型的事務傳播行為,它們規(guī)定了事務方法和事務方法發(fā)生嵌套調(diào)用時事務如何進行傳播:事務傳播行為類型說明PROPAGATION_REQUIRED如果當前沒有事務,就新建一個事務,如果已經(jīng)存在一個事務中,加入到這個事務中。這是最常見的選擇。PROPAGATION_SUPPORTS支持當前事務,如果當前沒有事務,就以非事務方式執(zhí)行。PROPAGATION_MANDATORY使用當前的事務,如果當前沒有事務,就拋出異常。PROPAGATION_REQU

18、IRES_NEW新建事務,如果當前存在事務,把當前事務掛起。PROPAGATION_NOT_SUPPORTED以非事務方式執(zhí)行操作,如果當前存在事務,就把當前事務掛起。PROPAGATION_NEVER以非事務方式執(zhí)行,如果當前存在事務,則拋出異常。PROPAGATION_NESTED如果當前存在事務,則在嵌套事務內(nèi)執(zhí)行。如果當前沒有事務,則執(zhí)行與PROPAGATION_REQUIRED類似的操作。使用TransactionProxyFactoryBean此類被稱為代理事務Bean.此類是ProxyFactoryBean的一個特化,它們都是FactoryBean的子類。TransactionP

19、roxyFactoryBean和ProxyFactoryBean一樣,接收一個target參數(shù),用于指定被代理的Bean.同時它還接收一個TransactionManager屬性用于指定事務的管理者。同時還接收一個transactionAttributes屬性,用于指定哪些方法要添加事務。下頁是使用此類的一個實例。使用TransactionProxyFactoryBean開發(fā)步驟:書寫一個dao類,實現(xiàn)JdbcDaoSupport.以簡化開發(fā)。書寫一個service類。并注入dao.在配置文件是配置txManager-DataSourceTransactionManager.在配置文件中配置S

20、ervice.在配置文件中配置TransactionFactoryBean并注入tagert屬性。使用 TransactionProxyFactoryBean代理的事務:需要說明的是,someDaojdbc需要開發(fā)接口,否則就會轉(zhuǎn)換不成功:事務的測試代碼:Dao的代碼:測試調(diào)用代碼,注意接口的使用:在Spring中使用tx聲明事務:TransactionProxyFactoryBean的問題是會導致冗長的配置文件。在Spring中還提供了tx命名空間??梢栽谥新暶魇聞詹呗浴T谑褂脮r,我們?nèi)匀恍枰粋€事務管理者DataSourceTransactionManager.根據(jù)慣例,會自動引用一個id

21、名為transactionManager的Bean.只用于定義通知。它必須要配置共同發(fā)揮做用。命名空間:xmlns:tx= schemaLocation: /spring-tx-3.2.xsd示例:定義對某些方法添加何種事務。定義一個具體的方法。引用的定義特別說明:一般情況下,按照接口編程的原則,我們一般將切面都作用在接口上,即:cn.ITx2Service是一個接口,而不是一個實現(xiàn)類。通過下面的方法定義后,即可以按正常方式配置自己的類,將會根據(jù)配置的情況自動添加事務。使用tx,AOP配置管理事務:刪除原來對TransactionProxyBean的配置,只需要配置一個攔截點即可。規(guī)范代碼,在

22、Service層管理事務: 用tx,aop管理事務示例要求:Service層包含Service的實現(xiàn)類和接口類。Dao層包含Dao的實現(xiàn)類和接口類。給Service注入Dao的接口。在beans.xml文件中,通過aop方法切入Service的方法。項目結(jié)構(gòu)如下:Dao的代碼如下:Dao的代碼如下:Spring配置文件如下:定義注解驅(qū)動的事務:大大簡化了Spring聲明式事務所配置的代碼。但它還可以進一步簡化。除了以外,Spring還提供了元素。元素告訴Spring在類的層面上查找Transactional的bean,并對其進行事務管理。在Spring的包org.springframework

23、.transaction.annotation中,也只有Transactional這一個注解。此注解可以用在類上或是方法上。更重要的是,它經(jīng)常在接口上定義。此注解如果做用有類上,則類中所的方法都將擁有事務。如果類上沒有添加注解,只給方法上添加了注解,則只有此方法上存在事務。在Spring中開發(fā)基于注解的事務:第一步:書寫配置文件。非常簡單了已經(jīng)了。但仍然需要聲明TransactionManager.第二步:書寫Service的接口,并在接口上添加注解。附加-了解即可:在Spring中手工編寫事務:DataSourceTransactionManager是事務的管理者,用于維護一個DataSou

24、rce,真正執(zhí)行事務的類是TransactionTemplate,通常稱此類為事務模板.TransactionTemplate的execute方法用于執(zhí)行帶事務的SQL處理。同時TransactionTemplate需要維護一個DataSourceTransactionManager的成員變量 。在TransactionTemplate的execute方法中接收一個TransactionCallback.TransactionCallback可以返回指定的數(shù)據(jù),它的子類TransactionCallbackWithoutResult是沒有返回值的事務。首先讓我們看一個沒有事務的代碼:使用同一個

25、JdbcTemplate在沒有事務的情況下執(zhí)行兩個SQL語句。Spring中編寫手工事務:在一個方法中處理:在以下代碼中,使用trycatch與不使用的效果一樣,因為Spring會自動維護一個事務。在Spring編寫事務具有返回值的:使用注解現(xiàn)DI注入:Spring支持使用注解方式組裝所有Bean。Spring的命名空間用于聲明哪些包中的類將被自動搜索。Repository(value=“studentDao”)用于在Dao層面的實現(xiàn)類上聲明注解。Service(value=“studentService”)用于在Service層面的實現(xiàn)類上聲明注解。Resource(name=“dataSo

26、urce”)用于在setXxx方法或是在私有的成員上設置引用關(guān)系。通過注解組組裝Bean:Spring的配置文件如下:只需要在配置文件中添加component-scan即可以將指定包中添加了注解的類自動組裝成Bean.在Service層Dao層分別使用注解:Dao層Service層測試代碼:Spring與Hibernate集成在Spring中集成HibernateSpring支持多種ORM框架,包括Hibernate,myBatis,JPA等。選擇Hibernate的版本。Hibernate版本分為3,4。目前hibernate4與spring3整合還存在非常多的問題。大家可以選擇使用spri

27、ng3+hibernate3測試。Spring的.orm.hibernate3包,支持hibernate3.Spring的.orm.hibernate4包,支持Hibernate4.本列選擇Hibernate4。在純Hibernate項目中,SessionFactory接口獲取Session并與數(shù)據(jù)庫進行會話。而Spring的HibernateTemplate在Hibernate Session基礎(chǔ)上提供了一個抽象層。其主要功能是簡化打開和關(guān)閉Hibernate會話工作,并將Hibernate異常轉(zhuǎn)化為Spring的ORM異常之一。Spring集成Hibernate:引入Hibernate的包

28、。引入c3p0的包引入ehcache的包。由LocalSessionFactoryBean代替SessionFactory。并在此類中加入Hibernate的配置文件。引用DataSource由HibernateTemplate代替JdbcTemplate。引用LocalSessionFactory.Spring集成Hibernate核心配置:配置文件如下:在 Spring配置文件中添加dataSource的配置。配置LocalSessionFactoryBean創(chuàng)建SessionFactory。添加hibernate.cfg.xml文件。在LocalSessionFacotoryBean中添

29、加引用??蛇x的配置ehcache。項目結(jié)構(gòu):在集成時一定要仔細,否則將會.你懂得第一步:建議通過庫的方式導入各版本的包:第二步:配置Spring的配置文件如下:配置LocalSessionFactoryBean配置HibernateTransactionManager第三步:配置hibernate.cfg.xml文件在hibernate4之后,由于已經(jīng)不再支持HibernateTemplate所以必須要配置SpringSessionContext,以便于在Dao中通過 sessionFacotry().getCurrentSessoin()獲取session。第四步:【可選】如果打開了二級緩存

30、,請配置ehcache.xml 指定ehcache配置文件的位置,可選的配置ehcache的位置。/WEB-INF/conf/ehcache.xml默認在classpath:ehcache.xml文件中。第五步:開發(fā)hibernate的影射文件*.hbm.xml文件public class Teacher private Integer id;private String name;Getters.and setters第六步:開發(fā)Dao/Service/測試類以下只提供Dao的代碼:hibernate4里面已經(jīng)不建議用hibernateTemplate了 你的sessionFactory配置

31、的是hibernate4這個包下的 SessionFactory,再與spring整和就用不了 hibernateTemplate了,因為hibernate自身的API已經(jīng)足夠簡單, 直接用Session就行了第七步:【可選】測試二級緩存是否工作兩次調(diào)用同一個查詢即可:注意對get/load/save會自動放到二級緩存。但對于Criteria/Query必須要調(diào)用setCacheable(true)才可以。完!使用被注解的對像簡介Hibernate支持JPA注解和Hibernate專用注解。要使用注解,就必須要將LocalSessionFactoryBean換成AnnotationSessio

32、nFactoryBean.在一個類上,可以同時使用JPA的注解和Hibernate的注解。Hibernate的注用于完成JPA注解的不足之處。Hibernate3中使用AnnotationSessionFactoryBean支持注解。Hibernate4中默認的.hibernate4.LocalSessionFactory即已經(jīng)支持了注解。使用被注解的對像配置文件:Spring的配置文件與Hibernate.cfg.xml配置文件共同使用:Spring中的AnnotationLocalSessionFactory類給我們提供了更多的方便,它可以直接操作一個包,將其中的映射文件或是注解的類直接加

33、載為一個實體對象。同時仍然可以引用一個hibernate.cfg.xml文件。被注解的類:調(diào)用測試代碼和前面的一樣,所以測試代碼就略了吧!理解Spring對Hibernate事務管理的支持Spring和EJB一樣,不僅提供對程序控制事務管理的支持,而且提供對聲明式事務管理的支持。但是Spring的事務管理功能要超過EJB的那些。以下是Spring的事務管理器:管理器類說明DataSourceTransactionManager提供對JDBC,iBatis的支持,DataSourceHibernateTransactionManager在Hibernate的支持,SessionFactory配置

34、Hibernate事務配置Hibernate事務只需要將DataSourceTransactionManager換成HibernateTransactionManager即可。當然在配置前必須已經(jīng)配置好了SessionFactory.S2SH整合S2SH整合。CRUD。簡介:目前三大框架,已是開發(fā)的主流。在開發(fā)過程中,發(fā)揮各框架的優(yōu)勢已經(jīng)成為不二之選。一般情況下:用Struts2作為控制層。頁面和Action.用Spring做為事務處理層。一般事務都作用在Service的接口層。用Hibernate做持久處理層。它們典型的包結(jié)構(gòu)如下:整合中的其他問題:使用ehcache設置Spring Bea

35、n的緩存:第一步:建立一個公共包。在包中建立兩個類分另實現(xiàn)周圍通知和返回后通知。即:ercept.MethodInterceptororg.springframework.aop.AfterReturningAdvice并在實現(xiàn)類中添加net.sf.ehcache.Cache成員變量,即注入。第二步:在配置文件中聲明使用ehcache緩存EhCacheManagerFactoryBean和EhCacheFactoryBean。第三步:在配置文件中配置上面的周圍通知和返回后通知,并注入ehcache。第四步:使用aop元素設置切面??梢栽O置多個,對兩個通知,

36、應該設置攔截不同的方法。第五步:運行并測試即可。注意:需要很多包的支持,請大家仔細查找??偨Y(jié):Spring對數(shù)據(jù)支持中的異常轉(zhuǎn)換。Spring的數(shù)據(jù)處理模板: JdbcTemplate.Spring的數(shù)據(jù)支持類:JdbcDaoSupport.在Spring的配置文件中配置數(shù)據(jù)源: DriverManagerDataSource,dbcp,c3p0。Spring的緩存。Spring的通知,AOP.Spring事務。Spring與其他項目集成。符加:Spring 緩存簡介:Spring對各種緩存框架都做了很好的支持。在此我們選擇Ehcache作為Spring首選的緩存框架。Ehcache也廣泛應用到其他項目中,如Hibernate和web頁面緩存。Spring中提供兩個類實現(xiàn)ehcache的加載:Org.springframework.cache.ehcache.EhcacheManagerFactoryBean此類負責加載ehcache.xml配置文件。Org.springframework.cache.ehcache.EhcacheFactoryBean此類負責創(chuàng)建ehcach

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論