首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SpringBatch ItemWriter java

SpringBatch ItemWriter java
EN

Stack Overflow用户
提问于 2018-02-24 14:48:47
回答 1查看 661关注 0票数 1

我正在尝试用SpringBoot写一个spring batch。程序首先从数据库中读取数据,然后将其写入.csv格式的文件。

这是我尝试过的代码

阅读器

    @Bean
    public ItemReader<A> Reader() throws Exception {
        List list = new ArrayList<>();
        JdbcCursorItemReader<A> reader = new JdbcCursorItemReader<A>();
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

        String sql = "SELECT ID AS id FROM TABLE_A ";
        list = jdbcTemplate.query(sql, new Mapper()); // store all retrieved data to list
        reader.setSql(sql);
        reader.setDataSource(dataSource);
        reader.setRowMapper(new Mapper());

        if (list != null) {
            for (A c : (List<A>) list) {
                c.setId("123");  // overwrite the id
                c.setState("Active");             
            }
        }
        return reader;
    }

映射器

   public class Mapper implements RowMapper<A> {

        @Override
        public A mapRow(ResultSet rs, int rowNum) throws SQLException {

            A c = new A();
            c.setId(rs.getString("id"));
    }

编写器

    @Bean
    public ItemWriter<A> Writer() {
        FlatFileItemWriter<A> csvFileWriter = new FlatFileItemWriter<>();
        String exportFileHeader = "ID" + delimiter + "State";
        StringHeaderWriter headerWriter = new StringHeaderWriter(exportFileHeader);
        csvFileWriter.setHeaderCallback(headerWriter);
        headerWriter.checkRepository();

        String exportFilePath = "/home/xxx/Desktop/outputs/" + fileName + time() + ".csv";
        csvFileWriter.setResource(new FileSystemResource(exportFilePath));
        LineAggregator<A> lineAggregator = createStudentLineAggregator();
        csvFileWriter.setLineAggregator(lineAggregator);
        return csvFileWriter;
    }

BatchConfig

  @Bean
    public Job job() throws Exception { 
        return jobBuilderFactory.get("job")
                .incrementer(new RunIdIncrementer())
                .start(step1())
                .build();
    }


    @Bean
    public Step step1() throws Exception {
        return stepBuilderFactory.get("step1")
                .<A, A>chunk(1)
                .reader(Reader())
                .processor(new Processor())
                .writer(Writer())
                .build();
    }

处理器

public class Processor implements ItemProcessor<A, A> {

    @Override
    public A process(A i) throws Exception {
        System.out.println("Processing..." + i);
        return i;
    }
}

当我检查生成的文件时,我可以看到数据库中的值id,但看不到123。State的值也为空。如何覆盖映射值?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-24 15:13:03

在spring中,batch reader只负责读取数据。如果你想要操作数据,它必须在处理器中完成。所以:

public class Processor implements ItemProcessor<A, A> {

    @Override
    public A process(A i) throws Exception {
        System.out.println("Processing..." + i);
        i.setId("123");
        i.setStatus("Active");
        return i;
    }
}

这部分代码

    list = jdbcTemplate.query(sql, new Mapper()); // store all retrieved data to list

    if (list != null) {
        for (A c : (List<A>) list) {
            c.setId("123");  // overwrite the id
            c.setState("Active");             
        }
    }

实际上什么都不做。在Reader()中,您应该只返回已配置的读卡器。您可以通过以下方式正确配置:

    reader.setSql(sql);
    reader.setDataSource(dataSource);
    reader.setRowMapper(new Mapper());
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48960162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档