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;
}
完了
編集:コードを投稿したので、いくつかの変更を加えました。
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;
}
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;
}
RHTにはほとんどあります。または、 RowSetDynaClass を使用して、他の人にすべての作業を任せることができます:)
これは、マップのリストではなく、私の代替ソリューションです。リストのマップを使用しています。リモートデータベースで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;
}
他の回答を強化するためのいくつかのこと。まず、特定の実装であるHashMap
を決して返さないでください。代わりに、単純な古いJava.util.Map
を返します。しかし、とにかく、実際にはこの例には適切ではありません。コードは、ResultSetの最後の行を(ハッシュ)マップとしてのみ返します。代わりに、List<Map<String,Object>>
を返します。それを行うためにコードを変更する方法を考えてください。 (または、デイブ・ニュートンの提案を取ることができます)。