2016-11-19 9 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