JDBC ResultSet

L’interface Java JDBC ResultSet représente le résultat d’une requête de base de données. Le texte sur les requêtes montre comment le résultat d’une requête est renvoyé sous forme dejava.sql.ResultSet. Ce ResultSetest ensuite itéré pour inspecter le résultat. Ce tutoriel explique comment utiliser l’interface JDBC ResultSet.

Un JDBC ResulSet contient des enregistrements

Un JDBC ResultSetcontient des enregistrements. Chaque enregistrement contient un ensemble de colonnes. Chaque enregistrement contient le même nombre de colonnes, bien que toutes les colonnes n’aient pas nécessairement une valeur. Une colonne peut avoir une valeur null. Voici une illustration d’un JDBC ResultSet:

Nom Prenom Sexe
Joel Jean masculin
Pierre Jacques masculin
Résultats

Ce ResultSetcomporte 3 colonnes différentes (Nom, Prenom, Sexe) et 3 enregistrements avec des valeurs différentes pour chaque colonne.

Création d’un ensemble de résultats

Vous créez un ResultSeten exécutant un Statementou PreparedStatement, comme ceci :

Statement statement = connection.createStatement();
ResultSet result = statement.executeQuery("select * from personne");

Ou comme ceci :

String sql = "select * from personne";
PreparedStatement statement = connection.prepareStatement(sql);
ResultSet result = statement.executeQuery();

Itérer le ResultSet

Pour itérer ResultSet, vous utilisez sa méthodenext(). La méthodenext() renvoie true si le ResultSetpossède un enregistrement suivant et déplace le ResultSet pour pointer vers le prochain enregistrement. S’il n’y avait plus d’enregistrements, next()renvoie false et vous ne pouvez plus. Une fois que la next()méthode a retourné false, vous ne devez plus l’appeler. Cela peut entraîner une exception.

Voici un exemple d’itération ResultSetà l’aide de la méthode next():

while(result.next()) {
    // ... récupère les valeurs des colonnes de ces enregistrement
}

Comme vous pouvez le voir, la méthodenext()est en fait appelée avant l’accès au premier enregistrement. Cela signifie que le ResultSetcommence à pointer avant le premier enregistrement. Une fois next() a été appelé une fois, il pointe sur le premier enregistrement.

De même, lorsque next()est appelée et renvoie false, ResultSetpointe en fait après le dernier enregistrement.

Vous ne pouvez pas obtenir le nombre de lignes dans un ResultSetsauf si vous parcourez tout le chemin et comptez les lignes. Cependant, si le ResultSetest uniquement vers l’avant, vous ne pouvez pas ensuite le parcourir en arrière. Même si vous pouviez revenir en arrière, ce serait une manière lente de compter les lignes dans le ResultSet. Il est préférable de structurer votre code de manière à ne pas avoir besoin de connaître le nombre d’enregistrements à l’avance.

Accéder aux valeurs des colonnes

Lors de l’itération ResultSet, vous souhaitez accéder aux valeurs de colonne de chaque enregistrement. Pour ce faire, appelez une ou plusieurs des nombreuses méthodesgetXXX(). Vous passez le nom de la colonne dont vous voulez obtenir la valeur aux nombreuses méthodes getXXX(). Par exemple:

while(result.next()) {
    result.getString ("nom");
    result.getInt ("prenom");
    result.getString ("sexe");
    // etc.
}

Il existe de nombreuses méthodes getXXX()que vous pouvez appeler, qui renvoient la valeur de la colonne sous la forme d’un certain type de données, par exemple String, int, long, double, BigDecimal, etc. Elles prennent toutes le nom de la colonne pour obtenir la valeur de la colonne, comme paramètre. Voici une liste d’exemples rapides de ces méthodes getXXX() :

result.getArray("NomColonne");
result.getAsciiStream("NomColonne");
result.getBigDecimal("NomColonne");
result.getBinaryStream("NomColonne");
result.getBlob("NomColonne");
result.getBoolean("NomColonne");
result.getBlob("NomColonne");
result.getBoolean("NomColonne");
result.getByte("NomColonne");
result.getBytes("NomColonne");
result.getCharacterStream("NomColonne");
result.getClob("NomColonne");
result.getDate("NomColonne");
result.getDouble("NomColonne");
result.getFloat("NomColonne");
result.getInt("NomColonne");
result.getLong("NomColonne");
result.getNCharacterStream("NomColonne");
result.getObject("NomColonne");
result.getRef("NomColonne");
result.getRowId("NomColonne");
result.getShort("NomColonne");
result.getSQLXML("NomColonne");
result.getString("NomColonne");
result.getTime("NomColonne");
result.getTimestamp("NomColonne");
result.getUnicodeStream("NomColonne");
result.getURL("NomColonne");

