【问题标题】:Exporting SqlRowSet to a file将 SqlRowSet 导出到文件
【发布时间】:2019-04-24 16:43:47
【问题描述】:

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

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

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

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

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 导出到一个文件中,以便于以后的导入过程;某种方式来存储架构以便更轻松地插入数据库?

【问题讨论】:

    标签: java spring jdbc design-patterns refactoring


    【解决方案1】:

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

    1. 创建解析器Factory接口,比如ParserFactory
    2. 创建一个解析接口,比如MyParser
    3. 使用工厂方法Pattern 实现MyParser,即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();
    }
    

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

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

    【讨论】:

      猜你喜欢
      • 2013-03-23
      • 1970-01-01
      • 1970-01-01
      • 2013-05-31
      • 1970-01-01
      • 1970-01-01
      • 2014-04-09
      • 2021-04-11
      • 2011-04-18
      相关资源
      最近更新 更多