web-dev-qa-db-fra.com

Manière efficace de gérer ResultSet dans Java

J'utilise un ResultSet en Java et je ne sais pas comment le fermer correctement. J'envisage d'utiliser ResultSet pour construire un HashMap, puis de le fermer par la suite. Cette technique HashMap est-elle efficace ou existe-t-il des moyens plus efficaces de gérer cette situation? J'ai besoin à la fois de clés et de valeurs, alors utiliser HashMap semblait être un choix logique.

Si l'utilisation d'une HashMap est la méthode la plus efficace, comment puis-je construire 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;
}
52
Deepak
  1. Itérer sur le ResultSet
  2. Créez un nouvel objet pour chaque ligne, pour stocker les champs dont vous avez besoin
  3. Ajoutez ce nouvel objet à ArrayList ou à Hashmap ou à votre convenance
  4. Fermer le ResultSet, l'instruction et la connexion à la base de données

Terminé

EDIT: maintenant que vous avez posté du code, j'ai apporté quelques modifications à celui-ci.

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

Je viens de clarifier la réponse de RHT pour éliminer certains avertissements et pensais que je partagerais. Eclipse a fait l'essentiel du travail:

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;
}
30
Brad M

RHT l'a à peu près. Ou vous pouvez utiliser un RowSetDynaClass et laisser quelqu'un d'autre faire tout le travail :)

15
Dave Newton

c’est ma solution alternative, au lieu d’une liste de carte, j’utilise une carte de liste. Testé sur des tables de 5000 éléments, sur une base de données distante, la méthode eiter prend environ 350 ms.

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
Lesto

Quelques éléments pour améliorer les autres réponses. Premièrement, vous ne devriez jamais renvoyer un HashMap, qui est une implémentation spécifique. Retourne à la place un vieux Java.util.Map. Mais ce n’est pas le cas pour cet exemple, de toute façon. Votre code ne renvoie que la dernière ligne du ResultSet en tant que mappage (hachage). Vous voulez plutôt retourner un List<Map<String,Object>>. Réfléchissez à la façon dont vous devriez modifier votre code pour le faire. (Ou vous pouvez prendre la suggestion de Dave Newton).

4
Rick Goldstein