Documentation PostgreSQL 7.4.29 | ||||
---|---|---|---|---|
Précédent | Arrière rapide | Chapitre 31. Interface JDBC | Avance rapide | Suivant |
À 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();
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();
Statement
ou
PreparedStatement
Points à considérer pour l'utilisation de l'interface
Statement
ou
PreparedStatement
:
Vous pouvez utiliser une simple instance
Statement
autant de fois que vous le voulez. Vous
pouvez aussi en créer une dès que vous avez ouvert la connexion et
l'utiliser pendant toute la durée de la connexion. Mais vous devez
vous rappeler qu'un seul ResultSet
peut
exister par Statement
ou
PreparedStatement
à un moment donné.
Si vous avez besoin de lancer une requête pendant le traitement d'un
ResultSet
, il suffit de créer et
utiliser un autre Statement
.
Si vous utilisez les threads et que plusieurs personnes
utilisent la base de données, vous pouvez utiliser un
Statement
pour chaque thread. Référez-vous à
Section 31.9 si vous pensez utiliser les threads car il
couvre quelques points importants.
Une fois que vous avez fini d'utiliser
Statement
ou
PreparedStatement
, vous devez le fermer.
ResultSet
Points à considérer pour l'utilisation de l'interface
ResultSet
:
Avant de lire une valeur, vous devez appeler la fonction
next()
. Elle renvoie true s'il existe un résultat
mais, surtout, elle prépare le traitement de la ligne.
La spécification JDBC précise que vous ne devez accéder un champ que une fois seulement. Il est plus sûr de se tenir à cette règle bien qu'actuellement le pilote PostgreSQL vous autorise à accéder à un champ autant de fois que vous le souhaitez.
Vous devez fermer un ResultSet
en appelant
close()
une fois que vous avez fini de
l'utiliser.
Lorsque vous faites une autre requête avec le
Statement
utilisé pour créer un
ResultSet
, l'instance
ResultSet
initialement ouverte est fermée
automatiquement.
Précédent | Sommaire | Suivant |
Initialiser le pilote | Niveau supérieur | Exécuter des mises à jour |