我在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;
}
答案 0 :(得分:76)
完成
编辑:既然您已发布代码,我已对其进行了一些更改。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;
}
答案 1 :(得分:29)
我刚刚清理了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;
}
答案 2 :(得分:15)
RHT几乎拥有它。或者您可以使用RowSetDynaClass并让其他人完成所有工作:)
答案 3 :(得分:5)
增强其他答案的几个方面。首先,您永远不应该返回HashMap
,这是一个特定的实现。返回一个普通的旧java.util.Map
。但无论如何,这实际上不适合这个例子。您的代码仅返回ResultSet的最后一行作为(哈希)映射。您想要返回List<Map<String,Object>>
。考虑一下如何修改代码来做到这一点。 (或者你可以接受Dave Newton的建议)。
答案 4 :(得分:5)
这是我的替代解决方案,而不是地图列表,我正在使用列表地图。 在远程数据库上对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 :(得分:0)
i改进了RHT / Brad Ms和Lestos答案的解决方案。
我扩展了这两种解决方案,将状态留在了那里。 因此,我保存了当前ResultSet的位置,并在创建地图后将其还原。rs是ResultSet,它是一个字段变量,因此在我的解决方案中不可见。
我将Brad Ms解决方案中的特定Map替换为Gerneric Map。
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循环的每次迭代中查找Maps。我将其减少为仅一个数组,每个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;
}
答案 6 :(得分:0)
这是我从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();
答案 7 :(得分: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;
}