1. 程式人生 > >spring3.x第八章 Spring對DAO的支援

spring3.x第八章 Spring對DAO的支援

8.1 Spring的DAO理念

  DAO(Data Access Object)用於訪問資料的物件,雖然我們在大多數情況下,將資料儲存在資料庫中,但使用者也可以將資料儲存到檔案中或LDAP中,DAO不但遮蔽了資料儲存的最終介質的不同,也遮蔽了具體的實現技術的不同。

8.2 統一的異常體系

  Spring提供了一套和實現技術無關的、面向DAO層語義的異常體系,並通過轉換器將不同持久化技術的異常轉換成Spring的異常。

8.2.1 Spring的DAO異常體系

  Spring的異常體系都是建立在執行期異常的基礎上,開發者可以根據需要捕捉感興趣的異常。

8.2.2 JDBC的異常轉換器

  傳統的JDBC API在發生幾乎所有的資料操作問題都丟擲相同的SQLException,它將異常的細節性資訊封裝在異常屬性中:錯誤碼(getErrorCode())和SQL狀態碼(getSQLState())。

8.2.3 其他持久技術的異常轉換器

  在org.springframework.orm包中。

8.3 統一資料訪問模板

8.3.1 使用模板和回撥機制

  JDBC資料訪問操作按一下的流程進行:
  1.準備資源
  2.啟動事務
  3.在事務中執行具體資料訪問操作
  4.提交/回滾事務
  5.關閉資源,處理異常
  按照傳統的方式,編寫任何帶事務的資料訪問的程式時,都需要重複編寫上面的程式碼。

8.3.2 Spring為不同持久化技術所提供的模板類

  所有的支援類都是abstract的,其目的使希望被繼承使用,而非直接使用。

8.4 資料來源

8.4.1 配置一個數據源

  Spring在第三方依賴包中包含了兩個資料來源的實現類包:其一是Apache的DBCP;其而是C3P0。可以在Spring配置檔案中利用這兩者中的任何一個配置資料來源。

  DBCP資料來源

  DBCP是一個依賴commons-pool物件池機制的資料庫連線池。

<bean id="dataSource"
    class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close" p:driverClassName="com.mysql.jdbc.Driver" p:url="jdbc:mysql://localhost:.3309/sampledb" p:username="root" p:password="123456" />

  BasicDataSource提供了close方法關閉資料來源,所以必須設定destroy-method=”close”屬性。

  C3P0資料來源
<bean id="dataSource"
    class="com.mchange.v2.c3p0.ComboPooledDataSource"
    destroy-method="close"
    p:driverClass="oracle.jdbc.driver.OracleDriver"
    p:jdbcUrl="jdbc:oracle:thin:@localhost:1521:ora9i"
    p:username="root"
    p:password="123456" />
  使用屬性檔案
<context:property-placeholder location="/WEB-INF/jdbc.properties" />
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destory-method="close"
    p:driverClassName="${jdbc.driverClassName}"
    p:url="${jdbc.url}"
    p:username="${jdbc.username}"
    p:password="${jdbc.password}"

  在jdbc.properties屬性檔案中定義屬性值

jdbc.driverClassName=com.mysql.jdbc.Driver
...
8.4.2 獲取JNDI資料來源

  如果應用配置在高效能的應用伺服器(如WebLogic或Websphere等)上,我們可能更希望使用應用伺服器本身提供的資料來源。

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"
    p:jndiName="java:comp/env/jdbc/bbt" />
8.4.3 Spring的資料來源實現類

  DriverManagerDataSource,沒有提供池化連線的機制,每次呼叫getConnection()獲取新連線時,只是簡單地建立一個新的連線,用於單元測試。

DriverManagerDataSource ds = new DriverManagerDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/sampledb");
ds.setUsername("root");
ds.setPassword("123456");
Connection actualCon = ds.getConnection();

8.5 小結

  Spring支援目前大多數常用的資料持久化技術,定義了一套面向DAO層的異常體系。
  不管採用何種持久化技術,訪問資料的流程是相對固定的。並以模版的方式定義好流程。