SSHSpring訪問(wèn)數(shù)據(jù)庫(kù).ppt_第1頁(yè)
SSHSpring訪問(wèn)數(shù)據(jù)庫(kù).ppt_第2頁(yè)
SSHSpring訪問(wèn)數(shù)據(jù)庫(kù).ppt_第3頁(yè)
SSHSpring訪問(wèn)數(shù)據(jù)庫(kù).ppt_第4頁(yè)
SSHSpring訪問(wèn)數(shù)據(jù)庫(kù).ppt_第5頁(yè)
已閱讀5頁(yè),還剩24頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

,訪問(wèn)數(shù)據(jù)庫(kù),主講人:孫鑫,,Spring的DAO支持,Spring提供的DAO(數(shù)據(jù)訪問(wèn)對(duì)象)支持主要的目的是便于以標(biāo)準(zhǔn)的方式使用不同的數(shù)據(jù)訪問(wèn)技術(shù), 如JDBC,Hibernate或者JDO等。它不僅可以讓你方便地在這些持久化技術(shù)間切換, 而且讓你在編碼的時(shí)候不用考慮處理各種技術(shù)中特定的異常。,,一致的異常層次,Spring提供了一種簡(jiǎn)便的方法,把特定于某種技術(shù)的異常,如SQLException, 轉(zhuǎn)化為自己的異常,這種異常屬于以DataAccessException 為根的異常層次。這些異常封裝了原始異常對(duì)象,這樣就不會(huì)有丟失任何錯(cuò)誤信息的風(fēng)險(xiǎn)。 除了對(duì)JDBC異常的封裝外,Spring也對(duì)Hibernate異常進(jìn)行了封裝,把它們從一種專有的受查異常 (Hibernate3.0以前的版本),轉(zhuǎn)化為一系列抽象的運(yùn)行時(shí)異常(對(duì)JDO也是這樣)。 它可以讓你輕松處理大多數(shù)持久化異常(這些異常大多是不可恢復(fù)的,而且只出現(xiàn)在特定 的層次),而不再需要討厭的樣板式catch/throw代碼塊和異常聲明。你仍然可以在需要 的地方捕獲并處理這些異常。就像我們上面提到的,JDBC異常(包括特定于某種數(shù)據(jù)庫(kù) 方言的異常)也可以被轉(zhuǎn)化為同樣的異常層次,這意味著你可以在一致的編程模型下,通 過(guò)JDBC來(lái)執(zhí)行某些操作。 上述情況適用于各種使用模板方式訪問(wèn)ORM的版本。如果使用攔截器方式,你在應(yīng)用中就得自己小心處理HibernateException、 JDOException等,最好是委托給 SessionFactoryUtils的 convertHibernateAccessException、 convertJdoAccessException等方法。這些方法可以把相應(yīng)的異常轉(zhuǎn)化為與org.springframework.dao中定義的異常層次相兼容的異常。 由于JDOException是unchecked異常,它們也可以被簡(jiǎn)單地拋出, 盡管這在異常處理方面犧牲了通用的DAO抽象。 Spring的DataAccessException異常層次位于org.springframework.dao包中。,,一致的DAO支持抽象類,為了便于以一種一致的方式使用各種數(shù)據(jù)訪問(wèn)技術(shù),如JDBC、JDO和Hibernate, Spring提供了一套抽象的DAO類供你繼承。這些抽象類提供一些方法來(lái)設(shè)置數(shù)據(jù)源,以及你正在使用的技術(shù)中專有的一些配置設(shè)定。 Dao支持類: JdbcDaoSupport - JDBC數(shù)據(jù)訪問(wèn)對(duì)象的基類。需要設(shè)置數(shù)據(jù)源,同時(shí)為子類提供JdbcTemplate。 HibernateDaoSupport - Hibernate數(shù)據(jù)訪問(wèn)對(duì)象的基類。需要設(shè)置SessionFactory,同時(shí)為子類提供HibernateTemplate。也可以選擇直接通過(guò)HibernateTemplate來(lái)初始化, 這樣就可以重用后者的設(shè)置,例如SessionFactory,flush的方式,異常解釋器等等。 JdoDaoSupport - JDO數(shù)據(jù)訪問(wèn)對(duì)象的基類。需要設(shè)置PersistenceManagerFactory,同時(shí)為子類提供JdoTemplate。,,配置數(shù)據(jù)源,為了對(duì)數(shù)據(jù)庫(kù)進(jìn)行JDBC操作,你必須首先得到一個(gè)數(shù)據(jù)庫(kù)連接。你可以采用傳統(tǒng)的數(shù)據(jù)庫(kù)訪問(wèn)方式,通過(guò)Class.forName()來(lái)加載與注冊(cè)數(shù)據(jù)庫(kù)驅(qū)動(dòng),然后通過(guò)DriverManager.getConnection()來(lái)得到數(shù)據(jù)庫(kù)連接。然而采用這種方式,你需要自己去管理數(shù)據(jù)庫(kù)連接,無(wú)法得到數(shù)據(jù)源的好處。在Spring的DAO框架中,Connection對(duì)象是通過(guò)DataSource得到的。Spring提供了幾種選擇讓你的應(yīng)用程序獲得DataSource。,,使用DriverManagerDataSource,Spring發(fā)行版提供一個(gè)非常輕量級(jí)的DataSource實(shí)現(xiàn):DriverManagerDataSource,這個(gè)類對(duì)于脫離Web容器的單元測(cè)試是十分便利的。在產(chǎn)品階段我們還是應(yīng)該使用功能更為強(qiáng)大的第三方的數(shù)據(jù)源實(shí)現(xiàn)。 DriverManagerDataSource和傳統(tǒng)的方式一樣獲取JDBC連接。 下面這個(gè)例子說(shuō)明如何配置DriverManagerDataSource: DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName( “com.mysql.jdbc.Driver“); dataSource.setUrl( “jdbc:mysql:/localhost:3306/bookstore“); dataSource.setUsername(“root“); dataSource.setPassword(“1234“);,, com.mysql.jdbc.Driver jdbc:mysql:/localhost:3306/bookstore root 1234 ,,從JNDI得到數(shù)據(jù)源, java:comp/env/jdbc/bookstore ,,創(chuàng)建一個(gè)DataSource連接池,Jakarta Commons DBCP是一套開(kāi)放源代碼的數(shù)據(jù)庫(kù)連接池項(xiàng)目。你可以從下面網(wǎng)址處下載: /commons/dbcp 使用Jakarta Commons DBCP項(xiàng)目中的BasicDataSource類的例子如下:, com.mysql.jdbc.Driver root 1234 ,,模板方法模式,模板方法模式是類的行為模式(GOF95)。準(zhǔn)備一個(gè)抽象類,將部分邏輯以具體方法以及具體構(gòu)造方法的形式實(shí)現(xiàn);然后聲明一些抽象方法來(lái)迫使子類實(shí)現(xiàn)剩余的邏輯。不同的子類可以以不同的方式實(shí)現(xiàn)這些抽象方法,從而對(duì)剩余的邏輯有不同的實(shí)現(xiàn)。這就是模板方法模式的用意。(參見(jiàn)Java與模式P641) 模板方法中的方法可以分為兩大類:模板方法(Template Method)和基本方法(Primitive Method)。 模板方法的實(shí)現(xiàn)可以有兩種,一種是通過(guò)抽象方法來(lái)實(shí)現(xiàn),子類繼承父類,重寫(xiě)抽象方法;另一種是將具體的實(shí)現(xiàn)委托給一個(gè)接口,這個(gè)接口的不同實(shí)現(xiàn)定義了邏輯的具體實(shí)現(xiàn)。,,在Spring中使用JDBC使用JdbcTemplate,Spring的JDBC框架承擔(dān)了資源管理和錯(cuò)誤處理的重?fù)?dān),使你的JDBC代碼非常干凈。它把你從書(shū)寫(xiě)statement和查詢語(yǔ)句來(lái)讀寫(xiě)數(shù)據(jù)庫(kù)中解放出來(lái)。 所有Spring的數(shù)據(jù)訪問(wèn)框架都結(jié)合了模板類,在這里,就是JdbcTemplate,該類需要一個(gè)DataSource實(shí)例。 所有的Spring DAO模板類都是線程安全的,在我們的應(yīng)用中,對(duì)于每個(gè)DataSource我們只需要一個(gè)JdbcTemplate實(shí)例。要使用JdbcTemplate,你的每一個(gè)DAO類都需要配置一個(gè)JdbcTemplate的實(shí)例。,,使用JdbcTemplate,JdbcTemplate類定義了許多重載的execute()方法,如下所示: public Object execute(CallableStatementCreator csc, CallableStatementCallback action) throws DataAccessException public Object execute(ConnectionCallback action) throws DataAccessException public Object execute(StatementCallback action) throws DataAccessException public void execute(String sql) throws DataAccessException public Object execute(String callString, CallableStatementCallback action) throws DataAccessException public Object execute(String sql, PreparedStatementCallback action) throws DataAccessException public Object execute(PreparedStatementCreator psc, PreparedStatementCallback action) throws DataAccessException 還有很多query()和update()方法,參看API文檔。,,使用JdbcTemplate,StatementCallback PreparedStatementCreator PreparedStatementCallback PreparedStatementSetter,,SqlProvider,實(shí)現(xiàn)org.springframework.jdbc.core.SqlProvider接口,以提供SQL字符串。 典型地被PreparedStatementCreator、CallableStatementCreator和StatementCallback所實(shí)現(xiàn),想要暴露它們用于創(chuàng)建Statement的SQL語(yǔ)句,允許在發(fā)生異常時(shí)提供更好的上下文信息。,,批量更新,批量更新可以使用org.springframework.jdbc.core.BatchPreparedStatementSetter接口。該接口有兩個(gè)方法,如下: int getBatchSize() 返回批量處理語(yǔ)句的數(shù)目。 void setValues(PreparedStatement ps, int i) throws SQLException 在給定的PreparedStatement對(duì)象ps上設(shè)置值。 在JdbcTemplate類中提供了兩個(gè)用于批量更新的方法: public int batchUpdate(String sql) throws DataAccessException public int batchUpdate(String sql, BatchPreparedStatementSetter pss) throws DataAccessException,,讀取數(shù)據(jù),獲取數(shù)據(jù)主要使用JdbcTemplate的query()方法,我們先看下面的兩個(gè)方法: public Object query(String sql, ResultSetExtractor rse) throws DataAccessException public void query(String sql, RowCallbackHandler rch) throws DataAccessException ResultSetExtractor接口主要在JDBC框架內(nèi)部使用,它只有一個(gè)方法: Object extractData(ResultSet rs) throws SQLException, DataAccessException RowCallbackHandler接口也只有一個(gè)方法: void processRow(ResultSet rs) throws SQLException ResultSetExtractor接口和RowCallbackHandler接口的區(qū)別是,一個(gè)ResultSetExtractor對(duì)象是典型的無(wú)狀態(tài)的,可以重復(fù)使用,只要它不訪問(wèn)有狀態(tài)的資源(就象LOB內(nèi)容輸出流)或者在對(duì)象中保持結(jié)果狀態(tài)。一個(gè)RowCallbackHandler對(duì)象是典型的有狀態(tài)的,它在對(duì)象中保持結(jié)果狀態(tài),對(duì)于稍后的檢查是可利用的。 這兩個(gè)接口都只是用于取出單條記錄。,,使用RowMapper接口,JdbcTempalte使用RowMapper接口來(lái)映射返回的結(jié)果集。 RowMapper接口典型的或者用于JdbcTemplate的query方法(和RowMapperResultSetExtractor適配器類一起),或者用于存儲(chǔ)過(guò)程的輸出參數(shù)。RowMapper對(duì)象典型是無(wú)狀態(tài)的,因此可以重復(fù)使用;在單獨(dú)的地方實(shí)現(xiàn)行映射(row-mapping),它們是理想的選擇。該接口只有一個(gè)方法: Object mapRow(ResultSet rs, int rowNum) throws SQLException 在程序中使用RowMapper接口,Spring框架將會(huì)使用RowMapperResultSetExtractor適配器類。,,RowMapperResultSetExtractor類,RowMapperResultSetExtractor類實(shí)現(xiàn)了ResultSetExtractor接口,是ResultSetExtractor接口的適配器實(shí)現(xiàn),委派給RowMapper對(duì)象,該對(duì)象為每一行創(chuàng)建一個(gè)對(duì)象。每一個(gè)對(duì)象被添加到ResultSetExtractor的結(jié)果列表中。 RowMapperResultSetExtractor類可以獲取數(shù)據(jù)庫(kù)表中所有的行記錄,或者獲取指定行的記錄。 注意,RowMapper對(duì)象是典型無(wú)狀態(tài)的,因此可以重復(fù)使用,只是RowMapperResultSetExtractor適配器是有狀態(tài)的。 RowMapperResultSetExtractor有兩個(gè)重載的構(gòu)造方法: public (RowMapper rowMapper) public RowMapperResultSetExtractor(RowMapper rowMapper, int rowsExpected) 第二個(gè)構(gòu)造方法的rowsExpected參數(shù)指定預(yù)期返回的行數(shù)。注意,這個(gè)參數(shù)并不是用于指定返回的行數(shù),這個(gè)參數(shù)僅僅是用于集合處理的優(yōu)化。,,返回簡(jiǎn)單類型的查詢,使用JdbcTemplate類的queryForXXX()方法。,,調(diào)用存儲(chǔ)過(guò)程,Spring提供了CallableStatementCallback接口來(lái)執(zhí)行存儲(chǔ)過(guò)程的回調(diào)。該接口只有一個(gè)方法: Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException CallableStatementCallback接口被JdbcTemplate內(nèi)部使用,但是對(duì)應(yīng)用程序代碼也是有用的。注意,傳入的CallableStatement可以被框架所創(chuàng)建,也可以被定制的CallableStatementCreator創(chuàng)建。然而,后者幾乎從來(lái)不需要。 可以用JdbcTemplate類的下列兩個(gè)方法來(lái)執(zhí)行存儲(chǔ)過(guò)程。 public Object execute(CallableStatementCreator csc, CallableStatementCallback action) throws DataAccessException public Object execute(String callString,CallableStatementCallback action) throws DataAccessException,,把JDBC操作建模成對(duì)象,org.springframework.jdbc.object包由一些允許你以更面向?qū)ο蟮姆绞皆L問(wèn)數(shù)據(jù)庫(kù)的類組成。你可以執(zhí)行查詢并獲得一個(gè)包含業(yè)務(wù)對(duì)象的List,查詢出的關(guān)系數(shù)據(jù)的字段值被映射為業(yè)務(wù)對(duì)象的屬性。你也可以執(zhí)行存儲(chǔ)過(guò)程,更新,刪除和插入操作。 Spring提供了讀寫(xiě)數(shù)據(jù)的類。這些數(shù)據(jù)庫(kù)對(duì)象是線程安全的,意味著對(duì)于每個(gè)數(shù)據(jù)庫(kù)操作,你只需創(chuàng)建一個(gè)實(shí)例。 此外,這些數(shù)據(jù)庫(kù)操作對(duì)象必須在運(yùn)行前先編譯一下,這樣就讓對(duì)象知道什么時(shí)候可以預(yù)備statement,以便在稍后能執(zhí)行它們。,,SqlUpdate,org.springframework.jdbc.object.SqlUpdate是RdbmsOperation的子類,表示一個(gè)SQL更新。 這個(gè)類提供了許多update()方法,類似于查詢對(duì)象的execute()方法。 這個(gè)類是具體的。通過(guò)SQL設(shè)定和參數(shù)聲明,它可以很容易的參數(shù)化,雖然它也可以子類化 (例如增加自定義update方法)。,,SqlQuery,這是一個(gè)表示SQL查詢的可重用的而且線程安全的對(duì)象。子類必須實(shí)現(xiàn)newRowMapper ()方法將每一行映射為一個(gè)對(duì)象,該對(duì)象將作為L(zhǎng)ist中的一個(gè)元素被SqlQuery的execute()方法返回。這個(gè)類很少被直接使用,而使用它的子類MappingSqlQuery,它提供了更多的方法將數(shù)據(jù)行映射到Java類。MappingSqlQueryWithParameters 和UpdatableSqlQuery是繼承SqlQuery的另外兩個(gè)實(shí)現(xiàn)。,,MappingSqlQuery,MappingSqlQuery是一個(gè)可以重用的查詢對(duì)象, 它的子類必須實(shí)現(xiàn)抽象方法mapRow(ResultSet, int)來(lái)把JDBC ResultSet的每一行轉(zhuǎn)換成一個(gè)對(duì)象。 在所有的SqlQuery實(shí)現(xiàn)中,這個(gè)類是最常使用并且也是最容易使用的。,,StoredProcedure,這是RDBMS存儲(chǔ)過(guò)程的對(duì)象抽象的超類。它是一個(gè)抽象類,它的執(zhí)行方法都是protected的, 以避免被直接調(diào)用,而只能通過(guò)提供更嚴(yán)格形式的子類調(diào)用。 繼承的sql屬性是RDBMS中存儲(chǔ)過(guò)程的名字。注意JDBC3.0引入了命名的參數(shù),雖然這個(gè)類中提供的其他功能在JDBC3.0中也是必要的。 下面是一段例子程序,它調(diào)用Oracle數(shù)據(jù)庫(kù)提供的函數(shù)sysdate()。 要使用存儲(chǔ)過(guò)程的功能,你必須創(chuàng)建一個(gè)繼承StoredProcedure的子類。在這個(gè)例子中沒(méi)有任何輸入?yún)?shù),但需要使用SqlOutParameter類聲明一個(gè)date型的輸出參數(shù)。 execute()方法返回一個(gè)map,對(duì)于每一個(gè)被聲明的輸出參數(shù)在map中都有一個(gè)條目,參數(shù)的名字作為key。,,private class MyStoredProcedure extends StoredProcedure public static final String SQL = “sysdate“; public MyStoredProcedure(DataSource ds) setDataSource(ds); setFunction(true); setSql(SQL); declareParameter(new SqlOutParameter(“date“, Types.DATE); compile(); public Map execute() Map out = execute(new HashMap(); return out; ,,SqlFunction,SqlFunction封裝返回單一結(jié)果行的查詢。默認(rèn)的情況返回一個(gè)int,當(dāng)然我們可以覆蓋它,通過(guò)使用帶有額外返回類型參數(shù)的方法。這和使用JdbcTemplate的 queryForXxx方法很相似。使用SqlFunction的好處是你不必創(chuàng)建JdbcTemplate,它在后臺(tái)自動(dòng)進(jìn)行。 這個(gè)類的目的是用于調(diào)用SQL function,使用像“select user

溫馨提示

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

評(píng)論

0/150

提交評(píng)論