Ask Your Question
3

How to combine Spring batch merge query and compositeItemWriter?

asked 2022-03-25 11:00:00 +0000

woof gravatar image

edit retag flag offensive close merge delete

1 Answer

Sort by ยป oldest newest most voted
3

answered 2021-08-24 13:00:00 +0000

lakamha gravatar image

To combine Spring Batch merge query and CompositeItemWriter, you can follow these steps:

  1. Create a compositeItemWriter which has multiple item writers that write data to different tables.
@Bean
public CompositeItemWriter<MyEntity> compositeItemWriter() {
    List<ItemWriter<MyEntity>> writers = new ArrayList<>();
    writers.add(itemWriter1());
    writers.add(itemWriter2());
    CompositeItemWriter<MyEntity> compositeItemWriter = new CompositeItemWriter<>();
    compositeItemWriter.setDelegates(writers);
    return compositeItemWriter;
}
  1. Create a custom ItemWriter which will execute the merge query.
public class MergeItemWriter implements ItemWriter<List<MyEntity>> {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public void write(List<? extends List<MyEntity>> items) throws Exception {
        for (List<MyEntity> myEntities : items) {
            for (MyEntity myEntity : myEntities) {
                jdbcTemplate.update("<merge_query>", myEntity.getId(), myEntity.getName());
            }
        }
    }
}
  1. Add the mergeItemWriter to the compositeItemWriter.
@Bean
public CompositeItemWriter<MyEntity> compositeItemWriter() {
    List<ItemWriter<MyEntity>> writers = new ArrayList<>();
    writers.add(itemWriter1());
    writers.add(itemWriter2());
    writers.add(new MergeItemWriter());
    CompositeItemWriter<MyEntity> compositeItemWriter = new CompositeItemWriter<>();
    compositeItemWriter.setDelegates(writers);
    return compositeItemWriter;
}
  1. Use the compositeItemWriter in the step configuration.
@Bean
public Step step() {
    return stepBuilderFactory.get("step")
            .<MyEntity, MyEntity>chunk(10)
            .reader(reader())
            .processor(processor())
            .writer(compositeItemWriter())
            .build();
}

In this way, you can use the CompositeItemWriter to write data to multiple tables and execute the merge query using a custom ItemWriter.

edit flag offensive delete link more

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account. This space is reserved only for answers. If you would like to engage in a discussion, please instead post a comment under the question or an answer that you would like to discuss

Add Answer


Question Tools

Stats

Asked: 2022-03-25 11:00:00 +0000

Seen: 1 times

Last updated: Aug 24 '21