2016-11-19 39 views
2
列名和列值

我有下面的代码片段:构建地图与java.sql.ResultSet中

Connection connection = getConnection(schemaName); 
    Statement stmt = connection.createStatement(); 
    String sql = "SELECT * FROM " + tableName; 
    ResultSet rs = stmt.executeQuery(sql); 
现在我要实现的是建立一个

Map<String , List<String>> 

,其中关键是什么

columnName和value是columnValues的列表。这是我的代码:

ResultSetMetaData rsmd = rs.getMetaData(); 
    int columnCount = rsmd.getColumnCount(); 

    List<String> columnNames = new LinkedList<>(); 
    for (int i = 1; i <= columnCount; i++) { 
     columnNames.add(rsmd.getColumnName(i)); 
    } 

    Map<String, List<String>> columnNameToValuesMap = new HashMap<String, List<String>>(); 

    for (String columnName : columnNames) { 
     List<String> values = new ArrayList<>(); 
     try { 
      while (rs.next()) { 
       values.add(rs.getString(columnName)); 
      } 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
     columnNameToValuesMap.put(columnName, values); 
    } 

问题是在第一次columnName迭代之后,rs.next()是空的。所以基本上结果地图只包含第一列的值。我怎样才能重复使用相同的resultSet每次迭代?为什么在第一个之后是空的?

+0

* *为什么你要这么做?看起来你没有特别好的理由重新创建并行阵列。 – chrylis

+0

与您的问题无关,但您应该使用'getColumnLabel'而不是'getColumnName' –

回答

2

你可以按照下面的步骤:

(1)空list对象与列名作为关键字

初始化的 columnNameToValuesMap

(2)迭代resultset使用rs.next()

(3)获取每列数据使用for循环并添加到listvalues对象

(4)将列数据到columnNameToValuesMap对象

您可以参考下面的代码注释:

List<String> columnNames = new LinkedList<>(); 
Map<String,List<String>> columnNameToValuesMap=new HashMap<String, List<String>>(); 

for (int i = 1; i <= columnCount; i++) { 
     String columnName = rsmd.getColumnName(i); 
     columnNames.add(columnName); 

     //Load the Map initially with keys(columnnames) and empty list 
     columnNameToValuesMap.put(columnName, new ArrayList()); 
} 

try { 
    while (rs.next()) { //Iterate the resultset for each row 

     for (String columnName : columnNames) { 
     //Get the list mapped to column name 
     List<String> columnDataList = columnNameToValuesMap.get(columnName); 

      //Add the current row's column data to list 
      columnDataList.add(rs.getString(columnName)); 

      //add the updated list of column data to the map now 
      columnNameToValuesMap.put(columnName, columnDataList); 
     } 
    } 
} catch (SQLException e) { 
    e.printStackTrace(); 
} 
+0

将放置在columnNames loop.columnName超出范围之外的映射中。 – stackUnderflow

+1

现在更新了代码,你可以看看,基本上你需要多个列表对象,每个列表对象都映射到列名 – developer