Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将SqlRowSet导出到文件_Java_Spring_Jdbc_Design Patterns_Refactoring - Fatal编程技术网

Java 将SqlRowSet导出到文件

Java 将SqlRowSet导出到文件,java,spring,jdbc,design-patterns,refactoring,Java,Spring,Jdbc,Design Patterns,Refactoring,我想将通过JDBC触发的SQL查询的结果导出到一个文件中;然后在以后的某个时候导入该结果 我目前正在通过Spring的NamedParameterJdbcTemplate查询数据库,它返回一个我可以迭代的SqlRowSet。在每次迭代中,我提取所需的字段,并使用PrintWriter将结果转储到CSV文件中 final SqlRowSet rs = namedJdbcTemplate.queryForRowSet(sql,params); while (rs.next()) { 问题是,当我读

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

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

final SqlRowSet rs = namedJdbcTemplate.queryForRowSet(sql,params);
while (rs.next()) {
问题是,当我读回文件时,它们都是
String
s,我需要将它们转换为正确的类型,例如
Integer
String
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();
}

是否有更好的方法将此
SqlRowSet
导出到文件中,以便于以后的导入过程;存储模式以便更容易地插入数据库的某种方法?

如果需要解析,一种处理方法是

  • 创建一个解析器
    Factory
    接口,比如
    ParserFactory
  • 创建一个解析接口,比如说
    MyParser
  • 使用工厂方法
    Pattern
    实现
    MyParser
    ,即
    IntegerParser实现MyParser
  • 将工厂类名称作为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();
    }
    

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

  • 创建一个解析器
    Factory
    接口,比如
    ParserFactory
  • 创建一个解析接口,比如说
    MyParser
  • 使用工厂方法
    Pattern
    实现
    MyParser
    ,即
    IntegerParser实现MyParser
  • 将工厂类名称作为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();
    }