Gestion de la ligne courante

Nous avons écrit le premier programme et il a parfaitement fonctionné. Nous avons écrit une requête, l'avons exécutée et, par conséquent, la méthode executeQuery() nous a renvoyé un objetensemble de résultatsUn qui contient tous les résultats de la requête. Et maintenant, nous allons essayer de comprendre comment obtenir ces résultats.

Le résultat de la requête peut contenir des milliers de lignes et des centaines de colonnes de différents types, ce n'est donc pas une tâche aussi triviale que vous pourriez le penser. Par exemple, les images peuvent être stockées dans la base de données, puis vous pouvez obtenir une image sous la forme d'un ensemble d'octets ou d'un InputStream pour la télécharger.

Mais nous allons commencer par le plus simple - avec le concept de « ligne de résultat actuelle ». Étant donné que le résultat comporte généralement de nombreuses lignes, l'objetensemble de résultatsa un pointeur vers la ligne actuelle à l'intérieur. Et commute séquentiellement les lignes pour les lire en utilisant la méthode next() .

Cette approche est principalement utilisée pour l'optimisation. Le pilote JDBC peut ne pas charger les chaînes de la base de données tant que vous ne les avez pas lues de manière séquentielle. Vous aussi, lisez FileInputStream séquentiellement du début à la fin. Cette approche doit donc vous être familière et compréhensible.

Cependant, si vous en avez vraiment besoin, les fichiers peuvent être lus n'importe où à l'aide de la classe RandomAccessFile .

La classe ResultSet permet également quelque chose de similaire et vous permet de déplacer la ligne actuelle le long du résultat n'importe où. Pour ce faire, il dispose des méthodes suivantes :

Méthode Description
1 suivant() Passer à la ligne suivante
2 précédent() Passer à la ligne précédente
3 estPremier() Ligne actuelle en premier ?
4 estAvantPremier() Sommes-nous devant la première ligne ?
5 estDernier() La ligne actuelle est-elle la dernière ?
6 estAprèsDernier() Sommes-nous après la date limite?
7 absolu (entier n) Rend la Nième ligne courante
8 relatif(entier n) Déplace la ligne actuelle de N positions vers l'avant. N peut être <0
9 getRow() Renvoie le numéro de ligne

Les méthodes sont assez simples, mais deux explications s'imposent. Les résultats sont, pour ainsi dire, encadrés par des lignes vides des deux côtés. Par conséquent, initialement la ligne courante est avant la première ligne du résultat. Et pour obtenir la première ligne, vous devez appeler la méthode next() au moins une fois .

Si vous avez appelé la méthode next() sur la dernière ligne , vous êtes passé à la ligne après la dernière . Vous ne pouvez pas en lire les données, mais aucune erreur ne se produira. Ici, la méthode isAfterLast() déclarera true comme résultat.

Exemple:

Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM user");

System.out.println( results.getRow() );        	// 0
System.out.println( results.isBeforeFirst() );  // true
System.out.println( results.isFirst() );          	// false

results.next();

System.out.println( results.getRow() );        	// 1
System.out.println( results.isBeforeFirst() );  // false
System.out.println( results.isFirst() );          	// true

results.next();

System.out.println( results.getRow() );        	// 2
System.out.println( results.isBeforeFirst() );  // false
System.out.println( results.isFirst() );          	// false

Obtenir des données de la ligne actuelle

Vous avez appris à gérer magistralement la ligne actuelle. Voyons maintenant comment en extraire des données. Pour cela, l'objetensemble de résultatsil existe des méthodes spéciales qui peuvent toutes être décrites par un seul modèle :

getType(numberColumns)

Cependant, si la colonne a un nom, vous pouvez également obtenir par le nom de la colonne :

getType(nameColumns)

Exemple:

while (results.next()) {
        	Integer id = results.getInt(“id”);
        	String name = results.getString(“name”);
        	System.out.println(results.getRow() + ". " + id + "\t"+ name);
}

Ci-dessous, je fournirai un tableau qui vous aidera à associer les types de données SQL et les méthodes ResultSet :

Type de données SQL Méthodes getXXX()
CARBONISER getString()
VARCHAR getString()
INT getInt()
FLOTTER getDouble()
CLOB getClob()
GOUTTE getBlob()
DATE avoir un rendez-vous()
TEMPS obtenir du temps()
HORODATAGE getTimestamp()

Le point, je pense que vous l'avez compris.

Obtenir différentes données sur ResultSet

Nous avons compris comment lire les données de la ligne actuelle : à la fois par le numéro de colonne et par son nom. Au fait, comment puis-je connaître le nom de la colonne par son numéro ? Ou le nombre de colonnes dans le résultat ?

D'une part, si vous écrivez une demande, alors vous semblez devoir tout savoir. Par contre, on peut écrire un programme qui affiche le résultat d'une requête à l'écran : la requête nous est passée et on veut juste afficher à l'écran (dans la console, page web) tout ce que le serveur SQL a renvoyé à nous.

JDBC a un objet spécial pour cela, l' interface ResultSetMetaData . Obtenir un objet de ce type est assez simple :

Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM user");
ResultSetMetaData resultSetMetaData = results.getMetaData();

L' interface ResultSetMetaData a des méthodes très intéressantes. Vous trouverez ci-dessous les plus populaires :

1 getColumnCount() Renvoie le nombre de colonnes de résultat
2 getColumnName(int colonne) Renvoie le nom de la colonne
3 getColumnLabel (int colonne) Renvoie la description de la colonne
4 getColumnType() Renvoie le type de colonne : nombre (code spécial)
5 getColumnTypeName() Renvoie le type de colonne : chaîne
6 getColumnClassName() Renvoie le nom de la classe Java pour le type de colonne
7 getTableName() Renvoie le nom de la table
8 getCatalogName() Renvoie le nom du répertoire de la colonne
9 getSchemaName() Renvoie le nom du schéma de la base de données
dix isAutoIncrement(int colonne) La colonne prend-elle en charge AUTO INCREMENT ?
onze isNullable() Une colonne peut-elle contenir NULL ?

Profitons-en pour en apprendre un peu plus sur notre table :

ResultSetMetaData metaData = results.getMetaData();
int columnCount = metaData.getColumnCount();
for (int column = 1; column <= columnCount; column++)
{
        	String name = metaData.getColumnName(column);
        	String className = metaData.getColumnClassName(column);
        	String typeName = metaData.getColumnTypeName(column);
        	int type = metaData.getColumnType(column);

        	System.out.println(name + "\t" + className + "\t" + typeName + "\t" + type);
}

Important! Faites attention à ce que les colonnes soient numérotées à partir de 1. Les lignes aussi. Comme c'est inhabituel, n'est-ce pas ?

Et voici le résultat que j'ai obtenu après avoir exécuté le programme:

"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
identifiant java.lang.Integer INT 4
nom java.lang.string VARCHAR 12
niveau java.lang.Integer INT 4
date_de_création java.sql.date DATE 91
Processus terminé avec le code de sortie 0