将SqlRowSet导出到文件

时间:2019-04-24 16:43:48

标签: java spring jdbc design-patterns refactoring

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

我当前正在通过NamedParameterJdbcTemplate中的Spring查询数据库来执行查询,该查询返回一个SqlRowSet我可以迭代。在每次迭代中,我都提取所需的字段,然后使用CSV将结果转储到PrintWriter文件中。

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

问题是,当我读回文件时,它们都是String,我需要将它们转换为正确的类型,例如IntegerString,{{1 }}等

Date

是否有更好的方法将此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(); } 导出到文件中,以方便以后的导入过程;某种方式存储模式以便更轻松地插入数据库?

1 个答案:

答案 0 :(得分:0)

如果您担心解析,那么一种解决方法是

  1. 创建一个解析器Factory界面,例如说ParserFactory
  2. 创建一个解析界面,例如说MyParser
  3. 已使用工厂方法MyParser,即Pattern等实现了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);