Ce tutoriel explique comment utiliser JDBC ResultSet pour récupérer des données. Nous apprendrons également à connaître les interfaces ResultSetMetaData et DatabaseMetaData à l'aide d'exemples :
Dans le cadre de la Gestionnaire de pilotes JDBC tutoriel de la Série de tutoriels JDBC Nous avons appris à utiliser JDBC DriverManager et ses méthodes, JDBC PreparedStatement dans les applications Java.
Dans ce tutoriel, nous aborderons les interfaces restantes de JDBC. Nous avons abordé les interfaces Statement, PreparedStatement et CallableStatement dans nos précédents tutoriels.
Nous allons ici découvrir les interfaces JDBC ResultSet, ResultSetMetaData et DatabaseMetaData, leurs méthodes et la manière d'utiliser ces méthodes dans un programme Java.
Interface JDBC ResultSet
L'interface ResultSet est présente dans le package java.sql. Elle est utilisée pour stocker les données renvoyées par la table de la base de données après l'exécution des instructions SQL dans le programme Java. L'objet ResultSet maintient un point de curseur sur les données de résultat. Par défaut, le curseur se positionne avant la première ligne des données de résultat.
La méthode next() est utilisée pour déplacer le curseur à la position suivante dans le sens de la marche. Elle renvoie la valeur FALSE s'il n'y a plus d'enregistrements. Elle récupère les données en appelant la méthode executeQuery() à l'aide de n'importe quel objet statement. Il peut s'agir d'un objet Statement, PreparedStatement ou CallableStatement. Les interfaces PreparedStatement et CallableStatement sont les sous-interfaces de l'objet Statement.l'interface.
Interface de déclaration
Statement statemnt1 = conn.createStatement() ; ResultSet rs1 = statemnt1.executeQuery("Select * from EMPLOYEE_DETAILS") ;
Interface PreparedStatement
PreparedStatement pstatemnt1 = conn.prepareStatement(insert_query) ; ResultSet rs1 = pstatemnt1.executeQuery("Select * from EMPLOYEE_DETAILS") ;
Nous pouvons utiliser la méthode getX() pour obtenir les données des colonnes tout en parcourant les résultats où X - est le type de données de la colonne. Nous pouvons utiliser les noms de colonnes ou l'index pour obtenir les valeurs à l'aide des méthodes getX().
while(rs1.next()) { int empNum = rs1.getInt("empNum") ; String lastName = rs1.getString("lastName") ; String firstName = rs1.getString("firstName") ; String email = rs1.getString("email") ; String deptNum = rs1.getString("deptNum") ; String salary = rs1.getString("salary") ; System.out.println(empNum + "," +lastName+ "," +firstName+ "," +email +", "+deptNum +"," +salary) ; }
Nous pouvons également mentionner le numéro d'index de la colonne au lieu du nom de la colonne dans les méthodes getX().
while(rs1.next()) { int empNum = rs1.getInt(1) ; String lastName = rs1.getString(2) ; String firstName = rs1.getString(3) ; String email = rs1.getString(4) ; String deptNum = rs1.getString(5) ; String salary = rs1.getString(6) ; System.out.println(empNum + "," +lastName+ "," +firstName+ "," +email +", "+deptNum +"," +salary) ; }
Types de ResultSet
Par défaut, nous pouvons itérer les données/valeurs dans le ResultSet qui a été retourné en tant que sortie de l'instruction SQL exécutée dans la direction avant. Nous pouvons itérer les valeurs dans d'autres directions en utilisant Scrollable ResultSet. Nous pouvons spécifier le type et la concurrence du ResultSet lors de la création d'objets Statement, PreparedStatement, et CallableStatement.
Il existe 3 types de ResultSet, à savoir
- TYPE_FORWARD_ONLY : Il s'agit de l'option par défaut, dans laquelle le curseur se déplace du début à la fin, c'est-à-dire dans le sens de la marche.
- TYPE_SCROLL_INSENSITIVE : Dans ce type, le curseur se déplace à la fois vers l'avant et vers l'arrière. Si nous apportons des modifications aux données pendant l'itération des données stockées, elles ne seront pas mises à jour dans l'ensemble de données si quelqu'un modifie les données dans la base de données. Parce que l'ensemble de données contient les données à partir du moment où la requête SQL renvoie les données.
- TYPE_SCROLL_SENSITIVE : Elle est similaire à TYPE_SCROLL_INSENSITIVE, à la différence que si quelqu'un met à jour les données après que la requête SQL a renvoyé les données, l'itération reflétera les modifications apportées à l'ensemble de données.
ResultSet Concurrency
Il y a 2 modes de Concurrence dans ResultSet, qui sont :
- ResultSet.CONCUR_READ_ONLY : Il s'agit du mode de concurrence par défaut. Nous ne pouvons que lire les données du ResultSet. La mise à jour n'est pas applicable.
- ResultSet.CONCUR_UPDATABLE : Nous pouvons mettre à jour les données dans l'objet ResultSet.
Certaines bases de données ne supportent pas le mode concurrentiel pour tous les types de ResultSet. Dans ce cas, nous devons vérifier si elles supportent le type et le mode concurrentiel souhaités en utilisant la méthode supportsResultSetConcurrency().
Méthodes de l'interface ResultSet
Il existe quatre catégories de méthodes ResultSet, à savoir
- Méthodes de navigation
- Méthodes de récupération
- Méthodes de fixation
- Méthodes diverses
Nous aborderons d'abord les méthodes de navigation, puis nous irons plus loin.
#1) Méthodes de navigation
Cette méthode est utilisée pour déplacer le curseur dans l'ensemble de données.
- Boolean absolute(int row) : Elle est utilisée pour déplacer le curseur sur la ligne spécifiée dans le paramètre et renvoie un message vrai si l'opération est réussie, sinon elle renvoie un message faux.
- Void afterLast() : Il fait en sorte que le curseur du ResultSet se déplace après la dernière ligne.
- Void beforeFirst() : Il fait en sorte que le curseur du ResultSet se déplace avant la première ligne.
- Boolean first() : Elle fait passer le curseur du ResultSet à la première ligne et renvoie True si l'opération est réussie, sinon False.
- Boolean last() : Elle fait passer le curseur du ResultSet à la dernière ligne et renvoie True si l'opération est réussie, sinon False.
- Boolean next() : Elle fait passer le curseur du ResultSet à la ligne suivante. Elle renvoie True s'il y a plus d'enregistrements et False s'il n'y a plus d'enregistrements.
- Boolean previous() : Elle fait passer le curseur du ResultSet à la ligne précédente et renvoie True si l'opération est réussie, sinon False.
- Boolean relative() : Il déplace le curseur sur le nombre de lignes donné, soit dans le sens avant, soit dans le sens arrière.
- Int getRow() : Elle renvoie le numéro de ligne actuel vers lequel pointe l'objet ResultSet.
- Void moveToCurrentRow() : Il ramène le curseur à la ligne actuelle s'il se trouve dans la ligne d'insertion.
- Void moveToInsertRow() : Elle déplace le curseur sur la ligne spécifique pour insérer la ligne dans la base de données. Elle se souvient de l'emplacement actuel du curseur. Nous pouvons donc utiliser la méthode moveToCurrentRow() pour déplacer le curseur sur la ligne actuelle après l'insertion.
Dans ce tutoriel, tous les programmes sont écrits en Java. Nous avons utilisé la version 8 de Java et la base de données Oracle.
>>Vous pouvez télécharger le logiciel Oracle à partir d'ici
>>Vous pouvez télécharger la version 8 de Java à partir d'ici
Il présente la procédure d'installation de Java étape par étape.
Programme d'exemple JDBC ResultSet :(Utilisation des méthodes de navigation)
package com.STH.JDBC ; import java.sql.Connection ; import java.sql.DatabaseMetaData ; import java.sql.DriverManager ; import java.sql.PreparedStatement ; import java.sql.ResultSet ; import java.sql.SQLException ; public class ResultSet_Example { public static void main(String[] args) throws ClassNotFoundException { // TODO Auto-generated method stub //Select query String select_query = "select * fromemployee_details" ; Class.forName("oracle.jdbc.driver.OracleDriver") ; //Connexion à la base de données Oracle try(Connection conn = DriverManager.getConnection("jdbc:oracle:thin:system/pass123@localhost:1521:X E")) { //Création de l'objet DatabaseMetaData DatabaseMetaData dbmd = conn.getMetaData() ; //Contrôle du support des types sensibles au défilement et des mises à jour concourantes boolean isSupportResultSetType =dbmd.supportsResultSetConcurrency(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE) ; if(isSupportResultSetType == true) { // Création d'une déclaration préparée PreparedStatement pstatemnt1 = conn.prepareStatement(select_query,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet. CONCUR_UPDATABLE) ; ResultSet rs = pstatemnt1.executeQuery() ; //Déplacement du curseur sur la première ligne rs.first() ;System.out.println("FIRST ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)) ; //Déplacement du curseur vers la dernière ligne rs.last() ; System.out.println("LAST ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)) ; //Déplacement du curseur vers l'avant de la première ligne rs.beforeFirst() ;System.out.println("Le curseur pointe avant la première ligne. Utilisez next() pour avancer") ; //Déplacement du curseur vers la première ligne en utilisant next() rs.next() ; System.out.println("FIRST ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)) ; //Déplacement du curseur vers la dernière ligne rs.afterLast() ; System.out.println("CursorUtilisez previous() pour revenir en arrière") ; //Déplacement du curseur vers la dernière ligne en utilisant previous() rs.previous() ; System.out.println("LAST ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)) ; //Déplacement du curseur vers la troisième ligne rs.absolute(3) ; System.out.println("Le curseur pointe vers la 3ème ligne") ; System.out.println("Le curseur pointe vers la 3ème ligne") ; //Déplacement du curseur vers la 4ème ligne rs.absolute(3) ; System.out.println("Le curseur pointe vers la 3ème ligne") ; //Déplacement du curseur vers la 3ème ligne rs.absolute(3) ; System.out.println("Le curseur pointe vers la 3ème ligne").rangée") ; System.out.println("THIRD ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)) ; //Déplacement du curseur pour pointer la rangée précédente de la troisième rangée rs.relative(-1) ; System.out.println("Le curseur pointe sur la première rangée précédant la troisième rangée") ; System.out.println("Second ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+") ; //Déplacement du curseur pour pointer la rangée précédente de la troisième rangée rs.relative(-1) ; System.out.println("Le curseur pointe la première rangée précédant la troisième rangée") ; System.out.println("Second ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)) ; //Déplacement du curseur vers la 4ème ligne après la 2ème ligne rs.relative(4) ; System.out.println("Le curseur pointe vers la 4ème ligne après la 2ème ligne") ; System.out.println("SIXTH ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)) ; //Déplacement du curseur vers la ligne en coursSystem.out.println(" Current Row = " + rs.getRow()) ; } } } catch (SQLException e) { e.printStackTrace() ; } } }
SORTIE :
Données dans la table Employee_details
Explication :
Dans le programme ci-dessus, nous avons implémenté les méthodes first(), last(), beforeFirst(), afterLast(), next(), previous(), absolute(), relative() et getRow() dans ResultSet. Pour utiliser ces méthodes, nous définissons les valeurs ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE dans la méthode prepareStatement.
Ensuite, nous verrons quelles sont les méthodes Getter dans ResultSet :
#2) Méthodes Getter
ResultSet a stocké les données de la table à partir de la base de données. Les méthodes Getter sont utilisées pour obtenir les valeurs de la table dans ResultSet. Pour cela, nous devons passer la valeur de l'index de la colonne ou le nom de la colonne.
Les méthodes getter de ResultSet sont les suivantes :
- int getInt(int ColumnIndex) : Elle est utilisée pour obtenir la valeur de la colonne spécifiée Index sous la forme d'un type de données int.
- float getFloat(int ColumnIndex) : Elle est utilisée pour obtenir la valeur de la colonne spécifiée Index sous la forme d'un type de données flottantes.
- java.sql.date getDate(int ColumnIndex) : Elle est utilisée pour obtenir la valeur de la colonne Index spécifiée sous forme de date.
- int getInt(String ColumnName) : Elle est utilisée pour obtenir la valeur de la colonne spécifiée sous la forme d'un type de données int.
- float getFloat(String ColumnName) : Elle est utilisée pour obtenir la valeur de la colonne spécifiée sous la forme d'un type de données flottantes.
- Java.sql.date getDate(String ColumnName) : Elle est utilisée pour obtenir la valeur de la colonne spécifiée sous forme de date.
L'interface ResultSet comporte des méthodes d'obtention pour tous les types de données primitives (booléen, long, double) et pour les chaînes de caractères. Nous pouvons également obtenir un tableau et des données de type binaire à partir de la base de données. L'interface ResultSet comporte également des méthodes à cet effet.
#3) Méthodes Setter/Updater
Nous pouvons mettre à jour la valeur dans la base de données en utilisant les méthodes ResultSet Updater. Elles sont similaires aux méthodes Getter, mais ici nous devons transmettre les valeurs/données pour la colonne particulière à mettre à jour dans la base de données.
Les méthodes de mise à jour de ResultSet sont les suivantes :
- void updateInt(int ColumnIndex, int Value) : Elle est utilisée pour mettre à jour la valeur de la colonne Index spécifiée avec une valeur int.
- void updateFloat(int ColumnIndex, float f) : Elle est utilisée pour mettre à jour la valeur de la colonne Index spécifiée avec la valeur flottante.
- void updateDate(int ColumnIndex, Date d) : Elle est utilisée pour mettre à jour la valeur de la colonne Index spécifiée avec la valeur de la date.
- void updateInt(String ColumnName, int Value) : Elle est utilisée pour mettre à jour la valeur de la colonne spécifiée avec la valeur int donnée.
- void updateFloat(String ColumnName, float f) : Elle est utilisée pour mettre à jour la valeur de la colonne spécifiée avec la valeur flottante donnée.
- Java.sql.date getDate(String ColumnName) : Elle est utilisée pour mettre à jour la valeur de la colonne spécifiée avec la valeur de la date donnée.
Il existe des méthodes de mise à jour pour tous les types de données primitives (booléen, long, double) et pour les chaînes de caractères dans l'interface ResultSet.
Les méthodes de mise à jour ne font que mettre à jour les données dans l'objet ResultSet. Les valeurs seront mises à jour dans la base de données après avoir appelé la méthode insertRow ou updateRow.
Mise à jour d'une ligne :
Nous pouvons mettre à jour les données d'une ligne en appelant la méthode updateX(), en passant le nom ou l'index de la colonne et les valeurs à mettre à jour. Nous pouvons utiliser n'importe quel type de données à la place de X dans la méthode updateX. Jusqu'à présent, nous avons mis à jour les données dans l'objet ResultSet. Pour mettre à jour les données dans la base de données, nous devons appeler la méthode updateRow().
Insertion d'une ligne :
Nous devons utiliser moveToInsertRow() pour déplacer le curseur afin d'insérer une nouvelle ligne. Nous avons déjà abordé ce point dans la section Méthodes de navigation. Ensuite, nous devons appeler la méthode updateX() pour ajouter les données à la ligne. Nous devons fournir des données pour toutes les colonnes, sinon la valeur par défaut de cette colonne particulière sera utilisée.
Après avoir mis à jour les données, nous devons appeler la méthode insertRow(), puis utiliser la méthode moveToCurrentRow() pour ramener le curseur à la ligne où il se trouvait avant l'insertion d'une nouvelle ligne.
Exemple de ResultSet :
package com.STH.JDBC ; import java.sql.Connection ; import java.sql.DatabaseMetaData ; import java.sql.DriverManager ; import java.sql.PreparedStatement ; import java.sql.ResultSet ; import java.sql.SQLException ; import java.sql.Statement ; public class ResultSet_Example1 { public static void main(String[] args) throws ClassNotFoundException { // TODO Fusible de méthode auto-généré String select_query ="select empnum,lastName,firstName from employee_details" ; String insert_query = "insert into employee_details values( ?,?, ?,?, ?,?)" ; Class.forName("oracle.jdbc.driver.OracleDriver") ; //Connexion à la base de données Oracle try(Connection conn = DriverManager.getConnection("jdbc:oracle:thin:system/pass123@localhost:1521:XE")) { //Création de l'objet DatabaseMetaData DatabaseMetaData dbmd = conn.getMetaData() ;/Vérification de la prise en charge par le pilote des types insensibles au défilement et actualisables par concur booléen isSupportResultSetType = dbmd.supportsResultSetConcurrency(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE) ; if(isSupportResultSetType == true) { // Création d'une déclaration préparée PreparedStatement pstatemnt1 =conn.prepareStatement(select_query,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE) ; ResultSet rs = pstatemnt1.executeQuery(select_query) ; //Déplacement du curseur à la dernière ligne du tableau rs.last() ; System.out.println("DERNIÈRE LIGNE : Avant d'insérer un nouvel employé") ; System.out.println("DERNIÈRE LIGNE : EMPNUM = " + rs.getInt(1)) ; System.out.println("\N EMP NUM = " + rs.getInt("empNum") + "\N".LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)) ; // Définition des valeurs à insérer dans la table EMPLOYEE_DETAILS //Déplacement du curseur pour insérer une ligne dans la table rs.moveToInsertRow() ; //Mise à jour de la valeur EMPNUM rs.updateInt(1, 1017) ; //Mise à jour de la valeur LAST NAME rs.updateString(2, "Bond") ; //Mise à jour de la valeur FIRST NAME rs.updateString(3, "James") ; //Insertation d'une nouvelle ligne rs.insertRow() ;//Déplacement du curseur à la 5ème ligne rs.absolute(5) ; System.out.println("Befor Updating EMPNUM of the 5th ROW") ; System.out.println("\n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)) ; System.out.println(" Updating EMP id of the 5th EMPLOYEE") ; //Mise à jour du EMPNUM de la 5ème ligne rs.updateInt(1,3005) ; rs.updateRow() ; System.out.println("\n EMPNUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Moving the cursor to point last row rs.last(); System.out.println("LAST ROW: EMPNUM = " + rs.getInt(1)); System.out.println("\n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); } } catch (SQLException e) { e.printStackTrace(); } }}
SORTIE :
Explication :
Dans le programme ci-dessus, nous avons d'abord stocké les données de la table Employee_details dans l'objet ResultSet à l'aide de la requête SELECT. Ensuite, nous avons affiché les données de la dernière ligne de la table employee_details à l'aide de la méthode last() de ResultSet. La méthode moveToInsertRow() fait pointer le curseur sur la ligne actuelle, qui est maintenant la dernière ligne.
Les méthodes updateXXX() ont permis de mettre à jour les valeurs de la ligne et la méthode insertRow() a inséré les données dans une nouvelle ligne. En utilisant la méthode absolute(), nous avons fait pointer le curseur sur la 5ème ligne. La méthode UpdateInt() a été utilisée pour mettre à jour l'EMPNUM avec un nouvel identifiant du 5ème employé dans la table. Ensuite, nous avons affiché les données pour vérifier si l'EMPNUM a été mis à jour ou non.
Faire pointer le curseur sur la dernière ligne de la table à l'aide de last() et l'afficher. Pour exécuter la logique ci-dessus, nous devons définir les valeurs ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE dans la méthode prepareStatement.
#4) Méthodes diverses
- void close() : Elle est utilisée pour fermer l'instance ResultSet et libérer les ressources associées à l'instance ResultSet.
- ResultSetMetaData getMetaData() : Elle renvoie l'instance ResultSetMetaData, qui contient des informations sur le type et les propriétés des colonnes de la requête. Nous en apprendrons davantage sur ResultSetMetaData dans la section suivante.
ResultSetMetaData
Qu'est-ce que les métadonnées ?
Les métadonnées sont des données sur les données. En utilisant cette interface, nous obtiendrons plus d'informations sur ResultSet. Elle est disponible dans le package java.sql. Chaque objet ResultSet est associé à un objet ResultSetMetaData.
Cet objet contient les détails des propriétés des colonnes comme le type de données de la colonne, le nom de la colonne, le nombre de colonnes, le nom de la table, le nom du schéma, etc. Nous pouvons obtenir l'objet ResultSetMetaData en utilisant la méthode getMetaData() de ResultSet.
Syntaxe du ResultSetMetaData :
PreparedStatement pstatemnt1 = conn.prepareStatement(insert_query) ; ResultSet rs1 = pstatemnt1.executeQuery("Select * from EMPLOYEE_DETAILS") ; ResultSetMetaData rsmd = rs.getMetaData() ;
Méthodes importantes de l'interface ResultSetMetaData :
Nom de la méthode | Description |
---|---|
String getColumnName(int column) | Il renvoie le nom de la colonne en question |
String getColumnTypeName(int column) | Elle renvoie le type de données de la colonne particulière que nous avons passée en paramètre. |
String getTableName(int column) | Il renvoie le nom de la table de la colonne |
String getSchemaName(int column) | Il renvoie le nom du schéma de la table de la colonne |
int getColumnCount() | Il renvoie le nombre de colonnes du ResultSet |
boolean isAutoIncrement(int Column) | Elle renvoie la valeur true si la colonne donnée est Auto Increment, sinon elle renvoie la valeur false |
boolean isCaseSensitive(int Column) | Elle renvoie un message vrai si la colonne donnée est sensible à la casse, sinon elle renvoie un message faux. |
Exemple de ResultSetMetaData
package com.STH.JDBC ; import java.sql.Connection ; import java.sql.DriverManager ; import java.sql.ResultSet ; import java.sql.ResultSetMetaData ; import java.sql.SQLException ; import java.sql.Statement ; public class ResultSetMetaData_Example { public static void main(String[] args) throws ClassNotFoundException, SQLException { // TODO Auto-generated method stub String QUERY= " select * fromemployee_details" ; Class.forName("oracle.jdbc.driver.OracleDriver") ; try(Connection conn = DriverManager.getConnection("jdbc:oracle:thin:system/pass123@localhost:1521:XE")) { Statement statemnt1 = conn.createStatement() ; ResultSet rs1 =null ; rs1 = statemnt1.executeQuery(QUERY) ; ResultSetMetaData rsmd = rs1.getMetaData() ; System.out.println(" Nous utilisons ResultSetMetaData ") ;System.out.println("No : of Columns : "+ rsmd.getColumnCount())) ; System.out.println("ColumnName of Column 1 : "+ rsmd.getColumnName(1)) ; System.out.println("Data Type of Column 2 : " + rsmd.getColumnTypeName(2)) ; System.out.println("Table Name of the Column 1 : " + rsmd.getTableName(1)) ; System.out.println("Schema Name of the Column 1 : " + rsmd.getSchemaName(1)) ; } } }.
SORTIE :
Explication :
Dans le programme ci-dessus, nous avons implémenté les méthodes getColumnCount(), getColumnName(), getColumnTypeName(), getTableName() et getSchemaName() dans l'interface ResultSetMetaData.
DatabaseMetaData
L'interface DatabaseMetaData fournit des informations sur la base de données, telles que le nom de la base de données, la version de la base de données, etc.
Méthodes importantes de l'interface DatabaseMetaData :
Nom de la méthode | Description |
---|---|
String getDriverName() | Elle renvoie le nom du pilote JDBC que nous utilisons dans notre programme Java. |
String getDriverVersion() | Il renvoie le numéro de version du pilote JDBC |
Chaîne getUserName() | Il renvoie le nom d'utilisateur de la base de données que nous utilisons. |
String getDatabaseProductName() | Il renvoie le nom de la base de données que nous utilisons. |
String getDatabaseProductVersion() | Elle renvoie le numéro de version de la base de données que nous utilisons. |
ResultSet getSchemas() | Elle renvoie les noms des schémas disponibles dans la base de données connectée. |
String getStringFunctions() | Elle renvoie la liste des fonctions de chaîne de caractères disponibles dans la base de données connectée. |
String getTimeDateFunctions() | Elle renvoie la liste des fonctions d'heure et de date disponibles dans la base de données connectée. |
Chaîne getURL() | Il renvoie l'URL de la base de données |
Booléen isReadOnly() | Elle indique si la base de données est en mode lecture seule. |
Booléen supportsBatchUpdates() | Il indique si la base de données prend en charge les mises à jour par lots |
Booléen supportsSavepoints() | Il indique si la base de données prend en charge les points de sauvegarde |
Booléen supportsStatementPooling() | Il indique si la base de données prend en charge la mise en commun des déclarations |
Boolean supportsStoredProcedures() | Il indique si la base de données prend en charge les procédures stockées |
Booléen supportsOuterJoins() | Il indique si la base de données prend en charge la jointure externe |
Nous avons énuméré ici quelques méthodes importantes de l'interface DatabaseMetaData. Vous pouvez vous référer au site officiel de l'interface DatabaseMetaData. Oracle où vous pouvez voir toutes les méthodes disponibles dans l'interface DatabaseMetaData.
DatabaseMetaData Exemple :
package com.STH.JDBC ; import java.sql.Connection ; import java.sql.DatabaseMetaData ; import java.sql.DriverManager ; import java.sql.ResultSet ; import java.sql.ResultSetMetaData ; import java.sql.SQLException ; import java.sql.Statement ; public class DatabaseMetaData_Example { public static void main(String[] args) throws ClassNotFoundException, SQLException { // TODO Bouchon de méthode autogénéréClass.forName("oracle.jdbc.driver.OracleDriver") ; Connection conn = DriverManager.getConnection("jdbc:oracle:thin:system/pass123@localhost:1521:XE") ; DatabaseMetaData dbmd = conn.getMetaData() ; System.out.println("Utilisation de DatabaseMetaData") ; System.out.println("Nom du pilote : " + dbmd.getDriverName()) ; System.out.println("Version du pilote : "+ dbmd.getDriverVersion()) ; System.out.println("Nom de l'utilisateur de la base de données") ; System.out.println("Nom de l'utilisateur de la base de données") ; System.out.println("Nom de l'utilisateur de la base de données") ; System.out.println("Nom de l'utilisateur de la base de données") ; System.out.println("Nom de l'utilisateur de la base de données").Database : " + dbmd.getUserName()) ; System.out.println("Database Product Name :" + dbmd.getDatabaseProductName()) ; System.out.println("Database Product Version :" + dbmd.getDatabaseProductVersion()) ; System.out.println("List of String Functions in the Database :" + dbmd.getStringFunctions()) ; System.out.println("List of Time & ; Date functions in the Database :" + dbmd.getTimeDateFunctions()) ;System.out.println("URL de la base de données : " + dbmd.getURL()) ; System.out.println("La base de données est en lecture seule ? " +dbmd.isReadOnly()) ; System.out.println("Supporte les mises à jour par lots ? " + dbmd.supportsBatchUpdates()) ; System.out.println("Supporte les points de sauvegarde ? " + dbmd.supportsSavepoints()) ; System.out.println("Supporte la mise en commun des déclarations ? " + dbmd.supportsStatementPooling()) ; System.out.println("Supporte les données stockées ? " + dbmd.supportsStatementPooling()) ; System.out.println("Supporte la mise en commun des données ? " + dbmd.supportsSavepoints()) ; System.out.println("Supporte la mise en commun des données ?Procedures ? " + dbmd.supportsStoredProcedures()) ; System.out.println("Support Outer Join ? "+ dbmd.supportsOuterJoins()) ; } } }
SORTIE :
Explication :
Dans le programme ci-dessus, nous avons utilisé/implémenté les méthodes getDriverName(), getDriverVersion(), getUserName(), getDatabaseProductName(), getDatabaseProductVersion(), getStringFunctions(), getTimeDateFunctions(), getURL(), isReadOnly(), supportsBatchUpdates(), supportsStatementPooling(), supportsSavepoints(), supportsStoredProcedures() et supportsOuterJoins() dans l'interface DatabaseMetaData.
Points à noter :
- L'interface JDBC ResultSet est utilisée pour stocker les données de la base de données et les utiliser dans notre programme Java.
- Nous pouvons également utiliser ResultSet pour mettre à jour les données à l'aide des méthodes updateXXX().
- L'objet ResultSet pointe le curseur avant la première ligne des données de résultat. La méthode next() permet de parcourir le ResultSet.
- Nous disposons de méthodes de navigation dans ResultSet pour nous déplacer plus loin dans l'objet ResultSet.
- ResultMetaData est utilisé pour obtenir plus d'informations sur le ResultSet comme le nom de la colonne, le nombre de colonnes, le type de données de la colonne, etc.
- DatabaseMetData est utilisé pour obtenir des informations sur la base de données à laquelle nous nous sommes connectés.
Questions fréquemment posées
Q #1) Quelle est l'utilité de ResultSet ?
Réponse : ResultSet est utilisé pour stocker et récupérer les données de la base de données. Lorsque la méthode executeQuery() est exécutée, elle renvoie un objet ResultSet. Nous pouvons utiliser cet objet ResultSet dans notre programme pour exécuter la logique.
Q #2) Comment vérifier si le ResultSet est vide ou non ?
Réponse : Il n'y a pas de méthodes prédéfinies comme length(), size() disponibles pour vérifier IsResultSet Empty. Nous pouvons utiliser la méthode next() pour itérer et si elle renvoie True, alors le ResultSet n'est pas vide, si elle renvoie False, cela signifie que le ResultSet est vide.
Q #3) Est-il possible que le ResultSet soit nul ?
Réponse : Non, la méthode executeQuery() renvoie l'objet ResultSet qui ne peut jamais être nul.
Q #4) Qu'est-ce qu'un ResultSet actualisable ?
Réponse : Un objet ResultSet actualisable est utilisé pour mettre à jour les données dans les colonnes, insérer des données dans les colonnes et supprimer des lignes. Pour qu'un ResultSet soit actualisable, il faut que le type de défilement soit sensible ou insensible et que le type CONCUR soit actualisable.
ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE.
Q #5) Comment obtenir le nom de la base de données qui a été connectée ?
Réponse : Nous pouvons utiliser la méthode getDatabaseProductName() de l'objet DatabaseMetaData.
Conclusion
Dans ce tutoriel, nous avons vu ce que sont les interfaces ResultSet, ResultSetMetaData et DatabaseMetaData et leurs méthodes importantes couramment utilisées dans les programmes JDBC. Nous avons également vu comment mettre à jour des données dans la base de données en utilisant ResultSet. ResultSetMetadata contient des informations sur ResultSet telles que le nom de la colonne, le nombre de colonnes, et ainsi de suite.
DatabaseMetaData contient des informations sur la base de données.
<;