2017-02-09 35 views
0

CSVからレポートオブジェクトを読み込み、アナリティックオブジェクトをMySQL DBに正しく読み込むSpringバッチプロセスがありますが、レポートごとに複数のアナリティクスインサートの論理が変更されています読んだ。1回の読み込みのためのSpringバッチ複数インサート

私はSpring Batchで新しく、実際にはプロセスが非常に難しく、この変更を行う方法がわかりません。

XML構成はありません。すべて注釈付きです。レポートクラスとアナリティクスクラスには、adIdとvalueという2つのフィールドのゲッターとセッターがあります。新しいロジックにはadIdの7つの値があり、テーブルに7つの行を挿入する必要があります。

質問に寄与しないコードを隠したり、削除したり、抑止したりします。ここで

は私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(); 
    } 
} 

その後AnalyticItemProcessor.java

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

私はこの変更をどのように行うことができますか?たぶんItemPreparedStatementSetterまたはItemSqlParameterSourceProvider?ありがとう。

答えて

3

あなたの質問を正しく理解している場合は、CompositeItemWriterを使用して複数のJdbcBatchItemWriterインスタンス(1つのインサート1つを達成する必要があります)をラップすることができます。これにより、アイテムごとに複数の行を挿入することができます。それ以外の場合は、独自のItemWriter実装を作成する必要があります。

+0

ありがとう@Michael Minella、ItemWriter実装でOKでした。非常に重要なのは、 "writer.afterPropertiesSet();" likeはAvisと言っています。http://stackoverflow.com/questions/32656581/pb-using-jdbcbatchitemwriter-with-compositeitemwriter-in-java-code-spring-batch –

+0

デリゲートのそれぞれをBeanとして設定すると、必要はありません。コンテナはあなたのためにそれを行います。 –

関連する問題