Je vous ai fourni un morceau de code, il fonctionne, mais comment ça marche ?
Voici le moment où tout vous sera dévoilé.
Comme je vous le disais plus haut, l'objet
Statement est l'objet qui vous permet de faire des requêtes SQL. Celles-ci peuvent être de type :
- CREATE ;
- INSERT ;
- UPDATE ;
- SELECT ;
- DELETE.
Vous n'êtes pas sans savoir que, selon le type de requête exécutée, celle-ci retourne un / des résultat(s), dans le cas d'un
SELECT, ou une validation / un message d'erreur dans les autres cas.
L'objet
Statement vous est fourni par l'objet
Connection grâce à l'instruction
conn.createStatement();
.
Nous verrons, dans le chapitre suivant, un peu plus de choses concernant l'objet Statement.
Ce que j'ai fait ensuite, c'est demander à mon objet
Statement d'exécuter une requête SQL de type
SELECT. Vous la voyez, celle-ci :
Code : SQL
Cette requête me retournant un résultat contenant beaucoup de lignes, elles-mêmes contenant plusieurs colonnes, nous avons stocké ce résultat dans un objet
ResultSet, objet permettant de faire diverses actions sur des résultats de requêtes SQL !
Après cette ligne de code :
ResultSet result = state.executeQuery("SELECT * FROM classe");
, les résultats sont stockés dans l'objet
ResultSet et nous n'avons plus qu'à afficher les données.
Ici, j'ai utilisé un objet de type
ResulSetMetaData afin de récupérer les "
meta data" de ma requête. Comprenez ceci comme "
récupérer les informations globales de ma requête". Ici, nous avons utilisé cet objet afin de récupérer le nombre de colonnes renvoyé par la requête SQL ainsi que leurs noms.
Cet objet "
meta data" permettent de récupérer des informations très utiles comme :
- le nombre de colonnes d'un résultat ;
- le nom des colonnes d'un résultat ;
- le type de données stocké dans chaque colonne ;
- le nom de la table à qui appartient la colonne (dans le cas d'une jointure de table) ;
- ...
Vous voyez que ces informations peuvent être utiles.
Il existe aussi un objet DatabaseMetaData qui, lui, fournit des informations sur la base de données !
Vous comprenez mieux ce que signifie cette portion de code :
Code : Java | System.out.println("\n**********************************");
//On affiche le nom des colonnes
for(int i = 1; i <= resultMeta.getColumnCount(); i++)
System.out.print("\t" + resultMeta.getColumnName(i).toUpperCase() + "\t *");
System.out.println("\n**********************************");
|
Nous nous servons de la méthode nous donnant le nombre de colonnes dans le résultat afin de récupérer le nom de la colonne grâce à son index !
ATTENTION : contrairement aux indices de tableaux, les indices de colonnes SQL commencent à 1 !
Ensuite, nous récupérons les données de notre requête en nous servant de l'indice des colonnes :
Code : Java | while(result.next()){
for(int i = 1; i <= resultMeta.getColumnCount(); i++)
System.out.print("\t" + result.getObject(i).toString() + "\t |");
System.out.println("\n---------------------------------");
}
|
Nous utilisons une première boucle afin que, tant que notre objet
ResultSet nous retourne des lignes de résultats, nous parcourions ensuite chaque ligne via notre boucle
for
.
La méthode next()
permet de positionner l'objet sur la ligne suivante dans sa liste de résultat ! Au premier tour de boucle, cette méthode positionne l'objet sur la première ligne. Si vous ne positionnez pas l'objet résultat et que vous tentez de lire des données, une exception sera levée !
Je suis parti du postulat que ne connaissons pas le type de données de nos colonnes, mais vu que nous les connaissons, ce code aurait tout aussi bien fonctionné :
Code : Java | while(result.next()){
System.out.print("\t" + result.getInt("cls_id") + "\t |");
System.out.print("\t" + result.getString("cls_nom") + "\t |");
System.out.println("\n---------------------------------");
}
|
On a le droit de faire ça ?
Tout à fait ! Nous connaissons le nom de nos colonnes retournées par la requête SQL, nous connaissons aussi leurs types, il nous suffit donc d'invoquer la méthode adéquat de l'objet
ResultSet en utilisant le nom de la colonne à récupérer !
Par contre, si vous essayez de récupérer le contenu de la colonne "cls_nom" avec la méthode getInt("cls_nom")
, vous aurez une zolie exception !
Il existe une méthode
getXXX()
par type primitif et quelques autres correspondant aux types SQL :
- getArray(int colummnIndex)
;
- getAscii(int colummnIndex)
;
- getBigDecimal(int colummnIndex)
;
- getBinary(int colummnIndex)
;
- getBlob(int colummnIndex)
;
- getBoolean(int colummnIndex)
;
- getBytes(int colummnIndex)
;
- getCharacter(int colummnIndex)
;
- getDate(int colummnIndex)
;
- getDouble(int colummnIndex)
;
- getFloat(int colummnIndex)
;
- getInt(int colummnIndex)
;
- getLong(int colummnIndex)
;
- getObject(int colummnIndex)
;
- getString(int colummnIndex)
;
Et, à la fin, nous fermons nos objets :
Code : Java | result.close();
state.close();
|
Avant de voir plus en détail les possibilités qu'offrent ces objets, nous allons faire deux-trois requêtes SQL afin de nous habituer à la façon dont tout ça fonctionne !