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層的異常體系。
不管採用何種持久化技術,訪問資料的流程是相對固定的。並以模版的方式定義好流程。