Java 一次读取的Spring批处理多个插入
我有一个Spring批处理过程,它可以从CSV读取报告对象,并将分析对象正确插入MySQL数据库,但是对于每个读取的报告,逻辑已经改变,需要插入多个分析 我是新加入Spring批次的,实际上这个过程对我来说非常困难,我不知道如何做这个改变 我没有XML配置,所有的都是注释。Report和Analytics类有一个getter和一个setter用于两个字段,adId和value。新逻辑有七个adId值,我需要在表中插入七行 我隐藏、删除或删除了一些与问题无关的代码 以下是我的BatchConfiguration.java:Java 一次读取的Spring批处理多个插入,java,spring-batch,Java,Spring Batch,我有一个Spring批处理过程,它可以从CSV读取报告对象,并将分析对象正确插入MySQL数据库,但是对于每个读取的报告,逻辑已经改变,需要插入多个分析 我是新加入Spring批次的,实际上这个过程对我来说非常困难,我不知道如何做这个改变 我没有XML配置,所有的都是注释。Report和Analytics类有一个getter和一个setter用于两个字段,adId和value。新逻辑有七个adId值,我需要在表中插入七行 我隐藏、删除或删除了一些与问题无关的代码 以下是我的BatchConfig
@Configuration
@EnableBatchProcessingpublic
class BatchConfiguration {
@Autowired
private transient JobBuilderFactory jobBuilderFactory;
@Autowired
private transient StepBuilderFactory stepBuilderFactory;
@Autowired
private transient DataSource dataSource;
public FlatFileItemReader<Report> reader() {
// The reader from the CSV works fine.
}
@Bean
public JdbcBatchItemWriter<Analytic> writer() {
final JdbcBatchItemWriter<Analytic> writer = new JdbcBatchItemWriter<Analytic>();
writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<Analytic>());
writer.setSql("INSERT INTO TABLE (ad_id, value) VALUES (:adId, :value)");
writer.setDataSource(dataSource);
return writer;
}
@Bean
public AnalyticItemProcessor processor() {
return new AnalyticItemProcessor();
}
@Bean
public Step step() {
return stepBuilderFactory.get("step1").<Report, Analytic> chunk(10000).reader(reader()).processor(processor()).writer(writer()).build();
}
@Bean
public Job process() {
final JobBuilder jobBuilder = jobBuilderFactory.get("process");
return jobBuilder.start(step()).build();
}
}
我怎样才能做这个改变?可能使用ItemPreparedStatementSetter或ItemSqlParameterSourceProvider?谢谢。如果我正确理解了您的问题,您可以使用
CompositeItemWriter
包装多个JdbcBatchItemWriter
实例(您需要完成的每个插入一个)。这将允许您为每个项目插入多行。否则,您需要编写自己的ItemWriter
实现。如果我正确理解了您的问题,您可以使用CompositeItemWriter
包装多个jdbccbatchitemwriter
实例(需要完成的每个插入一个)。这将允许您为每个项目插入多行。否则,您需要编写自己的ItemWriter
实现。谢谢@Michael Minella,ItemWriter实现还可以。非常重要的包括“writer.afterPropertiesSet();”,如中的Avis所述,如果将每个委托配置为bean,则不需要这样做。容器会帮你完成的。谢谢@Michael Minella,ItemWriter的实现还可以。非常重要的包括“writer.afterPropertiesSet();”,如中的Avis所述,如果将每个委托配置为bean,则不需要这样做。容器会帮你的。
public class AnalyticItemProcessor implements ItemProcessor<Report, Analytic> {
@Override
public Analytic process(final Report report) {
// Creates a new Analytic call BeanUtils.copyProperties(report, analytic) and returns analytic.
}
}
@SpringBootApplication
public class Process {
public static void main(String[] args) throws Exception {
SpringApplication.run(Process.class, args);
}
}