web-dev-qa-db-fra.com

Obtention du nombre de lignes dans un jeu de résultats Java

Est-ce que quelqu'un connaît un meilleur moyen d'obtenir le nombre de lignes d'un jeu de résultats Java renvoyé d'une base de données MySQL? Le résultat renvoyé ne correspondra pas au nombre total de lignes lues dans la base de données. Par conséquent, je ne pense pas pouvoir utiliser la fonction d'agrégation COUNT de SQL.

public static int getResultSetRowCount(ResultSet resultSet) {
    int size = 0;
    try {
        resultSet.last();
        size = resultSet.getRow();
        resultSet.beforeFirst();
    }
    catch(Exception ex) {
        return 0;
    }
    return size;
}
24
Mr Morgan

Une meilleure solution consiste à oublier le nombre de lignes jusqu'à ce que vous ayez chargé correctement le ResultSet dans un objet ou une collection. Vous pouvez conserver le nombre de lignes avec l'une ou l'autre de ces options. 

Il est important de fermer les ResultSets (et toutes les ressources SQL telles que Connection et Statement) dans la portée de méthode la plus étroite possible. Cela signifie que vous ne passez pas ResultSet hors de la couche de persistance. Il est préférable d’obtenir le nombre de lignes à l’aide d’un appel Collection size ().

Arrêtez de penser aux bases de données et commencez à penser en termes d'objets. Java est un langage orienté objet.

20
duffymo

Vous pouvez exécuter

SELECT FOUND_ROWS()

immédiatement après avoir exécuté votre instruction SELECT pour trouver le nombre de lignes.

9
Lalith

Vous pouvez toujours utiliser SELECT COUNT() avec les mêmes conditions exactes, avant de créer la SELECT réelle.

2
Adeel Ansari

Voici ma solution à cette question (étant donné que je veux surtout le nombre d'enregistrements renvoyés pour construire un tableau ou quelque chose de similaire): Utilisez une collection telle que Vector <T> .

public Vector<T> getRecords(){
   Vector<T> records = new Vector<T>();
   init_conn_and_stmt_and_rs();

   try {
      rs = stmt.executeQuery("SELECT * FROM `table` WHERE `something` = 0");
      while(rs.next()){
         // Load the Vector here.
      }
   } catch (SQLException e) {
      e.printStackTrace();
   }finally{
      close_rs_and_stmt_and_conn();
   }
   return records;
}

Propre et simple, non? Fonctionne pour tout jeu d'enregistrements de taille renvoyé (inutile de connaître la taille à l'avance) et rend toutes les méthodes List disponibles. 

Cela m’a bien servi pendant un certain temps, mais si quelqu'un y voit une faille, faites-le moi savoir. Je veux toujours améliorer mes pratiques, tu sais.

2
Kingsolmn

Vous pouvez également utiliser le moyen suivant pour obtenir le nombre total d'enregistrements dans le resultSet:

statement = connect.createStatement();
resultSet = statement.executeQuery(sqlStatement);
resultSet.last();
int count = resultSet.getRow();
System.out.println(count);

nombre est le nombre total de lignes renvoyées pour votre jeu de résultats. ;)

1
yi2ng2

Si vous utilisez Java 6, vous pouvez utiliser la classe JDBC4ResultSet contenant la méthode getUpdateCount qui renvoie le nombre de lignes affectées par une instruction SQL même pour une instruction Select.

Voir ci-dessous l'exemple de code:

PreparedStatement ps = con.prepareStatement("select * from any_table ...");
JDBC4ResultSet rs = (JDBC4ResultSet)ps.executeQuery();
int rowNumber = rs.getUpdateCount();

J'espère que cette aide!

1
Andre Farina

Voir ci-dessous l'exemple de code avec la solution de Lalith:

public static int getResultSetRowCount(connection) {
    int size = 0; 
    statement = connection.createStatement(); 
    try {
        resultSet = statement.executeQuery("SELECT FOUND_ROWS()")
        resultSet.next()
        size = resultSet.getInt(1)
    }
    catch(Exception ex) {
        return 0;
    }
    statement.close();
    return size;
}
0
Karima Rafes