Spring Batch 3 - 讀數據庫寫文件

目的:通過jdbc連接讀取數據庫的記錄,寫入到單個文件中

源數據表

  • 我們還以上篇文章解析后的結果作為源數據表。
源數據源表

寫入的文本格式

  • 按照dateStr,userCode,time,path,userAgent 用逗號分隔作為一行

Spring Batch 代碼實現

依舊三部分:ItemReader、ItemProcessor、ItemWriter

  • ItemReader實現:通過JDBC連接數據庫,執行sql語句,把查詢出的結果集映射到實體類AccessBean中。Spring Batch3提供了這種場景下的ItemReader實現:org.springframework.batch.item.database.JdbcCursorItemReader
  • ItemProcessor實現:這里不對數據處理,直接寫入文件中
  • ItemWriter實現:把查詢到的數據按行組織數據,逗號分隔,寫入到輸出文件中。Spring Batch3本身實現了寫文本的ItemWriter:org.springframework.batch.item.file.FlatFileItemWriter,可以自定義數據組織和分隔符等。

我們可以看到,幾乎沒有任何實現代碼,很多事情Spring Batch都提供了默認的實現。

Spring Batch Job配置

  • Job
 <batch:job id="readDB2FileJob">
        <batch:step id="readDB2FileStep">
            <batch:tasklet>
               <batch:chunk reader="jdbcItemReader" writer="fileWriter" commit-interval="5000" ></batch:chunk>
            </batch:tasklet>
        </batch:step>
    </batch:job>
  • logReader
  <!-- jdbc Reader -->
    <bean id="jdbcItemReader" class="org.springframework.batch.item.database.JdbcCursorItemReader">
       <!-- 數據源 -->
       <property name="dataSource" ref="dataSource"></property>
       <!-- 游標一次讀多少行 -->
       <property name="fetchSize" value="5000"></property>
       <!-- 查詢sql -->
       <property name="sql">
           <value>
                <![CDATA[
                SELECT date_str, `path`, userCode, `time`, userAgent FROM access 
                ]]>
           </value>
       </property>
       <!-- 行映射對象 -->
       <property name="rowMapper">
           <bean class="org.springframework.jdbc.core.BeanPropertyRowMapper">
               <property name="mappedClass" value="com.me.springbatch.support.AccessBean"></property>
           </bean>
       </property>
    </bean>
  • fileWriter
   <!-- write to file Writer -->
    <bean id="fileWriter" class="org.springframework.batch.item.file.FlatFileItemWriter">
       <!-- 輸出文件 -->
       <property name="resource" value="file:/my/out.log"></property>
       <!-- 如果目標文件已存在,是否刪除 -->
       <property name="shouldDeleteIfExists" value="true"></property>
       <!-- 行策略 -->
       <property name="lineAggregator">
           <bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
               <!--  逗號分隔 -->
               <property name="delimiter" value=","></property>
               <property name="fieldExtractor">
                   <bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
                       <!-- 行數據(字段、順序) -->
                       <property name="names" value="dateStr,userCode,time,path,userAgent"></property>
                   </bean>
               </property>
           </bean>
       </property>
    </bean>

FlatFileItemWriter 類有一個重要的屬性就是lineAggregator,用來描述如何組織行數據的。Spring Batch提供了一個實現DelimitedLineAggregator ,在多數情況下都可以通過此類處理。

  • 運行Job
App.run("readDB2FileJob");

附完整代碼

https://git.oschina.net/heichong/spring-batch-demo

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容