Я использую 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;
}
я улучшил решения г-жи RHTs/Brad и ответа Lestos.
я расширил оба решения в отъезде состояния там, где это было найдено. Таким образом, я сохраняю текущую позицию ResultSet и восстанавливаю ее после того, как я создал карты.
RS является ResultSet, это - полевая переменная и так в моих отрывках решений, не видимых.
я заменил определенную Карту в Brad решение г-жи Карты gerneric.
public List<Map<String, Object>> resultAsListMap() throws SQLException
{
var md = rs.getMetaData();
var columns = md.getColumnCount();
var list = new ArrayList<Map<String, Object>>();
var currRowIndex = rs.getRow();
rs.beforeFirst();
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);
}
rs.absolute(currRowIndex);
return list;
}
В решении Lestos, я оптимизировал код. В его коде у него есть к поиску Карты каждое повторение этого для цикла. Я уменьшил это только до одного массива-acces каждое повторение для цикла. Таким образом, программа не должна seach каждый итеративный шаг для того строкового ключа.
public Map<String, List<Object>> resultAsMapList() throws SQLException
{
var md = rs.getMetaData();
var columns = md.getColumnCount();
var tmp = new ArrayList[columns];
var map = new HashMap<String, List<Object>>(columns);
var currRowIndex = rs.getRow();
rs.beforeFirst();
for (int i = 1; i <= columns; ++i)
{
tmp[i - 1] = new ArrayList<>();
map.put(md.getColumnName(i), tmp[i - 1]);
}
while (rs.next())
{
for (int i = 1; i <= columns; ++i)
{
tmp[i - 1].add(rs.getObject(i));
}
}
rs.absolute(currRowIndex);
return map;
}
Вот код, мало изменил это, я получил его от Google -
List data_table = new ArrayList<>();
Class.forName("oracle.jdbc.driver.OracleDriver");
con = DriverManager.getConnection(conn_url, user_id, password);
Statement stmt = con.createStatement();
System.out.println("query_string: "+query_string);
ResultSet rs = stmt.executeQuery(query_string);
ResultSetMetaData rsmd = rs.getMetaData();
int row_count = 0;
while (rs.next()) {
HashMap<String, String> data_map = new HashMap<>();
if (row_count == 240001) {
break;
}
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
data_map.put(rsmd.getColumnName(i), rs.getString(i));
}
data_table.add(data_map);
row_count = row_count + 1;
}
rs.close();
stmt.close();
con.close();