2. Plan
- Définition de JDBC
- Objectifs de JDBC
- Interface java.sql
- Les étapes d’accès à une BD via JDBC
- Gestionnaire de pilote (DriverManager)
- Interface Connection
- Interface Statement
- ResultSet
- Interface PreparedStatement
- Fichier properties en Java
06/03/2024 2
3. 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.
06/03/2024 3
4. Objectifs de JDBC
• Permettre aux programmeurs Java d’écrire un
code indépendant de la base de données et du
moyen de connexion utilisé;
• API JDBC (Java DataBase Connectivity) :
– interface uniforme permettant un accès homogène
aux SGBD;
– simple à mettre en œuvre;
– indépendant du SGBD support;
– supportant les fonctionnalités de base du langage
SQL;
06/03/2024 4
5. Architecture: un modèle à deux
niveaux
• Premier niveau: API JDBC
– c’est la couche visible et utile pour développer des
applications Java accédant à des SGBD;
– représentée par le package java.sql;
• Les niveaux inférieurs
– destinés à faciliter l’implantation de drivers pour des
bases de données;
– représentent une interface entre les accès de bas
niveau au moteur du SGBD et l’application;
06/03/2024 5
6. Architecture: un modèle à deux
niveaux
06/03/2024 6
Application Java
JDBC
Oracle MySQL SQL Server ….
8. 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.
06/03/2024 8
9. Les étapes d’accès à une BD via JDBC
Toutes les classes et interfaces de JDBC nécessaires pour établir une connection à 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 ResultSet, chacune correspondant à une étape de
l'accès aux données :
06/03/2024 9
Interface / Classe Role
DriverManager charge et configure le driver de la base de données.
Connection
réalise la connection et l'authentification à la base de
données.
Statement
contient la requête SQL et la transmet à la base de
données.
ResultSet
permet de parcourir les informations retournées par la
base de données dans le cas d'une sélection de
données
10. 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, …
06/03/2024 10
11. 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.
06/03/2024 11
12. 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
06/03/2024 12
13. Statement
Une fois la connection é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 :
06/03/2024 13
14. 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) ...
06/03/2024 14
15. Statement
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.
06/03/2024 15
16. ResultSet
C'est une classe qui 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 :
06/03/2024 16
Méthode Role
getInt(int)
retourne le contenu de la colonne dont le numéro est passé en paramètre sous forme
d'entier.
getInt(String)
retourne le contenu de la colonne dont le nom est passé en paramètre sous forme
Chaîne de caractère.
getFloat(int)
retourne le contenu de la colonne dont le numéro est passé en paramètre sous forme de
nombre flottant.
getFloat(String)
getDate(int)
retourne le contenu de la colonne dont le numéro est passé en paramètre sous forme de
date.
getDate(String)
next() se déplace sur le prochain enregistrement : retourne false si la fin est atteinte
Close() ferme le ResultSet
getMetaData() retourne un objet ResultSetMetaData associé au ResultSet.
17. 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)
06/03/2024 17
18. 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.
06/03/2024 18
19. 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
06/03/2024 19
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 isAutoIncrement(int) retourne true si la colonne est auto incrémentée
int getColumnType(int) retourne le type de données SQL de la colonne
24. PreparedStatement
L'interface PreparedStatement étend Statement et représente une
instruction paramétrée. Cette interface diffère de Statement sur deux
points principaux :
• Les instances de PreparedStatement contiennent une instruction SQL dèjà
compilée. D'où le terme prepared. Cela améliore notamment les
performances si cette instruction doit être appelée de nombreuses fois.
• Les instructions SQL des instances de PreparedStatement contiennent un
ou plusieurs paramètres d'entrée, non spécifiés lors de la création de
l'instruction. Ces paramètres sont représentés par des points
d'interrogation(?). Ces paramètres doivent être spécifiés avant l'exécution.
L'exécution des PreparedStatement est identique à celle des simples
Statement, à la différence près qu'il n'y a pas d'argument aux méthodes
executeXXX.
06/03/2024 24
25. PreparedStatement
L'instantiation de PreparedStatement se fait à partir de
la classe Connection, grâce aux méthodes
prepareStatement.
Voici quel ques exemples :
Connection connection = ...;
PreparedStatement prep1 = connection.prepareStatement("SELECT * FROM Annuaire WHERE nom = ?");
//requête paramétrée pour rechercher un nom dans un Annuaire
PreparedStatement prep2 = connection.prepareStatement("UPDATE Annuaire SET noTel = ? WHERE nom = ?");
//requête paramétrée pouvant servir à mettre à jour le numéro de tél. d'un abonné donné
PreparedStatement prep3 = connection.prepareStatement("SELECT Attribut1, Attribut2 FROM MaTable");
// il peut ne pas y avoir de paramètres : sélection de deux attributs de la table MaTable
06/03/2024 25
26. PreparedStatement
Le passage des paramètres d'entrée des PreparedStatement se fait
grâce à l'ensemble des méthodes setXXX. Il est important de
connaître les correspondances entre le types SQL et les types java
String sql = "UPDATE Stocks SET prix = ?, quantite = ? WHERE nom =?";
//préparation de la requête
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//on assigne un décimal au premier paramètre
preparedStatement.setBigDecimal(1,15.6);
//on assigne un entier au second paramètre
preparedStatement.setIntl(2,256);
//on assigne une chaîne de caractères au troisième
preparedStatement.setStringl(3,"café");
//exécution de la requête
preparedStatement.executeUpdate();
06/03/2024 26
27. PreparedStatement
• La méthode setObject permet de passer n'importe quel type d'argument. Cette méthode, en plus
de l'index du paramètre et de la valeur de celui-ci, peut prendre en argument un entier
définissant le type SQL.
String sql = "INSERT INTO Annuaire (nom, prenom, tel) VALUES(?,?,?)";
PreparedStatement statement = connection.prepareStatement(sql);
//en spécifiant bien les types SQL cibles
statement.setObject(1,"toto", Types.VARCHAR);
statement.setObject(2,"titi",Types.VARCHAR);
statement.setObject(3,new Integer(123),Types.INTEGER);
statement.executeUpdate();
//on peut ne pas spécifier le type sql
statement.setObject(1,"bobo");
statement.setObject(2,"bibi");
statement.setObject(3,new Integer(456));
statement.executeUpdate();
//certains types seront automatiquement convertis, d'autres non
statement.setObject(1,"nono");
statement.setObject(2,"nini");
statement.setObject(3,"789",Types.INTEGER);
statement.executeUpdate();
06/03/2024 27
28. PreparedStatement
Remarque :
Pour vider un paramètre on peut utiliser la
méthode setXXX correspondante, cela a pour
effet d'écraser la valeur passée
précédemment. Pour vider tous les
paramètres, vous pouvez utiliser la
méthode clearParameters().
06/03/2024 28
29. Fichier properties en Java
Un fichier properties est un fichier nommé xxxx.properties, de format texte tout
simple, et contenant des listes de type
# un commentaire
nom=valeur
Toutes les valeurs sont de type String.
• Exemple :
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost/compatrol
jdbc.username=root
jdbc.password=root
06/03/2024 29
30. Fichier properties en Java
Lire un fichier de propriétés en Java :
• FileInputStream f = new FileInputStream ("base.properties");
• Properties p = new Properties();
• p.load(f);
• p.getProperty("jdbc.url");
• p.getProperty("jdbc.username");
• p.getProperty("jdbc.password")
06/03/2024 30