61

JavaでResultSetを使用していますが、正しく閉じる方法がわかりません。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;
}
4

8 に答える 8

94
  1. ResultSetを反復処理します
  2. 必要なフィールドを格納するために、行ごとに新しいオブジェクトを作成します
  3. この新しいオブジェクトをArrayListやHashmapなどの好きなものに追加します
  4. ResultSet、Statement、およびDB接続を閉じます

終わり

編集:あなたがコードを投稿したので、私はそれにいくつかの変更を加えました。

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;
}
于 2011-09-21T22:00:56.947 に答える
36

いくつかの警告を排除するために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;
}
于 2012-04-18T15:56:16.510 に答える
17

RHTはほとんどそれを持っています。または、RowSetDynaClassを使用して、他の誰かにすべての作業を任せることもできます:)

于 2011-09-21T22:05:18.877 に答える
6

これは私の代替ソリューションであり、マップのリストの代わりに、リストのマップを使用しています。リモートデータベースで5000要素のテーブルでテストした場合、時間はeiterメソッドで約350ミリ秒です。

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;
}
于 2014-04-16T09:49:10.453 に答える
4

他の答えを強化するためのいくつかのこと。HashMapまず、特定の実装であるを返さないでください。代わりに、普通の古いものを返しjava.util.Mapます。しかし、とにかく、それは実際にはこの例には正しくありません。コードは、ResultSetの最後の行のみを(ハッシュ)マップとして返​​します。代わりに、を返しますList<Map<String,Object>>。そのためにコードを変更する方法を考えてください。(または、Dave Newtonの提案を受け入れることもできます)。

于 2011-09-21T22:17:58.290 に答える
1

RHT /BradMsとLestosanswerのソリューションを改善しました。

私は両方のソリューションを拡張して、それが見つかった状態をそこに残しました。したがって、現在のResultSetの位置を保存し、マップを作成した後で復元します。

rsはResultSetであり、そのフィールド変数であるため、私のソリューションではスニペットは表示されません。

BradMsソリューションの特定のマップを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ソリューションでは、コードを最適化しました。彼のコードでは、そのforループの反復ごとにマップを検索する必要があります。私はそれを1つの配列に減らしました-各forループの反復にアクセスします。したがって、プログラムはその文字列キーの各反復ステップを検索してはなりません。

    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;
    }
于 2019-10-02T00:08:52.737 に答える
0

これが私がグーグルから入手した少し変更されたコードです-

 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();
于 2019-11-04T19:27:35.140 に答える
0
public static List<HashMap<Object, Object>> GetListOfDataFromResultSet(ResultSet rs) throws SQLException {
        ResultSetMetaData metaData = rs.getMetaData();
        int count = metaData.getColumnCount();
        String[] columnName = new String[count];
        List<HashMap<Object,Object>> lst=new ArrayList<>();
        while(rs.next()) {
            HashMap<Object,Object> map=new HashMap<>();
            for (int i = 1; i <= count; i++){
                   columnName[i-1] = metaData.getColumnLabel(i);
                   map.put(columnName[i-1], rs.getObject(i));
            }
            lst.add(map);

        }
        return lst;
    }
于 2019-12-07T04:37:39.087 に答える