Obtenir le nombre de lignes dans un ensemble de résultats Java

est-ce que quelqu'un connaît une meilleure façon d'obtenir le nombre de lignes dans un jeu de résultats Java retourné à partir d'une base de données MySQL? Le résultat retourné ne sera pas le nombre total de lignes lues dans la base de données, donc je ne pense pas que je puisse utiliser SQL COUNT fonction d'agrégation.

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
demandé sur a_horse_with_no_name 2010-06-16 15:11:05

7 réponses

une meilleure réponse est d'oublier le nombre de lignes jusqu'à ce que vous ayez réussi à charger le jeu de résultats dans un objet ou une collection. Vous pouvez garder le comptage du nombre de lignes avec l'une de ces options.

il est important de fermer les ensembles de résultats (et toutes les ressources SQL comme connexion et Statement) dans la portée de méthode la plus étroite possible. Cela signifie qu'il ne faut pas sortir les résultats de la couche de persistance. Mieux pour obtenir le nombre de lignes en utilisant une taille de Collection() appeler.

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

19
répondu duffymo 2017-11-25 23:52:09

Vous pouvez exécuter

SELECT FOUND_ROWS()

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

9
répondu Lalith 2010-06-16 11:27:45

Vous pouvez toujours utiliser SELECT COUNT() avec les mêmes conditions exactes, avant de faire le réel SELECT.

2
répondu Adeel Ansari 2010-06-16 11:32:20

voici ma solution à cette question (puisque je veux surtout le nombre d'enregistrements retournés pour construire un tableau ou quelque chose de similaire): utilisez une collection telle que Vecteur à la place.

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 n'importe quel jeu d'enregistrement de taille retourné (pas besoin de connaître la taille avant main) et rend tous les List méthodes disponibles.

Cela m'a bien servi pendant un temps, mais si quelqu'un voit une faille dans cette, s'il vous plaît laissez-moi savoir. Toujours envie pour faire mes pratiques mieux, tu sais.

2
répondu Kingsolmn 2012-07-26 13:55:16

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

voir ci-dessous le code d'exemple:

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

j'espère que cette aide!

1
répondu Andre Farina 2012-07-25 17:51:41

Vous pouvez aussi utiliser la façon suivante pour obtenir le total des enregistrements dans le jeu de résultats:

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

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

1
répondu yi2ng2 2013-09-28 04:57:51

voir ci-dessous le code d'exemple 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
répondu Karima Rafes 2018-02-08 12:29:27