Эффективный способ обработки ResultSet в Java - PullRequest
52 голосов
/ 22 сентября 2011

Я использую ResultSet в Java и не уверен, как правильно его закрыть.Я рассматриваю возможность использования ResultSet для создания HashMap, а затем закрываю ResultSet.Является ли этот метод HashMap эффективным или есть более эффективные способы справиться с этой ситуацией?Мне нужны и ключи, и значения, поэтому использование HashMap представляется логичным выбором.

Если использование HashMap является наиболее эффективным методом, как мне создать и использовать HashMap в моем коде?

Вот что я пробовал:

public HashMap resultSetToHashMap(ResultSet rs) throws SQLException {

  ResultSetMetaData md = rs.getMetaData();
  int columns = md.getColumnCount();
  HashMap row = new HashMap();
  while (rs.next()) {
     for (int i = 1; i <= columns; i++) {
       row.put(md.getColumnName(i), rs.getObject(i));
     }
  }
  return row;
}

Ответы [ 5 ]

77 голосов
/ 22 сентября 2011
  1. Переберите ResultSet
  2. Создайте новый объект для каждой строки, чтобы сохранить нужные вам поля
  3. Добавьте этот новый объект в ArrayList или Hashmap или что вам нравится
  4. Закройте ResultSet, Statement и соединение с БД

Готово

РЕДАКТИРОВАТЬ: теперь, когда вы отправили код, я внес в него несколько изменений.

public List resultSetToArrayList(ResultSet rs) throws SQLException{
  ResultSetMetaData md = rs.getMetaData();
  int columns = md.getColumnCount();
  ArrayList list = new ArrayList(50);
  while (rs.next()){
     HashMap row = new HashMap(columns);
     for(int i=1; i<=columns; ++i){           
      row.put(md.getColumnName(i),rs.getObject(i));
     }
      list.add(row);
  }

 return list;
}
29 голосов
/ 18 апреля 2012

Я только что исправил ответ RHT, чтобы исключить некоторые предупреждения, и подумал, что поделюсь. Eclipse сделал большую часть работы:

public List<HashMap<String,Object>> convertResultSetToList(ResultSet rs) throws SQLException {
    ResultSetMetaData md = rs.getMetaData();
    int columns = md.getColumnCount();
    List<HashMap<String,Object>> list = new ArrayList<HashMap<String,Object>>();

    while (rs.next()) {
        HashMap<String,Object> row = new HashMap<String, Object>(columns);
        for(int i=1; i<=columns; ++i) {
            row.put(md.getColumnName(i),rs.getObject(i));
        }
        list.add(row);
    }

    return list;
}
15 голосов
/ 22 сентября 2011

RHT в значительной степени имеет это. Или вы можете использовать RowSetDynaClass и позволить кому-то еще делать всю работу:)

5 голосов
/ 16 апреля 2014

это мое альтернативное решение, вместо списка карт, я использую карту списка.Протестировано на таблицах из 5000 элементов на удаленной базе данных, время составляет около 350 мс для метода eiter.

private Map<String, List<Object>> resultSetToArrayList(ResultSet rs) throws SQLException {
    ResultSetMetaData md = rs.getMetaData();
    int columns = md.getColumnCount();
    Map<String, List<Object>> map = new HashMap<>(columns);
    for (int i = 1; i <= columns; ++i) {
        map.put(md.getColumnName(i), new ArrayList<>());
    }
    while (rs.next()) {
        for (int i = 1; i <= columns; ++i) {
            map.get(md.getColumnName(i)).add(rs.getObject(i));
        }
    }

    return map;
}
5 голосов
/ 22 сентября 2011

Несколько вещей, чтобы улучшить другие ответы.Во-первых, вы никогда не должны возвращать HashMap, который является конкретной реализацией.Вместо этого верните старый добрый java.util.Map.Но на самом деле это не совсем верно для этого примера.Ваш код возвращает только последнюю строку ResultSet в виде (хэш) карты.Вместо этого вы хотите вернуть List<Map<String,Object>>.Подумайте, как вы должны изменить свой код для этого.(Или вы можете принять предложение Дейва Ньютона).

...