Vous êtes sur la page 1sur 22

Chapitre 9 : JDBC

A. Nejeoui
Introduction
Toutes les applications java traitent les données d’une manière ou d’une
autre, Vous avez utilisez jusqu’à présent des types primitifs, des objets
et des tableaux. Dans ce chapitre on va explorer une autre façon de
manipuler les donner à savoir comment faire communiquer les
applications Java et les bases de données relationnelles via JDBC.

Dans ce chapitre on va couvrir les point suivant :


- Définir JDBC
- Définir le gestionnaire de pilote (DriverManager)
- Étudier l’interface Connection
- Comment accéder à une base de données via le pont JDBC-ODBC
- Comment accéder à une base de données via un Driver JDBC
- Étudier l’interface Statement (responsable des différentes opérations
CRUDE)

15.02.24 JDBC
JDBC
JDBC est l'acronyme de Java DataBase Connectivity et désigne une API
définie par Sun pour permettre un accès aux bases de données avec
Java.

Les classes de JDBC version 1.0 sont regroupées dans le package java.sql et
sont incluses dans le JDK à partir de sa version 1.1. La version 2.0 de
cette API est incluse dans la version 1.2 du JDK.

Pour pouvoir utiliser JDBC, il faut un pilote qui est spécifique à la base de
données à laquelle on veut accéder. Avec le JDK, Sun fournit un pilote
qui permet l'accès aux bases de données via ODBC.

15.02.24 JDBC
Le pont JDBC-ODBC
ODBC était à l'origine une couche logicielle sous WINDOWS permettant
d'accéder à différentes sources de données. Cette couche a été
implémentée également pour fonctionner sous Linux, et le logiciel en
question s'appelle unixODBC.

Pour utiliser ODBC pour accéder à un serveur de base de données il faut


tout d’abord configurer l’administrateur de source de données ODBC de
votre environnement , il faut dans un premier temps intégrer la base
dans l'administrateur de source de données ODBC (Panneau de
configuration / source de données ODBC).
Les étapes de création de la source ODBC sont :

la sélection du pilote pour la base de données concernée (dans notre cas le


pilote Microsoft Access Driver)

la définition du nom de la base et de son chemin d'accès

la définition du nom de la source de données et du mot de passe

15.02.24 JDBC
15.02.24 JDBC
Les étapes d’accès à une BD via JDBC
Pour accéder à une base de données via JDBC, vous avez cinq étapes à suivre:
Première étape :
Préciser le type de driver que l'on veut utiliser, le Driver permet de gérer
l'accès à un type particulier de SGBD
Deuxième étape :
Récupérer un objet « Connection » en s'identifiant auprès du SGBD et en
précisant la base utilisée.
Troisième étape :
A partir de la connexion, créer un « statement » (Instruction SQL)
correspondant à une requête particulière.
Quatrième étape :
Exécuter ce statement au niveau du SGBD et traiter le type de retour.
Dernière étape
Se déconnecter de la base en fermant la connexion

15.02.24 JDBC
Les étapes d’accès à une BD via JDBC
Toutes les classes et interfaces de JDBC nécessaires pour établir une
connexion à la base de données sont dans le package java.sql. Il faut donc
l'importer dans tous les programmes devant utiliser JDBC. Il y a 4 classes
importantes : DriverManager, Connection, Statement ( et
PreparedStatement ), et ResultSet, chacune correspondant à une étape de
l'accès aux données :
Interface / Classe Role

charge et configure le driver de la base de


DriverManager
données.
réalise la connexion et l'authentification à la
Connection
base de données.
Statement ( et
contient la requête SQL et la transmet à la base
PreparedStatement
de données.
)
permet de parcourir les informations retournées
ResultSet par la base de données dans le cas d'une
sélection de données

15.02.24 JDBC
DriverManager
Les applications java utilisant le JDBC sont indépendantes du SGBDR
utilisé et du Système d’exploitation, seul le driver utilisé est
spécifique. Cette indépendance est assuré par le « gestionnaire de
pilotes » DriverManager.
Chaque SGBDR fournit le driver adéquat, les drivers ne sont pas fournis
avec JDBC.
– Une même application, si elle accepte en paramètre le nom du driver et
la localisation de la base, peut interroger une même base de données
(de même structure) supportée par des SGBDs différents : mySQL,
Access, PostgreSQL , Oracle, Dbase, …
Pour se connecter à une base de données via ODBC, il faut tout d'abord
charger le pilote JDBC-ODBC qui fait le lien entre les deux comme suit :
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

15.02.24 JDBC
DriverManager
Pour se connecter à une base en utilisant un driver spécifique, la
documentation du driver fournit le nom de la classe à utiliser. Par
exemple, si le nom de la classe est jdbc.DriverXXX, le chargement du
driver se fera avec le code suivant :
Class.forName("jdbc.DriverXXX");
Class.forName("com.mysql.jdbc.Driver"); // pour MySQL
Class.forName("postgresql.Driver");
Il n'est pas nécessaire de créer une instance de cette classe et de
l'enregistrer avec le DriverManager car l'appel à Class.forName le fait
automatiquement : ce traitement charge le pilote et créer une instance
de cette classe.
La méthode static forName() de la classe Class peut lever l'exception
java.lang.ClassNotFoundException.

15.02.24 JDBC
Connection
Pour se connecter à une base de données, il faut instancier un objet d’une
classe qui implémente l’interface Connection en lui précisant sous forme
d'URL la base à accéder. la classe DriverManager offre la méthode :

