Académique Documents
Professionnel Documents
Culture Documents
SOMMAIRE
1 Accès aux SGBDR via JDBC ........................................................................... 2
1.1. Connexion à la base par JDBC ................................................................... 3
1.1.1 JDBC et URL........................................................................................ 3
1.1.2 Les étapes de la connexion ................................................................... 3
1.2. Accès aux données de la base ..................................................................... 4
1.2.1 Déclaration de la zone de requête ......................................................... 4
1.2.2 Exécution de la requête......................................................................... 4
1.2.3 Exploitation des résultats ...................................................................... 5
1.2.4 Optimisation et paramétrage................................................................. 6
1.3. Appel aux procédure ou fonction stockées ................................................. 7
1.3.1 Création de l’objet CallableStatement ................................................... 7
1.3.2 Gestion des paramètres des procédures ou fonctions ........................... 8
1.3.3 Exécution de l’appel ............................................................................. 8
1.3.4 Gestion des erreurs ............................................................................... 8
1.3.5 Accès au dictionnaire de données......................................................... 9
1.4. Exemples de Programmes .......................................................................... 9
1.4.1 Création d’une table .............................................................................. 9
1.4.2 Insertion de tuples ............................................................................... 10
1.4.3 Sélection de tuples ............................................................................... 11
1.5. EXERCICE ............................................................................................... 13
LANGAGE JAVA
JDBC (Java Data Base Connectivity) est une API (Application Programming
Interface) qui permet d’exécuter des ordres SQL dans un programme écrit en
langage Java. Cette API est constituée d’un ensemble de classes et d’Interfaces
qui font partie du JDK (Java Development Kit) et qui sont contenues dans le
package java.sql.
Tout programme hôte écrit en Java et accédant à une base de données peut utiliser
JDBC, qu’il soit exécuté sur :
• Un poste client, sous forme d’application ou d’applet ;
• Un serveur Web, sous forme de servlet ou d’entreprise Javabeans ;
• Le serveur de la base de données, sous forme d’entreprise Javabeans ou
procédures stockées.
- Déclaration du driver
Chaque base de données utilise un pilote (driver) qui lui est propre et qui permet
de convertir les requêtes JDBC dans le langage natif du SGBD. La déclaration du
driver doit s’effectuer au début de l’application, selon l’une des syntaxes suivantes
:
• Appel à la méthode registerDriver() du DriverManager :
DriverManager.registerDriver(new nom_de_driver())
exemple pour Oracle :
DriverManager.registerDriver(new oracle.jdbc.driver.oracleDriver())
• Appel à la méthode forName de la classe java.lang.Class
Class.forName("nom_du_driver") exemple pour
oracle :
Class i=Class.forName(‘’oracle.jdbc.driver.oracleDriver’’7) ;
des fois l’invocation explicite de la méthode newInstance() est
nécessaire : Class.forName(‘‘nom_du_driver’‘).newInstance()
- Connexion
On réalise la connexion par appel de la méthode getConnection du
DriverManager, en suivant la syntaxe :
Connection nom_connexion = DriverManager.getConnexion(URL,
nom_utilisateur, mot_de_passe) ;
Exemple : Connection expl1 = DriverManager.getConnection
(‘‘jdbc :oracle :thin :@ntserver :1521 :cfcip’‘, ‘‘assale’‘, ‘‘louis ‘‘) ;
- Déconnexion
Concerne la libération des objets utilisés pour exécuter les requêtes
essentiellement les objets ResultSet et Statement, et la fermeture de la connexion.
nom_resultset.close()
nom_statement.close() nom_connexion.close()
On utilise un objet de type Statement qui offre non seulement une zone de
description (déclaration) de la requête SQL, mais aussi des ordres d’exécution de
la requête. La déclaration consiste alors à créer l’objet de type Statement ; la
syntaxe est :
Statement nom_statement = nom_connexion.createStatement() ;
Exemple :
Statement stmt = expl1.createStatement() ;
Il faut distinguer les ordres de type SELECT des autres (CREATE, DROP,
INSERT, UPDATE, DELETE, GRANT, REVOKE, etc.).
Pour les requêtes de type SELECT, l’objet ResultSet qu’on utilise est assimilable
à un curseur. Sa méthode next() distribue une à une les lignes résultats au
programme hôte. Pour exploiter l’ensemble des résultats, il faut utiliser une
structure répétitive du type : while (nom_resultset.next()) {…}
Pour recuperer les valeurs des colonnes de chaque ligne on utilise les méthodes
getXXX(col) où
• XXX dépend du type de la colonne résultat (voir tableau)
• Col représente une colonne de la requête exécutée et est soit le nom de
la colonne soit le rang dans l’ordre SQL
Exemple
while (curs1.next( ) ) {
String numero = curs1.getString (“Matricule”); String
nom = curs1.getString (“nom”)
…
}
Pour détecter les valeurs null des colonnes on utilise la méthode wasNull( ) du
ResultSet if (
curs1.wasNull ( ) )
{…}
1.2.4 Optimisation et paramétrage
Dans un programme le même ordre SQL peut être exécuté plusieurs fois, alors
que l’utilisation des méthodes createStatement() , executeQuery() et
executeUpdate() entraîne la compilation de l’ordre SQL à chaque appel. Pour
palier cela on utilise la méthode prepareStatement() qui pré-compile l’ordre
SQL et rend les exécutions plus rapides. Il est possible de paramétrer l’ordre
SQL, on parle alors d’ordre SQL dynamique.
L’exécution d’un ordre SQL se fait alors en 2 étapes
• Création de l’objet PreparedStatement
• Exécution de l’ordre
On peut faire appel à une procédure ou fonction stockée dans la base de données
quelque soit le langage utilisé pour la décrire (PL/SQL/JAVA). Pour cela on
utilise l’objet Callablestatement sous 2 formes selon que la procédure possède ou
non des paramètres.
• Syntaxe pour appel à une procédure qui comporte des paramètres :
{ ? = call nom_procedure(?,?,…)} ou ? représente un paramètre fictif
• Syntaxe pour une procédure sans paramètre : {call nom_procedure}
Paramètre d’entrée
Au moment de l’exécution de la procédure, on remplace un paramètre fictif de
type IN ou INOUT par appel à la méthode setxxx où xxx représente le type de la
valeur à transmettre (String, int, etc.). La syntaxe est :
nom_statement.setxxx(rang, valeur) ;
Paramètre de sortie
Pour les paramètres de type OUT ou INOUT, il faut déclarer le type de chacun
d’eux avant l’exécution de l’appel. Cela se fait par appel à la méthode
registerOutParameter(rang, type). Le premier argument est la position du
paramètre dans la liste des paramètres de la procédure. Le second indique le type
du paramètre par référence à un élément de la classe java.sql.Types. La syntaxe
est :
nom_statement.registerOutParameter(rang, type) ;
Après exécution, il faut transférer les paramètres de type OUT ou INOUT à des
variables Java en utilisant la méthode getxxx().
Exemple :
stmc.registerOutParameter(1, Types.VARCHAR) ;
stmc.registerOutParameter(2, Types.VARCHAR) ;
stmc.setString(3, ‘‘12A’‘) ; stmc.execute() ; String
nom = stmc.getString(1) ; String prenom =
stmc.getString(2) ;
Pour utiliser l’API JDBC, il faut inclure le paquetage java.sql par import
java.sql.*. Comme pour toutes les entrées en Java, des exceptions sont générées
en cas d’erreur. Tous les ordres SQL doivent capter l’exception SQLException.
Exemple
DatabaseMetaData dbmd = nomconnexion.getMetaData() ;
System.Out.println(‘‘\nConnecté à ‘‘ + dbmd.getURL()) ;
String utilisateurs = dbmd.getUserName() ;
import java.io.* ;
import java.sql.* ;
import java.io.* ;
import java.sql.* ;
import java.io.* ;
import java.sql.* ;
{
System.err.println(″SQLException: ″+ ex.getMessage());
}
}
}
1.5. EXERCICE
Fiche de TD exercice 14