目的:通過jdbc連接讀取數(shù)據(jù)庫的記錄晴弃,寫入到單個文件中
源數(shù)據(jù)表
- 我們還以上篇文章解析后的結(jié)果作為源數(shù)據(jù)表。
源數(shù)據(jù)源表
寫入的文本格式
- 按照dateStr,userCode,time,path,userAgent 用逗號分隔作為一行
Spring Batch 代碼實現(xiàn)
依舊三部分:ItemReader焰络、ItemProcessor胧后、ItemWriter
-
ItemReader實現(xiàn):通過JDBC連接數(shù)據(jù)庫尊沸,執(zhí)行sql語句俊犯,把查詢出的結(jié)果集映射到實體類
AccessBean
中妇多。Spring Batch3提供了這種場景下的ItemReader實現(xiàn):org.springframework.batch.item.database.JdbcCursorItemReader
。 - ItemProcessor實現(xiàn):這里不對數(shù)據(jù)處理燕侠,直接寫入文件中
-
ItemWriter實現(xiàn):把查詢到的數(shù)據(jù)按行組織數(shù)據(jù)者祖,逗號分隔,寫入到輸出文件中绢彤。Spring Batch3本身實現(xiàn)了寫文本的ItemWriter:
org.springframework.batch.item.file.FlatFileItemWriter
七问,可以自定義數(shù)據(jù)組織和分隔符等。
我們可以看到杖虾,幾乎沒有任何實現(xiàn)代碼烂瘫,很多事情Spring Batch都提供了默認(rèn)的實現(xiàn)媒熊。
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">
<!-- 數(shù)據(jù)源 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 游標(biāo)一次讀多少行 -->
<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>
<!-- 如果目標(biāo)文件已存在奇适,是否刪除 -->
<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">
<!-- 行數(shù)據(jù)(字段、順序) -->
<property name="names" value="dateStr,userCode,time,path,userAgent"></property>
</bean>
</property>
</bean>
</property>
</bean>
FlatFileItemWriter
類有一個重要的屬性就是lineAggregator
,用來描述如何組織行數(shù)據(jù)的芦鳍。Spring Batch提供了一個實現(xiàn)DelimitedLineAggregator
嚷往,在多數(shù)情況下都可以通過此類處理。
- 運行Job
App.run("readDB2FileJob");