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
如果没有,那么你至少可以分享一些共同的属性,比如LineMapper
、ItemPreparedStatementSetter
和DataSource
。
更新
以下是供您的读者和作者参考的示例:
<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();
}
我正在阅读文章 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
如果没有,那么你至少可以分享一些共同的属性,比如LineMapper
、ItemPreparedStatementSetter
和DataSource
。
更新
以下是供您的读者和作者参考的示例:
<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();
}