如何使用Spring Batch处理多版本数据库数据并导出到平面文件
Spring Batch兼容多版本数据表导出方案
1 前置准备:定义统一数据映射模型
首先定义包含所有目标字段的POJO,覆盖所有版本的字段:
public class Table1Data { private String column1; private String column2; private String column3; // getter、setter、构造方法省略 }
2 动态识别当前客户的数据库版本
两种识别方式二选一:
- 优先读取客户数据库内置的版本表,直接获取当前部署的应用版本号
- 无版本表时,通过JDBC元数据查询目标表的字段列表判断是否存在新增字段:
// 检测column3是否存在的示例逻辑 boolean hasColumn3 = jdbcTemplate.queryForObject( "SELECT COUNT(*) FROM information_schema.columns WHERE table_name = 'table1' AND column_name = 'column3'", Boolean.class );
3 配置兼容多版本的ItemReader
两种实现方案可选:
方案A:动态生成查询SQL(推荐,性能更高)
根据检测到的版本动态拼接查询语句,直接在查询阶段对齐字段:
JdbcCursorItemReader<Table1Data> reader = new JdbcCursorItemReader<>(); reader.setDataSource(dataSource); // 动态拼接SQL String sql = hasColumn3 ? "SELECT column1, column2, column3 FROM table1" : "SELECT column1, column2, NULL AS column3 FROM table1"; reader.setSql(sql); reader.setRowMapper(new BeanPropertyRowMapper<>(Table1Data.class));
方案B:自定义RowMapper做兼容适配
如果不想修改SQL,可在RowMapper中做字段存在性判断:
RowMapper<Table1Data> rowMapper = (rs, rowNum) -> { Table1Data data = new Table1Data(); data.setColumn1(rs.getString("column1")); data.setColumn2(rs.getString("column2")); // 判断结果集中是否存在column3 try { data.setColumn3(rs.getString("column3")); } catch (SQLException e) { // 字段不存在时设为null data.setColumn3(null); } return data; };
4 配置统一的FlatFileItemWriter
Writer不需要做版本适配,直接按全量字段配置输出规则即可:
FlatFileItemWriter<Table1Data> writer = new FlatFileItemWriter<>(); writer.setResource(new FileSystemResource("output.csv")); // 配置列抽取规则,包含全部三个字段 BeanWrapperFieldExtractor<Table1Data> extractor = new BeanWrapperFieldExtractor<>(); extractor.setNames(new String[]{"column1", "column2", "column3"}); DelimitedLineAggregator<Table1Data> lineAggregator = new DelimitedLineAggregator<>(); lineAggregator.setDelimiter(","); lineAggregator.setFieldExtractor(extractor); writer.setLineAggregator(lineAggregator);
5 可扩展说明
后续如果有新版本新增更多字段,只需要:
- 在POJO中新增对应字段
- 版本检测逻辑新增对应字段的判断
- SQL/RowMapper添加对应字段的兼容逻辑
- Writer的字段抽取列表添加新字段即可,整体Job流程不需要修改
内容的提问来源于stack exchange,提问作者Nagaraju Chitimilla
相关产品推荐
相关产品推荐

