Manière efficace de gérer ResultSet en Java

J’utilise un ResultSet en Java et je ne sais pas comment le fermer correctement. J’envisage d’utiliser le ResultSet pour construire un HashMap puis pour fermer ResultSet après cela. Cette technique de HashMap est-elle efficace ou existe-t-il des moyens plus efficaces de gérer cette situation? J’ai besoin de clés et de valeurs, donc l’utilisation d’un HashMap semblait être un choix logique.

Si l’utilisation de HashMap est la méthode la plus efficace, comment puis-je créer et utiliser HashMap dans mon code?

Voici ce que j’ai essayé:

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

  1. Itérer sur le ResultSet
  2. Créez un nouvel object pour chaque ligne, pour stocker les champs dont vous avez besoin
  3. Ajoutez ce nouvel object à ArrayList ou Hashmap ou à tout ce que vous voulez
  4. Fermez le ResultSet, Statement et la connexion à la firebase database

Terminé

EDIT: maintenant que vous avez posté du code, j’ai apporté quelques modifications.

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

Je viens de nettoyer la réponse de RHT pour éliminer certains avertissements et j’ai pensé partager. Eclipse a réalisé l’essentiel du travail:

 public List> convertResultSetToList(ResultSet rs) throws SQLException { ResultSetMetaData md = rs.getMetaData(); int columns = md.getColumnCount(); List> list = new ArrayList>(); 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; } 

RHT l’a pas mal. Ou vous pourriez utiliser un RowSetDynaClass et laisser quelqu’un d’autre faire tout le travail 🙂

Quelques points pour améliorer les autres réponses. Tout d’abord, vous ne devez jamais renvoyer une HashMap , qui est une implémentation spécifique. Retournez plutôt un ancien java.util.Map . Mais en fait, ce n’est pas correct pour cet exemple, de toute façon. Votre code ne renvoie que la dernière ligne du ResultSet en tant que carte (de hachage). Vous voulez plutôt retourner une List> . Pensez à la façon dont vous devriez modifier votre code pour le faire. (Ou vous pourriez prendre la suggestion de Dave Newton).

c’est ma solution alternative, au lieu d’une liste de cartes, j’utilise une carte de liste. Testé sur des tables de 5000 éléments, sur une firebase database distante, les temps sont de l’ordre de 350ms pour la méthode eiter.

 private Map> resultSetToArrayList(ResultSet rs) throws SQLException { ResultSetMetaData md = rs.getMetaData(); int columns = md.getColumnCount(); Map> 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; }