FAQ JDBCConsultez toutes les FAQ

Nombre d'auteurs : 8, nombre de questions : 162, dernière mise à jour : 3 juin 2015  Ajouter une question

 

Cette FAQ a été réalisée à partir des questions fréquemment posées sur les forums de http://www.developpez.com et de l'expérience personnelle des auteurs.

Nous tenons à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes. Les auteurs font leur maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous trouvez une erreur, ou que vous souhaitez nous aider en devenant rédacteur, lisez ceci.


SommaireLes métadonnées - MetaDataInformations sur les tables (5)
précédent sommaire suivant
 

L'interface DatabaseMetaData permet d'accéder à de nombreuses informations sur les tables d'une base de données, notamment grâce à la méthode getTables.

Code java : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Connection connection = DriverManager.getConnection(url,user,password); 
//on récupère les métadonnées à partir de Connection 
DatabaseMetaData dmd = connection.getMetaData(); 
//récupération des informations 
ResultSet tables = dmd.getTables(connection.getCatalog(),null,"%",null); 
//affichage des informations 
while(tables.next()){ 
   System.out.println("###################################"); 
   for(int i=0; i<tables.getMetaData().getColumnCount();i++){ 
      String nomColonne = tables.getMetaData().getColumnName(i+1); 
      Object valeurColonne = tables.getObject(i+1); 
      System.out.println(nomColonne+" = "+valeurColonne); 
   } 
}
Ce premier exemple permet d'obtenir toutes les tables et informations disponibles. On peut remarquer la présence du symbole % pour l'attribut définissant le nom de la table. Celui-ci permet d'indiquer que l'on recherche n'importe quel nom.

On peut naturellement cibler sa recherche en spécifiant une colonne précise du ResultSet. Voici la liste des principales colonnes du ResultSet renvoyé par getTables.

  • TABLE_CAT String = le nom du catalogue auquel appartient la table.
  • TABLE_SCHEM String = le schéma de la table.
  • TABLE_NAME String = le nom de la table.
  • TABLE_TYPE String = le type de la table. Ce type peut être : "TABLE", "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY", "LOCAL TEMPORARY", "ALIAS", "SYNONYM".
  • REMARKS String = Commentaires sur la table.

Remarque : il en existe d'autres, mais elles ne sont pas toujours présentes. Cela dépend de l'implémentation et du SGBD.

On peut par exemple facilement créer une méthode nous indiquant la présence d'une table dans une base.

Code java : Sélectionner tout
1
2
3
4
5
6
7
8
public static boolean existe(Connection connection, String nomTable) throws SQLException{ 
   boolean existe; 
   DatabaseMetaData dmd = connection.getMetaData(); 
   ResultSet tables = dmd.getTables(connection.getCatalog(),null,nomTable,null); 
   existe = tables.next(); 
   tables.close(); 
   return existe; 
}
L'utilisation pourrait ressembler à ceci :

Code java : Sélectionner tout
1
2
3
4
5
6
7
8
9
Connection connection = DriverManager.getConnection(url,user,password); 
System.out.println("Existence d'une table dans la base de données : "+ 
                                                   existe(connection,"%")); 
System.out.println("Existence de la table MaTable : "+ 
                                                   existe(connection,"MaTable")); 
System.out.println("Existence d'une table dont le nom commence par 'a' : "+ 
                                                   existe(connection,"a%")); 
System.out.println("Existence d'une table dont le nom fait 5 caractères et finit par e : "+ 
                                                   existe(connection,"____e"));

Mis à jour le 11 avril 2013 Ioan

L'interface DatabaseMetaData permet de retrouver les clefs primaires d'une table. Par exemple :

Code java : Sélectionner tout
1
2
3
4
5
6
7
8
Connection connection = ...; 
DatabaseMetaData metadata = connection.getMetaData(); 
String nomTable = "MaTable"; 
ResultSet clefs = metadata.getPrimaryKeys(connection.getCatalog(),null,nomTable); 
while(clefs.next()){ 
   String nomColonne = clefs.getString("COLUMN_NAME"); 
   System.out.println("La colonne "+nomColonne+"est une clef primaire de "+nomTable); 
}

Mis à jour le 11 avril 2013 Ioan

