Efficient way to Handle ResultSet in Java

JavaHashmapResultsetSqlresultsetmapping

Java Problem Overview


I'm using a ResultSet in Java, and am not sure how to properly close it. I'm considering using the ResultSet to construct a HashMap and then closing the ResultSet after that. Is this HashMap technique efficient, or are there more efficient ways of handling this situation? I need both keys and values, so using a HashMap seemed like a logical choice.

If using a HashMap is the most efficient method, how do I construct and use the HashMap in my code?

Here's what I've tried:

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

Java Solutions


Solution 1 - Java

  1. Iterate over the ResultSet
  2. Create a new Object for each row, to store the fields you need
  3. Add this new object to ArrayList or Hashmap or whatever you fancy
  4. Close the ResultSet, Statement and the DB connection

Done

EDIT: now that you have posted code, I have made a few changes to it.

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

Solution 2 - Java

I just cleaned up RHT's answer to eliminate some warnings and thought I would share. Eclipse did most of the work:

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

Solution 3 - Java

RHT pretty much has it. Or you could use a RowSetDynaClass and let someone else do all the work :)

Solution 4 - Java

this is my alternative solution, instead of a List of Map, i'm using a Map of List. Tested on tables of 5000 elements, on a remote db, times are around 350ms for eiter method.

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

Solution 5 - Java

A couple of things to enhance the other answers. First, you should never return a HashMap, which is a specific implementation. Return instead a plain old java.util.Map. But that's actually not right for this example, anyway. Your code only returns the last row of the ResultSet as a (Hash)Map. You instead want to return a List<Map<String,Object>>. Think about how you should modify your code to do that. (Or you could take Dave Newton's suggestion).

Solution 6 - Java

i improved the solutions of RHTs/Brad Ms and of Lestos answer.

i extended both solutions in leaving the state there, where it was found. So i save the current ResultSet position and restore it after i created the maps.

The rs is the ResultSet, its a field variable and so in my solutions-snippets not visible.

I replaced the specific Map in Brad Ms solution to the 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;
	}

In Lestos solution, i optimized the code. In his code he have to lookup the Maps each iteration of that for-loop. I reduced that to only one array-acces each for-loop iteration. So the program must not seach each iteration step for that string-key.

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

Solution 7 - Java

Here is the code little modified that i got it from 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();

Solution 8 - Java

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDeepakView Question on Stackoverflow
Solution 1 - JavaRHTView Answer on Stackoverflow
Solution 2 - JavaBrad MView Answer on Stackoverflow
Solution 3 - JavaDave NewtonView Answer on Stackoverflow
Solution 4 - JavaLestoView Answer on Stackoverflow
Solution 5 - JavaRick GoldsteinView Answer on Stackoverflow
Solution 6 - JavaRobin KreuzerView Answer on Stackoverflow
Solution 7 - JavamasvelView Answer on Stackoverflow
Solution 8 - Javahitesh bariyaView Answer on Stackoverflow