在Java中处理ResultSet的有效方法

时间:2011-09-21 21:50:39

标签: java hashmap resultset 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;
}

8 个答案:

答案 0 :(得分:76)

  1. 迭代ResultSet
  2. 为每行创建一个新对象,以存储您需要的字段
  3. 将此新对象添加到ArrayList或Hashmap或您想要的任何内容
  4. 关闭ResultSet,Statement和数据库连接
  5. 完成

    编辑:既然您已发布代码,我已对其进行了一些更改。

    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;
    }