Java 一次读取的Spring批处理多个插入

Java 一次读取的Spring批处理多个插入,java,spring-batch,Java,Spring Batch,我有一个Spring批处理过程,它可以从CSV读取报告对象,并将分析对象正确插入MySQL数据库,但是对于每个读取的报告,逻辑已经改变,需要插入多个分析 我是新加入Spring批次的,实际上这个过程对我来说非常困难,我不知道如何做这个改变 我没有XML配置,所有的都是注释。Report和Analytics类有一个getter和一个setter用于两个字段,adId和value。新逻辑有七个adId值,我需要在表中插入七行 我隐藏、删除或删除了一些与问题无关的代码 以下是我的BatchConfig

我有一个Spring批处理过程,它可以从CSV读取报告对象,并将分析对象正确插入MySQL数据库,但是对于每个读取的报告,逻辑已经改变,需要插入多个分析

我是新加入Spring批次的,实际上这个过程对我来说非常困难,我不知道如何做这个改变

我没有XML配置,所有的都是注释。Report和Analytics类有一个getter和一个setter用于两个字段,adId和value。新逻辑有七个adId值,我需要在表中插入七行

我隐藏、删除或删除了一些与问题无关的代码

以下是我的BatchConfiguration.java:

@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);
    }
}