在Java中处理ResultSet的有效方法

Dee*_*pak 53 java resultset hashmap sqlresultsetmapping

我在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;
}
Run Code Online (Sandbox Code Playgroud)

RHT*_*RHT 79

  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;
}
Run Code Online (Sandbox Code Playgroud)

  • 返回List &lt;Map &lt;String,Object &gt;&gt;是一种以行为中心的查看事物的方式。如果要以列为中心的视图,请返回Map &lt;String,List &lt;Object &gt;&gt;,其中键为列名。有时它可能对您更有用。 (3认同)

Bra*_*d M 30

我刚刚清理了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;
}
Run Code Online (Sandbox Code Playgroud)


Dav*_*ton 15

RHT几乎拥有它.或者您可以使用RowSetDynaClass并让其他人完成所有工作:)


Les*_*sto 5

这是我的替代解决方案,而不是地图列表,而是使用列表地图。在远程db的5000个元素的表上进行测试,使用eiter方法的时间大约为350ms。

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;
}
Run Code Online (Sandbox Code Playgroud)