




已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
,訪問數據庫,主講人:孫鑫,,Spring的DAO支持,Spring提供的DAO(數據訪問對象)支持主要的目的是便于以標準的方式使用不同的數據訪問技術, 如JDBC,Hibernate或者JDO等。它不僅可以讓你方便地在這些持久化技術間切換, 而且讓你在編碼的時候不用考慮處理各種技術中特定的異常。,,一致的異常層次,Spring提供了一種簡便的方法,把特定于某種技術的異常,如SQLException, 轉化為自己的異常,這種異常屬于以DataAccessException 為根的異常層次。這些異常封裝了原始異常對象,這樣就不會有丟失任何錯誤信息的風險。 除了對JDBC異常的封裝外,Spring也對Hibernate異常進行了封裝,把它們從一種專有的受查異常 (Hibernate3.0以前的版本),轉化為一系列抽象的運行時異常(對JDO也是這樣)。 它可以讓你輕松處理大多數持久化異常(這些異常大多是不可恢復的,而且只出現在特定 的層次),而不再需要討厭的樣板式catch/throw代碼塊和異常聲明。你仍然可以在需要 的地方捕獲并處理這些異常。就像我們上面提到的,JDBC異常(包括特定于某種數據庫 方言的異常)也可以被轉化為同樣的異常層次,這意味著你可以在一致的編程模型下,通 過JDBC來執(zhí)行某些操作。 上述情況適用于各種使用模板方式訪問ORM的版本。如果使用攔截器方式,你在應用中就得自己小心處理HibernateException、 JDOException等,最好是委托給 SessionFactoryUtils的 convertHibernateAccessException、 convertJdoAccessException等方法。這些方法可以把相應的異常轉化為與org.springframework.dao中定義的異常層次相兼容的異常。 由于JDOException是unchecked異常,它們也可以被簡單地拋出, 盡管這在異常處理方面犧牲了通用的DAO抽象。 Spring的DataAccessException異常層次位于org.springframework.dao包中。,,一致的DAO支持抽象類,為了便于以一種一致的方式使用各種數據訪問技術,如JDBC、JDO和Hibernate, Spring提供了一套抽象的DAO類供你繼承。這些抽象類提供一些方法來設置數據源,以及你正在使用的技術中專有的一些配置設定。 Dao支持類: JdbcDaoSupport - JDBC數據訪問對象的基類。需要設置數據源,同時為子類提供JdbcTemplate。 HibernateDaoSupport - Hibernate數據訪問對象的基類。需要設置SessionFactory,同時為子類提供HibernateTemplate。也可以選擇直接通過HibernateTemplate來初始化, 這樣就可以重用后者的設置,例如SessionFactory,flush的方式,異常解釋器等等。 JdoDaoSupport - JDO數據訪問對象的基類。需要設置PersistenceManagerFactory,同時為子類提供JdoTemplate。,,配置數據源,為了對數據庫進行JDBC操作,你必須首先得到一個數據庫連接。你可以采用傳統的數據庫訪問方式,通過Class.forName()來加載與注冊數據庫驅動,然后通過DriverManager.getConnection()來得到數據庫連接。然而采用這種方式,你需要自己去管理數據庫連接,無法得到數據源的好處。在Spring的DAO框架中,Connection對象是通過DataSource得到的。Spring提供了幾種選擇讓你的應用程序獲得DataSource。,,使用DriverManagerDataSource,Spring發(fā)行版提供一個非常輕量級的DataSource實現:DriverManagerDataSource,這個類對于脫離Web容器的單元測試是十分便利的。在產品階段我們還是應該使用功能更為強大的第三方的數據源實現。 DriverManagerDataSource和傳統的方式一樣獲取JDBC連接。 下面這個例子說明如何配置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得到數據源, java:comp/env/jdbc/bookstore ,,創(chuàng)建一個DataSource連接池,Jakarta Commons DBCP是一套開放源代碼的數據庫連接池項目。你可以從下面網址處下載: /commons/dbcp 使用Jakarta Commons DBCP項目中的BasicDataSource類的例子如下:, com.mysql.jdbc.Driver root 1234 ,,模板方法模式,模板方法模式是類的行為模式(GOF95)。準備一個抽象類,將部分邏輯以具體方法以及具體構造方法的形式實現;然后聲明一些抽象方法來迫使子類實現剩余的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩余的邏輯有不同的實現。這就是模板方法模式的用意。(參見Java與模式P641) 模板方法中的方法可以分為兩大類:模板方法(Template Method)和基本方法(Primitive Method)。 模板方法的實現可以有兩種,一種是通過抽象方法來實現,子類繼承父類,重寫抽象方法;另一種是將具體的實現委托給一個接口,這個接口的不同實現定義了邏輯的具體實現。,,在Spring中使用JDBC使用JdbcTemplate,Spring的JDBC框架承擔了資源管理和錯誤處理的重擔,使你的JDBC代碼非常干凈。它把你從書寫statement和查詢語句來讀寫數據庫中解放出來。 所有Spring的數據訪問框架都結合了模板類,在這里,就是JdbcTemplate,該類需要一個DataSource實例。 所有的Spring DAO模板類都是線程安全的,在我們的應用中,對于每個DataSource我們只需要一個JdbcTemplate實例。要使用JdbcTemplate,你的每一個DAO類都需要配置一個JdbcTemplate的實例。,,使用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,實現org.springframework.jdbc.core.SqlProvider接口,以提供SQL字符串。 典型地被PreparedStatementCreator、CallableStatementCreator和StatementCallback所實現,想要暴露它們用于創(chuàng)建Statement的SQL語句,允許在發(fā)生異常時提供更好的上下文信息。,,批量更新,批量更新可以使用org.springframework.jdbc.core.BatchPreparedStatementSetter接口。該接口有兩個方法,如下: int getBatchSize() 返回批量處理語句的數目。 void setValues(PreparedStatement ps, int i) throws SQLException 在給定的PreparedStatement對象ps上設置值。 在JdbcTemplate類中提供了兩個用于批量更新的方法: public int batchUpdate(String sql) throws DataAccessException public int batchUpdate(String sql, BatchPreparedStatementSetter pss) throws DataAccessException,,讀取數據,獲取數據主要使用JdbcTemplate的query()方法,我們先看下面的兩個方法: public Object query(String sql, ResultSetExtractor rse) throws DataAccessException public void query(String sql, RowCallbackHandler rch) throws DataAccessException ResultSetExtractor接口主要在JDBC框架內部使用,它只有一個方法: Object extractData(ResultSet rs) throws SQLException, DataAccessException RowCallbackHandler接口也只有一個方法: void processRow(ResultSet rs) throws SQLException ResultSetExtractor接口和RowCallbackHandler接口的區(qū)別是,一個ResultSetExtractor對象是典型的無狀態(tài)的,可以重復使用,只要它不訪問有狀態(tài)的資源(就象LOB內容輸出流)或者在對象中保持結果狀態(tài)。一個RowCallbackHandler對象是典型的有狀態(tài)的,它在對象中保持結果狀態(tài),對于稍后的檢查是可利用的。 這兩個接口都只是用于取出單條記錄。,,使用RowMapper接口,JdbcTempalte使用RowMapper接口來映射返回的結果集。 RowMapper接口典型的或者用于JdbcTemplate的query方法(和RowMapperResultSetExtractor適配器類一起),或者用于存儲過程的輸出參數。RowMapper對象典型是無狀態(tài)的,因此可以重復使用;在單獨的地方實現行映射(row-mapping),它們是理想的選擇。該接口只有一個方法: Object mapRow(ResultSet rs, int rowNum) throws SQLException 在程序中使用RowMapper接口,Spring框架將會使用RowMapperResultSetExtractor適配器類。,,RowMapperResultSetExtractor類,RowMapperResultSetExtractor類實現了ResultSetExtractor接口,是ResultSetExtractor接口的適配器實現,委派給RowMapper對象,該對象為每一行創(chuàng)建一個對象。每一個對象被添加到ResultSetExtractor的結果列表中。 RowMapperResultSetExtractor類可以獲取數據庫表中所有的行記錄,或者獲取指定行的記錄。 注意,RowMapper對象是典型無狀態(tài)的,因此可以重復使用,只是RowMapperResultSetExtractor適配器是有狀態(tài)的。 RowMapperResultSetExtractor有兩個重載的構造方法: public (RowMapper rowMapper) public RowMapperResultSetExtractor(RowMapper rowMapper, int rowsExpected) 第二個構造方法的rowsExpected參數指定預期返回的行數。注意,這個參數并不是用于指定返回的行數,這個參數僅僅是用于集合處理的優(yōu)化。,,返回簡單類型的查詢,使用JdbcTemplate類的queryForXXX()方法。,,調用存儲過程,Spring提供了CallableStatementCallback接口來執(zhí)行存儲過程的回調。該接口只有一個方法: Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException CallableStatementCallback接口被JdbcTemplate內部使用,但是對應用程序代碼也是有用的。注意,傳入的CallableStatement可以被框架所創(chuàng)建,也可以被定制的CallableStatementCreator創(chuàng)建。然而,后者幾乎從來不需要。 可以用JdbcTemplate類的下列兩個方法來執(zhí)行存儲過程。 public Object execute(CallableStatementCreator csc, CallableStatementCallback action) throws DataAccessException public Object execute(String callString,CallableStatementCallback action) throws DataAccessException,,把JDBC操作建模成對象,org.springframework.jdbc.object包由一些允許你以更面向對象的方式訪問數據庫的類組成。你可以執(zhí)行查詢并獲得一個包含業(yè)務對象的List,查詢出的關系數據的字段值被映射為業(yè)務對象的屬性。你也可以執(zhí)行存儲過程,更新,刪除和插入操作。 Spring提供了讀寫數據的類。這些數據庫對象是線程安全的,意味著對于每個數據庫操作,你只需創(chuàng)建一個實例。 此外,這些數據庫操作對象必須在運行前先編譯一下,這樣就讓對象知道什么時候可以預備statement,以便在稍后能執(zhí)行它們。,,SqlUpdate,org.springframework.jdbc.object.SqlUpdate是RdbmsOperation的子類,表示一個SQL更新。 這個類提供了許多update()方法,類似于查詢對象的execute()方法。 這個類是具體的。通過SQL設定和參數聲明,它可以很容易的參數化,雖然它也可以子類化 (例如增加自定義update方法)。,,SqlQuery,這是一個表示SQL查詢的可重用的而且線程安全的對象。子類必須實現newRowMapper ()方法將每一行映射為一個對象,該對象將作為List中的一個元素被SqlQuery的execute()方法返回。這個類很少被直接使用,而使用它的子類MappingSqlQuery,它提供了更多的方法將數據行映射到Java類。MappingSqlQueryWithParameters 和UpdatableSqlQuery是繼承SqlQuery的另外兩個實現。,,MappingSqlQuery,MappingSqlQuery是一個可以重用的查詢對象, 它的子類必須實現抽象方法mapRow(ResultSet, int)來把JDBC ResultSet的每一行轉換成一個對象。 在所有的SqlQuery實現中,這個類是最常使用并且也是最容易使用的。,,StoredProcedure,這是RDBMS存儲過程的對象抽象的超類。它是一個抽象類,它的執(zhí)行方法都是protected的, 以避免被直接調用,而只能通過提供更嚴格形式的子類調用。 繼承的sql屬性是RDBMS中存儲過程的名字。注意JDBC3.0引入了命名的參數,雖然這個類中提供的其他功能在JDBC3.0中也是必要的。 下面是一段例子程序,它調用Oracle數據庫提供的函數sysdate()。 要使用存儲過程的功能,你必須創(chuàng)建一個繼承StoredProcedure的子類。在這個例子中沒有任何輸入參數,但需要使用SqlOutParameter類聲明一個date型的輸出參數。 execute()方法返回一個map,對于每一個被聲明的輸出參數在map中都有一個條目,參數的名字作為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封裝返回單一結果行的查詢。默認的情況返回一個int,當然我們可以覆蓋它,通過使用帶有額外返回類型參數的方法。這和使用JdbcTemplate的 queryForXxx方法很相似。使用SqlFunction的好處是你不必創(chuàng)建JdbcTemplate,它在后臺自動進行。 這個類的目的是用于調用SQL function,使用像“select user
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 科級護理管理組織
- 重癥超聲右心功能評估
- 垃圾處理設施安全責任書廢物處置與環(huán)境保護版
- 高科技園區(qū)場地租賃及配套設施建設合作協議
- 商業(yè)大廈清潔服務外包合同
- 高強度不銹鋼駁接爪研發(fā)與市場推廣協議
- 多元化餐飲業(yè)態(tài)合伙人合作協議范本
- 公共停車場場地使用與管理合同范本
- 民宿產業(yè)場地無償使用協議
- 創(chuàng)新型產業(yè)園區(qū)廠房土地使用權轉讓合同
- 淺析火災延伸調查工作指引
- 2024精麻藥品培訓知識試題庫及答案(完整版)
- 2024年吉林長春市中考地理試卷真題(含答案解析)
- 2024年湖北黃岡市檢察機關招聘雇員制檢察輔助人員50人歷年(高頻重點復習提升訓練)共500題附帶答案詳解
- 2024國家開放大學《大學語文》網上課程1-5形考任務附答案
- 《小型水庫雨水情測報和大壩安全監(jiān)測設施建設與運行管護技術指南》
- 2024年小區(qū)地下車位租賃合同
- 光伏系統在智能溫室大棚中的設計與應用
- 2023-2024學年云南省昆明市高一下學期期中考試化學檢測試題(含答案)
- 體育賽事醫(yī)療保障方案
- 進口肉類項目商業(yè)計劃書(2024-2030)
評論
0/150
提交評論