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.
- Comment récupérer les noms des tables d'une base de données ?
- Comment récupérer les clefs primaires d'une table ?
- Comment récupérer des informations sur les colonnes d'une table ?
- Comment connaître les droits de l'utilisateur sur une table ?
- Comment récupérer des informations sur les index d'une table ?
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); } } |
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; } |
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")); |
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); } |
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); } } |
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(); } |
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.
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); } } |
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.
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 çaLes 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 © 2024 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.