Data not inserted in file using java

I trying to write a spring batch using SpringBoot. At first the program will read data from database, then write it to .csv file format.

This is the code I have tried

Reader

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

Mapper

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

Writer

@Bean
    public ItemWriter<Campaign> Writer() {
        FlatFileItemWriter<Campaign> 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;
    }

When I check the generated file, I can see the value id from database, but not 123. Value for the State is also empty . How can I overwrite the mapping value ?

阅读 3k
2 个回答

In Your code, the JdbcCursorItemReader execute query itself(see 链接描述), using the JdbcTemplate query and modify results did not persist to the database which does not affect other query processes.
If you want to change the data, try using the ItemProcessor.

☹️

像是@Avro說的,把要改的data移去ItemProcessor.

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;
    }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题