Looking for Computer Science  & Information Technology online courses ?
Check my new web site: https://www.yesik.it !

En plus de pouvoir accéder aux données stockées dans une base, JDBC permet aussi de récupérer des données sur la base. Celles-ci sont connues dans le jargon des bases de données sous le terme de métadonnées (on parle également parfois de méta-informations). Ainsi, par exemple, il est possible d'interroger le SGBD (Système de Gestion de Bases de Données) pour connaître le nombre de tables dans la base et leur nom. Ou encore la liste des procédures stockées.

Nous allons ici illustrer ce concept en utilisant ces métadonnées pour extraire la liste des index sur une table et leur composition.

Mise en oeuvre

Toutes les métadonnées sur la base sont accessibles au travers d'une instance de DatabaseMetaData:

/* ... */
		Connection	conn = DriverManager.getConnection(connectionURL);
 
		DatabaseMetaData dbmd = conn.getMetaData();

En ce qui concerne l'accès aux informations relatives aux index, cela se fait via la méthode java.sql.DatabaseMetaData.getIndexInfo. Celle-ci permet de récupérer les informations concernant les index d'une table sous la forme d'un ResultSet:

/* ... */
		ResultSet rs = dbmd.getIndexInfo(catalog, schema, table, false, false);

Les diverses informations peuvent ensuite être extraites comme de n'importe quel autre ResultSet. Par exemple, pour les afficher:

/* ... */
		ResultSetMetaData rsmd = rs.getMetaData();
		for(int i = 0; i < rsmd.getColumnCount(); ++i) {
			System.out.printf("%18s |", rsmd.getColumnLabel(i+1));
		}
		System.out.println();
 
		while(rs.next()) {
			for(int i = 0; i < rsmd.getColumnCount(); ++i) {
				System.out.printf("%18s |", rs.getString(i+1));
			}
			System.out.println();
		}

Ne confondez-pas DatabaseMetaData et ResultSetMetaData!

Comme vous le constatez dans l'exemple ci-dessus, JDBC permet également d'accéder à des métadonnées sur un ResultSet. Cette fois-ci au travers d'une instance de la classe ResultSetMetaData. Je m'en sers ici pour extraire le nombre et le nom des colonnes obtenues.

Exemple de résultat

Pour terminer voici les informations que l'on peut obtenir ainsi concernant la table suivante:

CREATE TABLE TBL (
    I INT, 
    C CHAR(80), 
    V VARCHAR(255), 
    PRIMARY KEY(V)
);
CREATE INDEX IDX1 ON TBL (I ASC, C DESC);
CREATE UNIQUE INDEX IDX2 ON TBL (C ASC);
         TABLE_CAT |       TABLE_SCHEM |        TABLE_NAME |        NON_UNIQUE |   INDEX_QUALIFIER |        INDEX_NAME |              TYPE |  ORDINAL_POSITION |       COLUMN_NAME |       ASC_OR_DESC |       CARDINALITY |             PAGES |  FILTER_CONDITION |
                   |               APP |               TBL |             false |                   |              IDX2 |                 3 |                 1 |                 C |                 A |              null |              null |              null |
                   |               APP |               TBL |             false |                   |SQL091026162141490 |                 3 |                 1 |                 V |                 A |              null |              null |              null |
                   |               APP |               TBL |              true |                   |              IDX1 |                 3 |                 1 |                 I |                 A |              null |              null |              null |
                   |               APP |               TBL |              true |                   |              IDX1 |                 3 |                 2 |                 C |                 D |              null |              null |              null |

Un dernier mot

Comme vous le voyez dans l'exemple précédent, une certaine gymnastique est nécessaire pour exploiter ces résultats. Néanmoins, toutes les informations sont présentes pour retrouver la composition exacte de chaque index associé à notre table. Ainsi, vous comprenez que l'exploitation des métadonnées d'une base est un élément important pour pouvoir écrire du code capable de s'adapter à la structure d'une base inconnue.

De façon évidente, ce sera indispensable si vous écrivez un outil générique de manipulation de bases de données. Mais plus modestement, cela permet aussi de découpler certaines opérations de la structure de la base. Utile par exemple si cette structure est mouvante – comme au cours du développement, ou quand les spécifications évoluent fréquemment. Ou encore si vous développez un module susceptible d'être utilisé sur plusieurs projets et/ou bases dont la structure n'est pas la même.

Enfin, n'oubliez pas non plus que puisque tous ces traitements utilisent l'API standard JDBC, ils peuvent être utilisés avec n'importe quel SGBD fournissant un pilote JDBC. Ici encore, cela a pour avantage de rendre l'application indépendante du SGBD. Ce qui ne serait pas le cas si vous utilisiez des extensions spécifiques à votre base de données pour obtenir ces mêmes informations.