如果我只需要使用 ItemWriter 删除行,为什么我的工作步骤中需要 ItemReader

Why do I need an ItemReader in my job step if I only need to delete rows using ItemWriter

我的批处理作业中有一个步骤,我只想用它来删除 table 中的行。

步骤如下所示:

@Bean 
    public Step step2(StepBuilderFactory factory,
                      PurgeAggBalanceWriter writer,
                      DataSource dataSource,
                      PlatformTransactionManager platformTransactionManager){
        return stepBuilderFactory.get("step2")
                .transactionManager(platformTransactionManager)
                .<Assessment,Assessment>chunk(10)
                .reader(getReader(dataSource, READER_QUERY2, "AggBalanceMapper", new AggBalanceMapper()))
                .writer(writer)
                .build();
    }

我正在使用这个作者 class 和一个 jdcb 模板来 运行 删除语句:

public class PurgeAggBalanceWriter implements ItemWriter<Assessment> {
   
    private JdbcTemplate jdbcTemplate;

    private static final String DELETE_QUERY = "DELETE FROM TABLE WHERE COLUMN = 'TEST'";

    public PurgeAggBalanceWriter(DataSource dataSource) {

        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }


    @Override
    public void write(List<? extends Assessment> list) {

        jdbcTemplate.update(DELETE_QUERY);

}

步骤成功完成,但我不明白为什么需要 ItemReader,因为它在我尝试从步骤 2 中删除 .reader() 时指出。

有没有办法避免使用 reader/mapper 而只使用编写器,因为我所要做的只是 运行 删除查询?

all I have to do is run a delete query

在这种情况下,您不需要 chunk-oriented tasklet。一个简单的 tasklet 就足够了,比如:

public class DeletionTasklet implements Tasklet {

    private static final String DELETE_QUERY = "DELETE FROM TABLE WHERE COLUMN = 'TEST'";
    private JdbcTemplate jdbcTemplate;

    public DeletionTasklet(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

    @Override
    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) {
        jdbcTemplate.update(DELETE_QUERY);
        return RepeatStatus.FINISHED;
    }
}