static Connection getConnection( String url, String user, String password)

Qui crée une connexion permettant d'utiliser une base de données.

url : identification de la base considérée sur le SGBD, le format de l'URL


est dépendant du SGGB utilisé

user : nom de l'utilisateur qui se connecte à la base

password : mot de passe de l'utilisateur

15.02.24 JDBC
Statement
Une fois la connexion établie, il est possible d'exécuter des ordres SQL.
Les requêtes d'interrogation SQL sont exécutées avec les méthodes
d'un objet Statement que l'on obtient à partir d'un objet Connection
via la méthode createStatement().

Pour une requête de type interrogation (SELECT), la méthode à utiliser de


la classe Statement est executeQuery. Pour des traitements de mise à
jour, il faut utiliser la méthode executeUpdate(). Lors de l'appel à la
méthode d'exécution, il est nécessaire de lui fournir en paramètre la
requête SQL sous forme de chaîne de caractères.

Le résultat d'une requête d'interrogation executeQuery est renvoyé dans


un objet de la classe ResultSet par la méthode executeQuery().

Exemple :

15.02.24 JDBC
Statement
1) ...
2) //insertion d'un enregistrement dans la table client
3) String requete = "INSERT INTO client VALUES (3,'client 3','prenom 3')";
4) try {
5) Statement stmt = con.createStatement();
6) int nbMaj = stmt.executeUpdate(requete);
7) affiche("nb mise a jour = "+nbMaj);
8) } catch (SQLException e) {
9) e.printStackTrace();
10) }
11) ...

15.02.24 JDBC
Statement
Lorsque la méthode executeUpdate() est utilisée pour exécuter un
traitement de type DDL ( Data Defiition Langage : définition de
données ) comme la création d'un table, elle retourne 0. Si la méthode
retourne 0, cela peut signifier deux choses : le traitement de mise à
jour n'a affecté aucun enregistrement ou le traitement concernait un
traitement de type DDL.

Remarque :

Si l'on utilise executeQuery() pour exécuter une requête SQL ne


contenant pas d'ordre SELECT, alors une exception de type
SQLException est levée.

15.02.24 JDBC
ResultSet
Cette interface représente une abstraction d'une table qui se compose de
plusieurs enregistrements constitués de colonnes qui contiennent les
données. Les principales méthodes pour obtenir des données sont :
Méthode Role
retourne le contenu de la colonne dont le numéro est
getInt(int)
passé en paramètre sous forme d'entier.
retourne le contenu de la colonne dont le nom est passé
getInt(String)
en paramètre sous forme Chaîne de caractère.
retourne le contenu de la colonne dont le numéro est
getFloat(int)
passé en paramètre sous forme de nombre flottant.
getFloat(String)
retourne le contenu de la colonne dont le numéro est
getDate(int)
passé en paramètre sous forme de date.
getDate(String)
se déplace sur le prochain enregistrement : retourne
next()
false si la fin est atteinte
Close() ferme le ResultSet
retourne un objet ResultSetMetaData associé au
getMetaData()
ResultSet.

15.02.24 JDBC
ResultSet
La méthode next() déplace le curseur sur le prochain enregistrement. Le
curseur pointe initialement juste avant le premier enregistrement : il
est nécessaire de faire un premier appel à la méthode next() pour ce
placer sur le premier enregistrement.

Des appels successifs à next permettent de parcourir l'ensemble des


enregistrements.

Elle retourne false lorsqu'il n'y a plus d'enregistrement. Il faut toujours


protéger le parcours d'une table dans un bloc de capture d'exception
(try catch)

15.02.24 JDBC
ResultSet
Les méthodes getXXX() permettent d'extraire les données selon leur type
spécifiée par XXX tel que getString(), getDouble(), getInteger(),
etc ... . Il existe deux formes de ces méthodes : indiquer le numéro la
colonne en paramètre (en commençant par 1) ou indiquer le nom de la
colonne en paramètre. La première méthode est plus efficace mais peut
générer plus d'erreurs à l'éxecution notamment si la structure de la
table évolue.

La méthode getString() permet d'obtenir la valeur d'un champ de


n'importe quel type.

Attention : il est important de noter que ce numéro de colonne fourni en


paramètre fait référence au numéro de colonne de l'objet resultSet
( celui correspondant dans l'ordre SELECT )et non au numéro de colonne
de la table.

15.02.24 JDBC
ResultSetMetaData
La méthode getMetaData() d'un objet ResultSet retourne un objet de
typeResultSetMetaData. Cet objet permet de connaître le nombre, le nom et le
types des colonnes

Méthode Role

int getColumnCount() retourne le nombre de colonnes du ResultSet

String getColumnName(int) retourne le nom de la colonne dont le numéro est donné

String getColumnLabel(int) retourne le libellé de la colonne donnée

boolean isCurrency(int) retourne true si la colonne contient un nombre au format monétaire

boolean isReadOnly(int) retourne true si la colonne est en lecture seule

boolean
retourne true si la colonne est auto incrémentée
isAutoIncrement(int)

int getColumnType(int) retourne le type de données SQL de la colonne

15.02.24 JDBC
Exemple : ODBC-JDBC

15.02.24 JDBC
Exemple : JDBC

15.02.24 JDBC
Exemple : ExecuteUpdate

15.02.24 JDBC
Exemple : ExecuteQuery

15.02.24 JDBC
Conclusion

15.02.24 JDBC

Vous aimerez peut-être aussi