我們的目標是希望在任何使用JDBC的場合都能夠利用SPRingFramework的JDBC Support Module,同時盡可能少地引入不必要的元素。因此,我們假定不使用J2EE環境提供的任何服務,也不使用SpringFramework的IoC容器和AOP兩大特性。
首先,我們需要的自然是一個DataSource。在非J2EE環境下,可以使用Jakarta的commons-dbcp來得到一個DataSource的實例。我們選擇使用SharedPoolDataSource,它提供了一個close()方法,在程序結束前調用它可以關閉所有的Connection,釋放相關的資源。
接著,將spring-core.jar和spring-dao.jar置入CLASSPATH。事實上,我們將要用到的class幾乎全部都在spring-dao.jar中,之所以需要spring-core.jar是因為NestedRuntimeException,所有JDBC Support Module中的異常都直接或間接繼續自這個Runtime Exception。由此也可以看出,我們只是在受控制的情況下引入了SpringFramework的一小部分而已。
下面,我們就可以開始逐步設置和組裝我們的基礎設施。
org.springframework.jdbc.core.JdbcTemplate
JdbcTemplate是整個package的核心,所有的JDBC調用流程都通過它來完成,開發者只需要實現對應的callback接口即可。JdbcTemplate是無狀態且線程安全的,也就是說在整個系統中只需要創建一個實例就夠了。創建它的時候需要提供DataSource作為參數。
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.afterPropertiesSet();
afterPropertiesSet()方法是對InitializingBean接口的實現,假如實例是由IoC容器治理的,則容器會自動調用。由于我們并沒有使用IoC容器,所以需要在創建實例后主動調用該方法。
org.springframework.transaction.support.TransactionTemplate
TransactionTemplate幫助我們以編程的方式實現事務控制。同樣的,開發者也是通過實現callback接口來使用它。TransactionTemplate也是無狀態且線程安全的。創建TransactionTemplate的實例需要提供一個PlatformTransactionManager的實例,在SpringFramework中有多種PlatformTransactionManager的實現類,提供多種事務控制的途徑?;谇懊嬖O定的限制,我們選擇DataSourceTransactionManager。
PlatformTransactionManager platformTransactionManager =
new DataSourceTransactionManager(dataSource);
TransactionTemplate transactionTemplate =
new TransactionTemplate(platformTransactionManager);
transactionTemplate.afterPropertiesSet();
org.springframework.jdbc.support.incrementer.DataFieldMaxValueIncrementer
在數據庫中插入數據的時候,需要獲得唯一的Long或Integer類型的值做為主鍵。DataFieldMaxValueIncrementer提供了這樣一個途徑,而具體的實現方法則因各種數據庫系統而異。簡單地說,假如數據庫系統本身提供了Sequences(例如Oracle),則直接從sequences取得所需的序列值,假如數據庫系統不支持Sequences(例如MySQL),則通過一個單獨的Table來保存和產生新的序列值。每個DataFieldMaxValueIncrementer的實例都需要有一個對應的Sequences或者Table,換句話說,開發者要選擇是整個系統共用同一個Incrementer實例,還是對應每個Table使用各自專有的Incrementer實例。目前SpringFramework已經提供了針對Oracle、DB2、PostgreSQL、MySQL,HSQL五種數據庫的實現,支持從超重量級直到超輕量級的常見數據庫系統,而且,要自己編寫針對其它數據庫系統的實現也并非難事。在例子中我們選擇使用HSQL數據庫,創建一個HsqlMaxValueIncrementer的實例需要提供DataSource、table name、column name。
新聞熱點
疑難解答