2015-10-07 2 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' unqualified будет работать, если вы импортируете его. – Andreas

1

ответ на Lashane хорош для ошибок, которые необходимы решения, однако он может быть улучшен:

  • вы хотели цифровой доступ ($result[0]['Date']) к строкам, а не строки.
  • print метод должен использовать полностью типизированный параметр.
  • Строки должны храниться в TreeMap или LinkedHashMap или ArrayList для сохранения порядка строк. ArrayList лучше для вашего дела, фактически.
  • Столбцы должны храниться в LinkedHashMap, чтобы сохранить порядок столбцов.
  • Do не Исключить исключение и продолжить. Позвольте ему каскадировать до вызывающего абонента.

Обновленный вариант:

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

@ Rhododendron Печать как? Какой результат вы ожидаете? В любом случае, как печатать карту - это совершенно другой вопрос, поэтому я предлагаю вам создать новую. – Andreas

Смежные вопросы