recorrer - Manera eficiente de manejar ResultSet en Java
mostrar datos de una base de datos en java (5)
- Iterato sobre el ResultSet
- Crea un nuevo objeto para cada fila, para almacenar los campos que necesitas
- Agregue este nuevo objeto a ArrayList o Hashmap o lo que sea que desee
- Cierre el ResultSet, Statement y la conexión DB
Hecho
EDITAR: ahora que ha publicado el código, le he hecho algunos cambios.
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;
}
Estoy usando un ResultSet en Java, y no estoy seguro de cómo cerrarlo correctamente. Estoy considerando usar el ResultSet para construir un HashMap y luego cerrar el ResultSet después de eso. ¿Es esta técnica HashMap eficiente, o hay formas más eficientes de manejar esta situación? Necesito tanto claves como valores, así que usar un HashMap me pareció una opción lógica.
Si usar un HashMap es el método más eficiente, ¿cómo construyo y uso el HashMap en mi código?
Esto es lo que he intentado:
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;
}
Limpié la respuesta de RHT para eliminar algunas advertencias y pensé que compartiría. Eclipse hizo la mayor parte del trabajo:
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 prácticamente lo tiene. O podría usar RowSetDynaClass y dejar que otra persona haga todo el trabajo :)
Un par de cosas para mejorar las otras respuestas. Primero, nunca debe devolver un HashMap
, que es una implementación específica. Devuelve en su lugar un simple java.util.Map
viejo. Pero de todos modos, eso no es correcto para este ejemplo. Su código solo devuelve la última fila del ResultSet como un mapa (Hash). En su lugar, desea devolver una List<Map<String,Object>>
. Piensa en cómo debes modificar tu código para hacer eso. (O podría tomar la sugerencia de Dave Newton).
esta es mi solución alternativa, en lugar de una Lista de mapas, estoy usando un Mapa de lista. Probado en tablas de 5000 elementos, en un db remoto, los tiempos son alrededor de 350 ms para el método eiter.
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;
}