首页 > 解决方案 > 将 SqlRowSet 导出到文件

问题描述

我想将通过 JDBC 触发的 SQL 查询的结果导出到文件中;然后在稍后的某个时间导入该结果。

我目前正在通过查询数据库来做到这一点NamedParameterJdbcTemplateSpring其中一个返回一个SqlRowSet我可以迭代的。在每次迭代中,我提取所需的字段并将结果转储到CSV文件中,使用PrintWriter.

final SqlRowSet rs = namedJdbcTemplate.queryForRowSet(sql,params);
while (rs.next()) {

问题是当我读回文件时,它们都是Strings ,我需要将它们转换为正确的类型,例如Integer,StringDate

while (line != null) {
    String[] csvLine = line.split(";");

    Object[] params = new Object[14]; 
    params[0] = csvLine[0];
    params[1] = csvLine[1];
    params[2] = Integer.parseInt(csvLine[2]);
    params[3] = csvLine[3];
    params[4] = csvLine[4];
    params[5] = Integer.parseInt(csvLine[5]);
    params[6] = Integer.parseInt(csvLine[6]);
    params[7] = Long.parseLong(csvLine[7]);
    params[8] = formatter.parse(csvLine[8]);
    params[9] = Integer.parseInt(csvLine[9]);
    params[10] = Double.parseDouble(csvLine[10]);
    params[11] = Double.parseDouble(csvLine[11]);
    params[12] = Double.parseDouble(csvLine[12]);
    params[13] = Double.parseDouble(csvLine[13]);

    batchParams.add(params);
    line = reader.readLine();
}

有没有更好的方法将其导出SqlRowSet到文件中,以方便以后的导入过程;某种存储模式以便更轻松地插入数据库的方法?

标签: javaspringjdbcdesign-patternsrefactoring

解决方案


如果解析是您关心的问题,处理此问题的一种方法是,

  1. 创建一个解析器Factory接口,比如说ParserFactory
  2. 创建一个解析接口,比如说MyParser
  3. MyParser使用 Factory MethodPattern等实现IntegerParser implements MyParser
  4. 将工厂类名称作为 CSV 中的标题

这样你的调用代码看起来像,

List<String> headerRow = reader.readLine().split(";"); // Get the 1st row here 
Map<String, MyParser> parsers = new HashMap<>();    
for(int i = 0; i < headerRow.length(); i++) {
    if(!parser.containsKey(headerRow[i]))
        parsers.put(headerRow[i], ParserFactory.get(headerRow[i]));
}

line = reader.readLine();
while (line != null) { // From 2nd row onwards
    String[] row = line.split(";");

    Object[] params = new Object[row.length()]; 
    for(int i = 0; i<row.length(); i++) {
        params[i] = parser.get(headerRow[i]).parse(row[i]);
    }

    batchParams.add(params);
    line = reader.readLine();
}

您可能希望将解析器映射的创建提取到它自己的方法中。或者让您ParserFactory作为headerRow参数,并返回相应的解析器作为结果。就像是,

List<String> headerRow = reader.readLine().split(";"); // Get the 1st row here 
Map<String, MyParser> parsers = ParserFactory.getParsers(headerRow);

推荐阅读