31.3. Lancer une requête et traiter les résultats

À chaque fois que vous voulez exécuter des instructions SQL sur la base de données, vous avez besoin d'une instance Statement ou PreparedStatement. Une fois que vous avez un Statement ou un PreparedStatement, vous pouvez lancer une requête. Elle renvoie une instance ResultSet contenant le résultat complet (voir Section 31.3.1 pour savoir comment modifier ce comportement). Exemple 31-1 illustre ce processus.

Exemple 31-1. Traiter une requête simple avec JDBC

Cet exemple lance une requête simple et affiche la première colonne de chaque ligne en utilisant un Statement.

Statement st = db.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM matable WHERE macolonne = 500");
while (rs.next()) {
    System.out.print("Colonne 1 renvoyée ");
    System.out.println(rs.getString(1));
}
rs.close();
st.close();

Cet exemple lance la même requête que précédemment mais utilise un PreparedStatement et une valeur liée dans la requête.

int foovalue = 500;
PreparedStatement st = db.prepareStatement("SELECT * FROM matable WHERE
ma colonne = ?");
st.setInt(1, valeur);
ResultSet rs = st.executeQuery();
while (rs.next()) {
    System.out.print("Colonne 1 renvoyée ");
    System.out.println(rs.getString(1));
}
rs.close();
st.close();

31.3.1. Obtenir des résultats basés sur un curseur

Par défaut, le pilote récupère tous les résultats d'une requête en une seule fois. Ceci présente des inconvénients pour les gros ensembles de données. Le pilote JDBC fournit un moyen de baser un ResultSet sur un curseur de bases de données pour ne récupérer qu'un petit nombre de lignes.

Un bloc de lignes est en cache du côté client de la connexion et, une fois qu'il est entièrement lu, le prochain bloc de lignes est récupéré en repositionnant le curseur.

Exemple 31-2. Configurer la taille de la récupération pour activer ou désactiver les curseurs.

Passer le code en mode curseur revient à configurer la taille de récupération de Statement à la bonne taille. Le reconfigurer à 0 fera que toutes les lignes seront en cache (le comportement par défaut).

Statement st = db.createStatement();
// Active le curseur.
st.setFetchSize(50);
ResultSet rs = st.executeQuery("SELECT * FROM matable");
while (rs.next()) {
   System.out.print("une ligne a été renvoyée.");
}
rs.close();
// Désactive le curseur.
st.setFetchSize(0);
ResultSet rs = st.executeQuery("SELECT * FROM matable");
while (rs.next()) {
   System.out.print("toutes les lignes ont été renvoyées.");
}
rs.close();
// Ferme l'instruction.
st.close();

31.3.2. Utiliser les interfaces Statement ou PreparedStatement

Points à considérer pour l'utilisation de l'interface Statement ou PreparedStatement :

31.3.3. Utiliser l'interface ResultSet

Points à considérer pour l'utilisation de l'interface ResultSet :