DatabaseMetaData permet de retrouver des informations sur les colonnes d'une table grâce à la méthode getColumns. Voici un exemple :

Code java : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Connection connection = DriverManager.getConnection(url,user,password); 
  
//on récupère les métadonnées à partir de Connection 
DatabaseMetaData dmd = connection.getMetaData(); 
  
//récupération des informations 
String nomDeLaTable = "le nom de la table qui nous intéresse"; 
ResultSet resultat = dmd.getColumns(connection.getCatalog(),null,nomDeLaTable, "%"); 
  
//affichage des informations 
ResultSetMetaData rsmd = resultat.getMetaData();  
while(resultat.next()){ 
    for(int i=0; i<rsmd.getColumnCount(); i++){ 
	String col = rsmd.getColumnName(i+1); 
	Object val = resultat.getObject(i+1); 
	System.out.println(col+" = "+val); 
    } 
}
Vous trouverez plus d'informations, sur les paramètres de cette méthode et sur la structure du ResultSet retourné, dans la Javadoc.

Mis à jour le 11 avril 2013 Ioan

Cette information est accessible grâce à DatabaseMetaData et à la méthode getTablePrivileges. Cette méthode retourne un ResultSet dont chaque ligne correspond aux droits d'une table répondant au pattern passé pour le nom.

Code java : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public static void getDroits(Connection connection, String nomTable) throws SQLException{ 
   DatabaseMetaData dmd = connection.getMetaData(); 
   System.out.println("Droits de "+dmd.getUserName()+" pour la(les) table(s) "+nomTable); 
   ResultSet droits = dmd.getTablePrivileges(null,null,nomTable); 
   while(droits.next()){ 
      //de qui viennent les droits 
      String grantor = droits.getString("GRANTOR"); 
      //à qui appartiennent les droits 
      String grantee = droits.getString("GRANTEE"); 
      //quels sont ces droits (select, insert, etc.) 
      String privilege = droits.getString("PRIVILEGE"); 
      //possibilité de donner ces droits à un tiers 
      String grantable = droits.getString("IS_GRANTABLE"); 
      System.out.println("grantor = "+grantor); 
      System.out.println("grantee = "+grantee); 
      System.out.println("privilege = "+privilege); 
      System.out.println("grantable = "+grantable); 
   } 
   droits.close(); 
}
De la même manière, on peut utiliser la méthode getColumnPrivileges pour avoir des informations sur les droits sur une colonne ou un ensemble de colonnes. Les colonnes du ResultSet sont identiques.

Attention, ces deux méthodes sont susceptibles de lever une SQLEception, si l'utilisateur n'a pas certains droits. Par exemple pour MySQL, il faut avoir les droits de lecture sur la base de données mysql. Tout dépend de l'implémentation.

Mis à jour le 11 avril 2013 Ioan

DatabaseMetaData permet de récupérer des informations sur les index d'une table donnée (ou de plusieurs), grâce à la méthode getIndexInfo. Voici un exemple permettant d'afficher sur la sortie standard toutes les informations disponibles pour les index d'une table nommée « MaTable ».

Code java : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Connection connection = DriverManager.getConnection(url,user,password); 
  
//on récupère les métadonnées à partir de Connection 
DatabaseMetaData dmd = connection.getMetaData(); 
  
//récupération des informations 
ResultSet resultat = dmd.getIndexInfo(connection.getCatalog(),null,"MaTable", false, false); 
  
//affichage des informations 
ResultSetMetaData rsmd = resultat.getMetaData();  
while(resultat.next()){ 
	for(int i=0; i<rsmd.getColumnCount(); i++){ 
		String col = rsmd.getColumnName(i+1); 
		Object val = resultat.getObject(i+1); 
		System.out.println(col+" = "+val); 
	} 
}
Explication :
Les deux premiers paramètres correspondent au catalogue et au schéma. Ensuite, on indique le nom de la table (ici "MaTable"). Pour ce paramètre, on peut, comme toujours avec les métadonnées, utiliser les caractères % et _, pour sélectionner plusieurs tables. Vous trouverez plus d'informations sur ces paramètres et sur la structure du ResultSet récupéré dans la Javadoc.

Mis à jour le 11 avril 2013 Ioan

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2017 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

 
Responsables bénévoles de la rubrique Java : Mickael Baron - Robin56 -