【发布时间】:2015-11-16 12:42:21
【问题描述】:
我正在阅读文章 http://spring.io/guides/gs/batch-processing/,它解释了读取 csv 并将其写回数据库。我想知道如何读取多个 CSV 文件,例如 A.csv、B.csv 等,并将内容写回各自的表 table_A、table_B 等。请注意每个 csv 文件的内容应该放在不同的表中。
【问题讨论】:
标签: spring spring-boot spring-batch
我正在阅读文章 http://spring.io/guides/gs/batch-processing/,它解释了读取 csv 并将其写回数据库。我想知道如何读取多个 CSV 文件,例如 A.csv、B.csv 等,并将内容写回各自的表 table_A、table_B 等。请注意每个 csv 文件的内容应该放在不同的表中。
【问题讨论】:
标签: spring spring-boot spring-batch
这里的基本用例是创建与 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();
}
【讨论】:
BatchConfiguration 类,该类具有该 csv 的读取器和写入器。以及在这种情况下如何定义作业和步骤.. 他们会去哪个文件