Les méthodesgetXXX()sont également disponibles dans des versions qui prennent un index de colonne au lieu d’un nom de colonne. Par exemple:

while(result.next()) {
    result.getString (1);
    result.getInt (2);
    result.getBigDecimal(3);
    // etc.
}

L’index d’une colonne dépend généralement de l’index de la colonne dans l’instruction SQL. Par exemple, l’instruction SQL

select nom, prenom, sexe from personne

Cette requêtés a trois colonnes. Le nom de la colonne est répertorié en premier et aura donc l’index 1 dans le ResultSet. Prenom aura l’index 2 et le sexe aura l’index 3.

Parfois, vous ne connaissez pas l’index d’une certaine colonne à l’avance. Par exemple, si vous utilisez un type de requête SQLselect * from , vous ne connaissez pas la séquence des colonnes.

Si vous ne connaissez pas l’index d’une certaine colonne, vous pouvez trouver l’index de cette colonne en utilisant la méthodeResultSet.findColumn(String columnName), comme ceci :

int nomindex= result.findColumn("nom");
int prenomindex = result.findColumn("prenom");
int sexeindex = result.findColumn("sexe");

while (result.next()) {
     String  nom= result.getString (nomindex);
    String  prenom= result.getString (prenomindex );
   String  sexe= result.getString (sexeindex);
}

Types de Java ResultSet

Un ResultSetpeut être d’un certain type. Le type détermine certaines caractéristiques et capacités du ResultSet.

Tous les types ne sont pas pris en charge par toutes les bases de données et les pilotes JDBC. Vous devrez vérifier votre base de données et votre pilote JDBC pour voir s’il prend en charge le type que vous souhaitez utiliser. La méthodeDatabaseMetaData.supportsResultSetType(int type) renvoie true ou false selon le type donné qui est pris en charge ou non. 

Quelques types de ResultSet:

  1. ResultSet.TYPE_FORWARD_ONLY
  2. ResultSet.TYPE_SCROLL_INSENSITIVE
  3. ResultSet.TYPE_SCROLL_SENSITIVE

Le type par défaut estTYPE_FORWARD_ONLY

TYPE_FORWARD_ONLYsignifie que le ResultSetne peut être navigué que vers l’avant. Autrement dit, vous ne pouvez vous déplacer que de la ligne 1, à la ligne 2, à la ligne 3, etc. Vous ne pouvez pas reculer dans le ResultSet.

TYPE_SCROLL_INSENSITIVEsignifie qu’il est possible de naviguer (faire défiler) vers l’avant et vers l’arrière. Vous pouvez également sauter à une position relative à la position actuelle ou sauter à une position absolue. Le ResultSetest insensible aux modifications de la source de données sous-jacente lorsque le ResultSetest ouvert. C’est-à-dire que si un enregistrement dans le ResultSetest modifié dans la base de données par un autre thread ou processus, cela ne sera pas reflété dans ResulsSetles de ce type déjà ouverts.

TYPE_SCROLL_SENSITIVEsignifie qu’il ResultSetest possible de naviguer (faire défiler) vers l’avant et vers l’arrière. Vous pouvez également sauter à une position relative à la position actuelle ou sauter à une position absolue. Le ResultSetest sensible aux modifications apportées à la source de données sous-jacente lorsque le ResultSetest ouvert. C’est-à-dire que si un enregistrement dans le ResultSetest modifié dans la base de données par un autre thread ou processus, cela sera reflété dans les ResulsSetde ce type déjà ouverts.

Méthodes de navigation

L’interface ResultSet contient les méthodes de navigation suivantes. N’oubliez pas que toutes les méthodes ne fonctionnent pas avec tous les types de ResultSet. Les méthodes qui fonctionnent dépendent de votre base de données, du pilote JDBC et du type ResultSet.

Méthode La description
absolute() Déplace le ResultSetpoint vers une position absolue. La position est un numéro de ligne passé en paramètre à la méthode absolute().
afterLast() Déplace le ResultSetpoint après la dernière ligne du ResultSet.
beforeFirst() Déplace le ResultSetpoint avant la première ligne du ResultSet.
first() Déplace le ResultSetpoint vers la première ligne du ResultSet.
last() Déplace le ResultSetpoint sur la dernière ligne du ResultSet.
next() Déplace le ResultSetpoint vers la ligne suivante dans le ResultSet.
previous() Déplace le ResultSetpoint vers la ligne précédente dans le ResultSet.
relative() Déplace le ResultSetpoint vers une position relative à sa position actuelle. La position relative est transmise en tant que paramètre à la méthode relative et peut être à la fois positive et négative.
Déplace leResultSet
méthodes

