我正在尝试用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的值也为空。如何覆盖映射值?
发布于 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());
https://stackoverflow.com/questions/48960162
复制相似问题