如何从任何数据库表读取记录并使用Spring Batch导出为TextFile

时间:2018-06-19 04:21:10

标签: spring spring-boot spring-batch

我正在构建一个将通过webservice调用的spring批处理作业。 Web服务将获取select和delete语句对的列表。 select语句返回的记录将作为CSV保存在文件系统中,然后通过执行提供的delete语句删除相同的记录。

我看过很多ColumnRowMapper示例,但这需要我为每个表实体创建一个POJO。我正在寻找一个解决方案,可以处理任何表中的任何列。有关方法的任何建议吗?

**** **** UPDATE 自写这篇文章以来,我已经找到了以下解决方案。

@Bean
@StepScope
public JdbcCursorItemReader<Map<String, ?>> getRowsOfDataForExportFromTable(){
    JdbcCursorItemReader<Map<String, ? extends Object>> databaseReader = new JdbcCursorItemReader<>();

    databaseReader.setDataSource(jdbcTemplate.getDataSource());
    databaseReader.setSql("select * from SOME_TABLE where last_updated_date < DATE_SUB(NOW(), INTERVAL 10 DAY);");
    databaseReader.setRowMapper(new RowMapper<Map<String, ? extends Object>>() {
        @Override
        public Map<String, ? extends Object> mapRow(ResultSet resultSet, int i) throws SQLException {
            Map<String,String> resultMap = new LinkedHashMap<>();
            int numOfColumns = resultSet.getMetaData().getColumnCount();
            for (int j = 1; j < numOfColumns+1; j++){
                String columnName = resultSet.getMetaData().getColumnName(j);
                String value = resultSet.getString(j);
                resultMap.put(columnName,value);
            }

            return resultMap;
        }
    });
    return databaseReader;
}

上面的ItemReader将构建一个LinkedHashMap行映射器,其中列名是键,列值是值。

1 个答案:

答案 0 :(得分:1)

您是否尝试使用Map代替POJO?您可以在Reader中动态填充它,然后从此CSV创建Map文件。