L’interface ResultSet contient également un ensemble de méthodes que vous pouvez utiliser pour vous renseigner sur la position actuelle du ResultSet. Ceux-ci sont:

Méthode La description
getRow() Renvoie le numéro de ligne de la ligne actuelle – la ligne actuellement pointée par le ResultSet.
getType() Renvoie le typeResultSet.
isAfterLast() Renvoie vrai si les ResultSetpoints après la dernière ligne. Faux sinon.
isBeforeFirst() Renvoie true si les ResultSet se situent avant la première ligne. Faux sinon.
isFirst() Renvoie vrai si ResultSetpointe sur la première ligne. Faux sinon.

Enfin, l’interface ResultSet contient également une méthode pour mettre à jour une ligne avec les modifications de la base de données, si elle est sensible au changement.

Méthode La description
refreshRow() Actualise les valeurs de colonne de cette ligne avec les dernières valeurs de la base de données.
ResulSet

Mise à jour d’un ResultSet

Si un ResultSetpeut être mis à jour, vous pouvez mettre à jour les colonnes de chaque ligne dans le ResultSet. Vous le faites en utilisant les nombreuses méthodesupdateXXX(). Par exemple:

    result.updateString ("nom" , "Jean");
    result.updateString  ("prenom" , "Pierre");
    result.updateString  ("sexe","masculin");
    result.updateRow();

Vous pouvez également mettre à jour une colonne en utilisant l’index de la colonne au lieu du nom de la colonne. Voici un exemple:

    result.updateString (1, "Jean");
    result.updateString(2, "Pierre");
    result.updateString(3, "masculin");
    result.updateRow();

Remarquez l’appel updateRow(). C’est lors de l’appel updateRow() que la base de données est mise à jour avec les valeurs de la ligne. Si vous n’appelez pas cette méthode, les valeurs mises à jour dans le ResultSet ne sont jamais envoyées à la base de données. Si vous appelez à l’intérieur updateRow()d’une transaction, les données ne sont pas réellement validées dans la base de données tant que la transaction n’est pas validée.

Insertion de lignes dans un ResultSet

Si le ResultSetpeut être mis à jour, il est également possible d’y insérer des lignes. Vous le faites en :

  1. appeler ResultSet.moveToInsertRow()
  2. mettre à jour les valeurs des colonnes de lignes
  3. appeler ResultSet.insertRow()

Voici un exemple:

result.moveToInsertRow();
result.updateString (1, "Jean");
result.updateString  (2, "Pierre");
result.updateString  (3, "masculin");
result.insertRow();
result.beforeFirst();

La ligne pointée après l’appel moveToInsertRow()est une ligne spéciale, un tampon, que vous pouvez utiliser pour construire la ligne jusqu’à ce que toutes les valeurs de colonne aient été définies sur la ligne.

Une fois que la ligne est prête à être insérée dans le ResultSet, appelez la méthodeinsertRow() .

Après avoir inséré la ligne ResultSet, il pointe toujours vers la ligne d’insertion. Cependant, vous ne pouvez pas être certain de ce qui se passera si vous essayez d’y accéder, une fois la ligne insérée. Par conséquent, vous devez déplacer le ResultSetvers une position valide après avoir inséré la nouvelle ligne. Si vous devez insérer une autre ligne, appelez explicitement moveToInsertRow()pour le signaler au ResultSet.

Maintien de l’ensemble de ResultSet

La capacité de détention d’unResultSet détermine si unResultSetest fermé lorsque la méthode commit() du connection sous-jacent est appelée.

Tous les modes de maintien ne sont pas pris en charge par toutes les bases de données et les pilotes JDBC. La DatabaseMetaData.supportsResultSetHoldability(int holdability)renvoie vrai ou faux selon le mode de maintien donné qui est pris en charge ou non.

Il existe deux types de maintien :

  1. ResultSet.CLOSE_CURSORS_OVER_COMMIT
  2. ResultSet.HOLD_CURSORS_OVER_COMMIT

La capacité de maintienCLOSE_CURSORS_OVER_COMMIT signifie que toutes les instancesResultSet sont fermées lorsque la méthodeconnection.commit() est appelée sur la connexion qui a créé le ResultSet.

La capacité de maintienHOLD_CURSORS_OVER_COMMIT signifie que le ResultSetest maintenu ouvert lorsque la méthodeconnection.commit()est appelée sur la connexion qui a créé le ResultSet.

La possibilité de maintienHOLD_CURSORS_OVER_COMMIT peut être utile si vous utilisez le ResultSetpour mettre à jour des valeurs dans la base de données. Ainsi, vous pouvez ouvrir un ResultSet, y mettre à jour des lignes, appeler connection.commit() et toujours garder le même ResultSetouvert pour de futures transactions sur les mêmes lignes.

Publié dans : Java

Laisser un commentaire