Spring 更新不同表的批处理作业

Spring batch job to update different tables

我正在阅读文章 http://spring.io/guides/gs/batch-processing/,其中解释了读取 csv 并将其写回数据库。我想知道如何读取多个 CSV 文件,比如 A.csv、B.csv 等,然后将内容写回相应的 tables table_A、table_B 等。请注意每个 csv 文件的内容应该放在不同的 table.

这里的基本用例是创建与 CSV 文件一样多的步骤(因为没有默认的 MultiResourceItemReader 实现)。

您的每一步都将读取 CSV(带有 FlatFileItemReader)并写入您的数据库(使用 JdbcBatchItemWriter 或其他同类文件)。虽然您将有多个步骤,但如果您的 CSV 文件具有相同的格式(列、分隔符),您可以使用 AbstractStep 分解配置。请参阅文档:http://docs.spring.io/spring-batch/trunk/reference/html/configureStep.html

如果没有,那么你至少可以分享一些共同的属性,比如LineMapperItemPreparedStatementSetterDataSource


更新

以下是供您的读者和作者参考的示例:

    <bean id="reader" class="org.springframework.batch.item.file.FlatFileItemReader">
        <property name="resource" value="yourFile.csv" />
        <property name="lineMapper">
            <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
                <property name="lineTokenizer">
                    <bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
                        <property name="names" value="column1,column2,column3..." />
                    </bean>
                </property>
                <property name="fieldSetMapper">
                    <bean class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper">
                        <property name="prototypeBeanName" value="yourBeanClass" />
                    </bean>
                </property>
            </bean>
        </property>
    </bean>

    <bean id="writer" class="org.springframework.batch.item.database.JdbcBatchItemWriter">
        <property name="dataSource" ref="dataSource" />
        <property name="sql">
            <value>
                <![CDATA[        
                    insert into YOUR_TABLE(column1,column2,column3...) 
                    values (:beanField1, :beanField2, :beanField3...)
                ]]>
            </value>
        </property>
        <property name="itemSqlParameterSourceProvider">
            <bean class="org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider" />
        </property>
    </bean>

更新 2

这是一个链接作业中步骤的示例(使用基于 Java 的配置):

@Bean
public Job job() {
     return jobBuilderFactory().get("job").incrementer(new RunIdIncrementer())
     .start(step1()).next(step2()).build();
}