web-dev-qa-db-ja.com

JavaでResultSetを処理する効率的な方法

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;
}
52
Deepak
  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;
}
77
RHT

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;
}
30
Brad M

RHTにはほとんどあります。または、 RowSetDynaClass を使用して、他の人にすべての作業を任せることができます:)

15
Dave Newton

これは、マップのリストではなく、私の代替ソリューションです。リストのマップを使用しています。リモートデータベースで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;
}
5
Lesto

他の回答を強化するためのいくつかのこと。まず、特定の実装であるHashMapを決して返さないでください。代わりに、単純な古いJava.util.Mapを返します。しかし、とにかく、実際にはこの例には適切ではありません。コードは、ResultSetの最後の行を(ハッシュ)マップとしてのみ返します。代わりに、List<Map<String,Object>>を返します。それを行うためにコードを変更する方法を考えてください。 (または、デイブ・ニュートンの提案を取ることができます)。

4
Rick Goldstein