Эффективный способ обработки ResultSet в Java
Я использую 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;
}
Ответы
Ответ 1
- Итерация над ResultSet
- Создайте новый объект для каждой строки, чтобы сохранить нужные поля.
- Добавьте этот новый объект в ArrayList или Hashmap или все, что вам нравится
- Закройте окно ResultSet, Statement и DB.
Готово
EDIT: теперь, когда вы разместили код, я внес несколько изменений в него.
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;
}
Ответ 2
Я только что очистил ответ 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;
}
Ответ 3
RHT в значительной степени имеет его. Или вы можете использовать RowSetDynaClass и позволить кому-то еще выполнять всю работу:)
Ответ 4
Несколько вещей, чтобы улучшить другие ответы. Во-первых, вы никогда не должны возвращать HashMap
, что является конкретной реализацией. Верните вместо этого простой старый java.util.Map
. Но это вообще не так для этого примера. Ваш код возвращает только последнюю строку ResultSet в качестве (хэш-карты). Вместо этого вы хотите вернуть List<Map<String,Object>>
. Подумайте, как вы должны изменить свой код, чтобы сделать это. (Или вы могли бы принять предложение Дейва Ньютона).
Ответ 5
это мое альтернативное решение, вместо списка карт, я использую карту списка.
Протестировано на таблицах из 5000 элементов, на удаленном db, времена около 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;
}