2015-10-07 43 views
0

所以我想存儲一個MySQL查詢結果集到一多維HashMap中所列出這樣:存儲從MySQL查詢多行多層面的HashMap

public HashMap<String, HashMap<String, String>> getData(String query) 
    { 
    Statement stmt = null; 
    HashMap<String, HashMap<String, String>> results = new HashMap<String, HashMap<String, String>>(); 

    try 
    { 
     stmt = conn.createStatement(); 
     ResultSet rs = stmt.executeQuery(query); 
     ResultSetMetaData rsmd = rs.getMetaData(); 

     while (rs.next()) 
     { 
      for (int i = 1; i < rsmd.getColumnCount() + 1; i++) 
      { 
       results.put(Integer.toString(i - 1), new HashMap<String, String>()); 
       results.get(Integer.toString(i - 1)).put(rsmd.getColumnLabel(i), rs.getString(i)); 
      } 
     } 
    } 
    catch (SQLException ex) 
    { 
     ex.printStackTrace(System.out); 
    } 

    return results; 
    } 

但是使用功能打印出來當所以:

public static void printMap(Map mp) 
    { 
     Iterator it = mp.entrySet().iterator(); 

     while (it.hasNext()) 
     { 
      Map.Entry pair = (Map.Entry)it.next(); 
      System.out.println(pair.getKey() + " = " + pair.getValue()); 
      it.remove(); 
     } 
    } 

它只存儲單行結果,我不能包裹我的頭爲什麼。

0 = {Date=2014-11-04} 
1 = {Num=1256} 
2 = {ATime=null} 
3 = {ALocCode=null} 
4 = {DTime=1:00 PM} 
5 = {DLocCode=JFK} 
6 = {EstATime=8:00 PM} 
7 = {EstDTime=1:00 PM} 
8 = {EId=7624} 

我的問題是,我能說的唯一方法是關於PHP,我該如何使它像這樣存儲?

$result[0]['Date'] = '3214'; 
.... 
$result[1]['Date'] = '6426'; 

因爲這基本上是我想要實現的目標?

你已經換「行」和「列」

回答

2

主要問題,下一個就是你正在重新創建每次你把場時間HashMap的,正確的代碼如下所示:

public Map<String, Map<String, String>> getData(final String query) { 
    final Map<String, Map<String, String>> results = new HashMap<>(); 

    try (final Statement stmt = this.conn.createStatement(); final ResultSet rs = stmt.executeQuery(query);) { 
     final ResultSetMetaData rsmd = rs.getMetaData(); 
     long rId = 0; 
     while (rs.next()) { 
      final Map<String, String> record = new HashMap<>(); 
      for (int i = 1; i < (rsmd.getColumnCount() + 1); i++) { 
       record.put(rsmd.getColumnLabel(i), rs.getString(i)); 
      } 
      results.put(String.valueOf(rId++), record); 
     } 
    } catch (final SQLException ex) { 
     ex.printStackTrace(System.out); 
    } 

    return results; 
} 

public static void printMap(final Map<?, ?> mp) { 
    for (final Entry<?, ?> entry : mp.entrySet()) { 
     final Object key = entry.getKey(); 
     final Object value = entry.getValue(); 
     if (value instanceof Map) { 
      System.out.println(key); 
      printMap((Map<?, ?>) value); 
     } else { 
      System.out.println(key + "=" + entry.getValue()); 
     } 
    } 
} 
+0

爲什麼地圖,而不是HashMap的? – Rhododendron

+0

也最終的條目不會編譯,將其更改爲最終的Map.Entry修復它:D – Rhododendron

+1

@EllisonPatterson如果您導入它,使用不合格的'Entry'將會工作。 – Andreas

1

通過Lashane答案是對你有好處需要解決的錯誤,但它可以改進:

  • 你想要的數字接入($result[0]['Date'])對行,不串。
  • print方法應該使用完全鍵入的參數。
  • 行應存儲在TreeMapLinkedHashMapArrayList以保留行順序。實際上,ArrayList對您的情況更好。
  • 列應存儲在LinkedHashMap保留列順序。
  • 不是捕獲異常並繼續。允許它級聯到呼叫者。

更新版本:

public List<Map<String, String>> getData(final String query) throws SQLException { 
    final List<Map<String, String>> results = new ArrayList<>(); 
    try (Statement stmt = this.conn.createStatement(); 
     ResultSet rs = stmt.executeQuery(query)) { 
     ResultSetMetaData metaData = rs.getMetaData(); 
     while (rs.next()) { 
      Map<String, String> record = new LinkedHashMap<>(); 
      for (int col = 1; col <= metaData.getColumnCount(); col++) 
       record.put(metaData.getColumnLabel(col), rs.getString(col)); 
      results.add(record); 
     } 
    } 
    return results; 
} 

public static void printMap(List<Map<String, String>> rows) { 
    for (int rowNum = 0; rowNum < rows.size(); rowNum++) 
     System.out.println(rowNum + " = " + rows.get(rowNum)); 
} 

您現在可以訪問它,就像你在PHP做的事:

// PHP (for reference, the way you requested) 
$result[0]['Date'] 

// Java 
result.get(0).get("Date") 

// Groovy 
result[0]['Date'] 
result[0].Date 

// JSP 
<c:forEach var="row" items="${result}" varStatus="rowStatus"> 
    ${rowStatus.index} = <c:out value="${row.Date}"/>, ... 
</c:forEach> 
+0

這真是太棒了:D – Rhododendron

+0

嘿@Andreas在printMap中,你將如何能夠打印rows.get(rowNum)呢? – Rhododendron

+1

@Rododendron打印如何?你會期待什麼輸出?無論如何,如何打印地圖是一個完全不同的問題,所以我建議你創建一個新的地圖。 – Andreas