前面關於Spring Batch的文章,講述了SpringBatch對Flat、XML等檔案的讀寫操作,本文將和大家一起討論Spring Batch對DB的讀寫操作。Spring Batch對DB資料的讀取操作提供兩種形式,一種是以遊標為基礎,一條條的讀取資料;另外一種是分頁的方式讀取DB。
通過前面文章的講解,大家應該對SpringBatch的架構和基本配置有了一定的瞭解。為了不顯得囉嗦,本文只提供讀取DB方式的核心配置,一些輔助資訊的配置,如果不明白,可以參照前面幾講的內容。
首先是讀操作:
1 <bean:bean id="jdbcItemReader"
2 class="org.springframework.batch.item.database.JdbcCursorItemReader"
3 scope="step">
4 <bean:property name="dataSource" ref="dataSource" />
5 <bean:property name="sql"
6 value="select ID,USERID,USERNAME,PASSWORD from T_USER where id < ?" />
7 <bean:property name="rowMapper">
8 <bean:bean class="org.springframework.jdbc.core.BeanPropertyRowMapper">
9 <bean:property name="mappedClass"
10 value="jp.co.necst.eqix.batch.jdbcTwoDest.pojo.User" />
11 </bean:bean>
12 </bean:property>
13 <bean:property name="preparedStatementSetter" ref="paramStatementSetter" />
14 </bean:bean>
15
16 <bean:bean id="paramStatementSetter"
17 class="org.springframework.batch.core.resource.ListPreparedStatementSetter"
18 scope="step">
19 <bean:property name="parameters">
20 <bean:list>
21 <bean:value>#{jobParameters['id']}</bean:value>
22 </bean:list>
23 </bean:property>
24 </bean:bean>
Spring Batch對DB基於遊標的讀取資料操作,是由其核心類JdbcCursorItemReader來實現的。一般來說,從DB資料表中讀取資料一般有以下幾個步驟。首先是DB串連,這些串連DB的基本資料(像DB伺服器位址、使用者名稱、密碼等資訊)由dataSource屬性提供,SpringBatch沒有提專門供特殊的類,用的是Spring架構的DataSource。串連上了DB,下面需要關注的就是對DB具體的查詢操作了,也就是SQL文的相關資訊了,由其sql屬性實現,主要是拼接SQL文的一個字串。有了sql文,有可能需要傳遞參數,sql文參數的一些資訊,由preparedStatementSetter屬性來滿足,具體的實現可以由SpringBatch提供的核心類ListPreparedStatementSetter來設定,如代碼的16-24行。串連上了DB,執行了SQL文,最後要關心的就是查詢結果的存放問題了,這一點由JdbcCursorItemReader的rowMapper屬性來實現,如代碼的7-12行。這樣就可以將DB資料表中的資料一條條映射成我們的Pojo對象了,也就完成了讀操作。
其次是寫操作:
1 <bean:bean id="jdbcItemWriter"
2 class="org.springframework.batch.item.database.JdbcBatchItemWriter">
3 <bean:property name="dataSource" ref="dataSource" />
4 <bean:property name="sql"
5 value="insert into T_DESTUSER (ID,USERID,USERNAME,PASSWORD,UPDATETIME,UPDATEUSER)
6 values
7 (:id,:userId,:userName,:password,:updateDate,:updateUser)" />
8 <bean:property name="itemSqlParameterSourceProvider">
9 <bean:bean
10 class="org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider" />
11 </bean:property>
12 </bean:bean>
寫DB和讀DB思路是一樣的,只不過一個是從DB裡讀,一個是往DB裡寫。是由SpringBatch架構的JdbcBatchItemWriter類實現的。也有以下幾個步驟:首先是串連DB,也是由dataSource屬性提供;其次是執行的SQL文,有sql屬性滿足,最後就是如何傳遞參數了。寫操作傳遞參數的時候,跟讀操作有一定區別。寫操作提供兩種傳遞參數的方式:一種是直接傳遞一個對象進去,如上述代碼8-11行所示,itemSqlParameterSourceProvider屬性設定為BeanPropertyItemSqlParameterSourceProvider的實現就可以了。SQL文中的參數也是使用【:對象屬性名稱】的方式,如上述代碼的7行所示,並且區分大小寫。第二種傳遞參數的方式是:設定JdbcBatchItemWriter類的itemSqlParameterSourceProvider屬性(設定方式與讀操作的paramStatementSetter屬性的設定方式大同小異),當然,sql也和第一種方式有區別,使用如下形式:insert into T_DESTUSER (ID,USERID,USERNAME,PASSWORD,UPDATETIME,UPDATEUSER) values (?,?,?,?,?,?).兩種方式各有優勢,根據實際情況自行選擇。
至此,SpringBatch讀寫DB的簡單操作就介紹完了。下次將和大家一起討論開發中遇到的一些進階特性和實際問題。