Эффективный способ обработки 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;
}
53
задан mchen.ja 25 August 2015 в 15:56
поделиться

2 ответа

я улучшил решения г-жи 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;
    }
0
ответ дан 7 November 2019 в 08:26
поделиться

Вот код, мало изменил это, я получил его от 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();
0
ответ дан 7 November 2019 в 08:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: