Cours PHP PDO intégrale afin de mieux appréhender la nouvelle librairie
Marzouk une introduction à jdbc
1. Introduction à JDBC
Java Data Base Connectivity
Pr Abderrahim Marzouk
Département de Mathématiques et
Informatique
Licence BIG DATA 2019-2020
1
2. JDBC ?
Une API (Application Programming Interface)
Java permettant de connecter un programme
Java avec des bases de données relationnelles
pour exécuter des requêtes SQL.
Le paquetage java.sql regroupe les interfaces et
les classes de l'API JDBC.
https://docs.oracle.com/javase/8/docs/api/java/
sql/package-summary.html
2
3. Les classes et interfaces principales du
package java.sql
• Interfaces:
▪ Driver : renvoie une instance de Connection
▪ Connection : connexion à une BD
▪ Statement : instruction SQL
▪ PreparedStatement : instruction SQL paramétrée
▪ ResultSet : n-uplets récupérés par une instruction SQL
SELECT
• Classes:
▪ DriverManager: gère les drivers, lance les
connexions aux BD
3
4. Pilote JDBC d’un SGBDR
Le fabriquant/L’éditeur du SGBDR fournit une
implémentation de certaines interfaces de
java.sql (Driver, Connection,....) sous forme d’un
fichier .jar (Java archive) : Le pilote complet.
Chaque SGBDR utilise un pilote (driver)
particulier permettant de traduire les requêtes
JDBC dans le langage du SGBD
4
5. Le pilote d’une base de données est tout simplement
une classe Java appartenant à ce jar et qui
implémente l’interface java.sql.Driver.
Cette interface contient une méthode
principale: connect(), à laquelle il faut passer
comme paramètres l’URL de la base de données
cible.
Pour chaque SGBDR, il faut donc trouver le nom de
cette classe.
5
6. Architecture JDBC
6
• Programme Java : écrit par le programmeur
• API JDBC : fait partie de JDK
• PILOTE JDBC : donné ou vendu par le fabriquant du SGBD
Programme Java
A
P
I
J
D
B
C
P
I
L
O
T
E
J
D
B
C
SGBDR
7. Procédure de programmation avec JDBC
0 - Importation du package java.sql
1- Chargement et enregistrement du driver JDBC
2 - Connexion au SGBD
3 - Création d'une requête SQL
4 - Exécution de la requête : envoi de cette requête
et récupération des résultats
5 - Traitement des résultats
6 - Fermeture de la connexion
La plupart des méthodes lèvent l'exception java.sql.SQLException.
7
8. 1: Chargement et enregistrement du
pilote JDBC
La classe du pilote doit être chargée en mémoire :
Class.forName("nomDriver");
Cette instruction Java crée une instance pilote de type java.sql.Driver
et l’enregistre auprès du gestionnaire de pilotes JDBC de la machine
Java:
DriverManager.registerDriver(pilote);
Ex :
Class.forName("oracle.jdbc.driver.OracleDriver");
Class.forName("com.mysql.jdbc.Driver");
Class.forName("org.postgresql.Driver");
8
9. 2: Connexion au SGBD
La classe DriverManager est utilisée pour :
• enregistrer le pilote pour un type de base de données spécifique.
• établir une connexion avec la base de données via sa
méthode statique getConnection ().
Connection cnx= DriverManager.getConnection() ;
Il existe trois signatures différentes de la méthode getConnection() que
nous pouvons utiliser:
▪ static Connection getConnection(String url, String user,
String password)
▪ static Connection getConnection(String url)
▪ static Connection getConnection(String url, Properties info)
9
10. DriverManager
Le DriverManager essaie tous les drivers
enregistrés (chargés en mémoire avec
Class.forName()) jusqu'à ce qu'il trouve un driver
qui lui fournisse une connexion.
10
11. Exemple de connexion à MySQL
Façon #1
On suppose que MySQL est hébergé sur localhost et écoute sur le port
par défaut 3306.
On peut se connecter de 4 façons possibles à la base de
données testbd avec user=root et password="":
public static void main(String[] args) throws Exception {
//Le pilote JDBC MySQL fonctionne avec le fuseau horaire UTC, il faut spécifier
explicitement le serverTimezone dans la chaîne de connexion.
String url = "jdbc:mysql://localhost:3306/testbd?serverTimezone=UTC";
String username = "root";
String password = "";
Connection cnx = DriverManager.getConnection(url, username, password);
if (cnx != null) {
System.out.println("Connecté à la base testbd");
}
}
11
12. Exemple de connexion à MySQL
Façon #2
public static void main(String[] args) throws Exception {
String url =
"jdbc:mysql://localhost:3306/testbd?user=root&serverTimezone=UTC";
Connection cnx = DriverManager.getConnection(url);
if (cnx != null) {
System.out.println("Connecté à la base testbd");
}
}
12
13. Exemple de connexion à MySQL
Façon #3
public static void main(String[] args) throws Exception {
String url = "jdbc:mysql://localhost:3306/testbd";
Properties props = new Properties();
props.put("user", "root");
props.put("password", "");
props.put("serverTimezone", "UTC");
Connection cnx = DriverManager.getConnection(url, props);
if (cnx != null) {
System.out.println("Connecté à la base testbd");
}
}
13
14. Exemple de connexion à MySQL
Façon #4
// conf.properties
driver.class= com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/testbd
user=root
password=
serverTimezone=UTC
14
15. Exemple de connexion à MySQL
Façon #4 (suite)
public static void main(String[] args) throws Exception {
Properties props = new Properties();
FileInputStream fis = new FileInputStream("conf.properties");
props.load(fis);
Class.forName(props.getProperty("driver.class"));
String url = props.getProperty("url");
String user = props.getProperty("user");
String password = props.getProperty("password");
String serverTimezone = props.getProperty("serverTimezone");
Properties info = new Properties();
info.put("user", user);
info.put("password", password);
info.put("serverTimezone", serverTimezone);
Connection cnx = DriverManager.getConnection(url, info);
if (cnx!=null) {
System.out.println("Connecté à la base testbd");
}
}
15
16. Connection
• Cette interface représente une connexion à
une base de données.
• Une fois la connexion établie, nous avons
un objet Connection qui peut être utilisé pour
créer un «Statement» (état) correspondant à
une requête SQL particulière.
16
17. 3: Création d’une requête
• L’interface Statement est utilisée pour exécuter une requête SQL statique simple.
Statement st = cnx.createStatement();
• L’interface PreparedStatement est utilisée pour exécuter une requête SQL
paramétrée/préparée
PreparedStatement ps = cnx.prepareStatement(requête préparée);
Une requête préparée contient des espaces réservés (sous forme de points
d'interrogation ?) pour les valeurs dynamiques qui seront définies lors de l'exécution.
Par exemple:
SELECT * FROM ETUDIANT WHERE ville =?;
Ici, la valeur de la ville est paramétrée par un point d'interrogation et sera définie par
l'une des méthodes setType (int index, Type value ) de l'interface PreparedStatement.
Ex.
ps.setString(1, ’Casablanca’);
17
18. 4: Exécution de la requête
• ResultSet executeQuery (String sql) : exécute une instruction
SQL SELECT et retourne un objet ResultSet qui contient les
résultats renvoyés par la requête
La méthode executeQuery() de l’interface PreparedStatement ne
prend aucun argument.
• int executeUpdate (String sql) : exécute une instruction SQL
INSERT, UPDATE ou DELETE et renvoie le nombre de lignes
affectées (par exemple 1 ligne insérée, ou 2 lignes mises à jour,
ou 0 lignes modifiées).
La méthode executeUpdate() de l’interface PreparedStatement
ne prend aucun argument.
18
19. Exemple de requêtes
Statement st= cnx.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM ETUDIANT
WHERE age > 19");
OU
PreparedStatement ps= cnx.prepareStatement("SELECT * FROM
ETUDIANT WHERE age > ?");
ps.setInt(1,19);
ResultSet rs = st.executeQuery();
19
20. 5: Traitement des résultats
L'interface ResultSet permet d'accéder ligne par ligne au résultat
retourné par une requête SELECT grâce à ses méthodes :
• boolean next() : fait avancer le curseur sur la ligne suivante
▪ Retourne true si le déplacement a été fait, false s'il n'y
avait pas d'autre ligne.
▪ Traitement de chaque ligne :
while(rs.next()) {// Traitement
de chaque ligne}
• TYPE getTYPE( int numeroDeColonne );
Les colonnes sont identifiées par leur numéro (à partir de 1)
• TYPE getTYPE( String nomDeColonne );
(par exemple getString () , getInt () , getFloat () , etc.).
20
21. ResultSet
▪ Sa méthode getType() retourne le contenu de
la colonne dont l'élément est de type [Type]
qui est un type Java compatible avec le type
de la colonne, pouvant être String, int, float,
boolean ...
Ex : String getString(numeroDeColonne)
21
22. 6: Fermeture de la connexion
Fermer les connexions ouvertes permet de
libérer les ressources mobilisées.
Chaque objet possède une méthode close() :
resultset.close();
statement.close();
connection.close();
22
23. Exemple: INSERT
Soit la table ETUDIANT(id: auto_increment, nom, ville, age, email).
String sql = "INSERT INTO ETUDIANT (nom, ville, age, email) VALUES (?, ?, ?, ?)";
PreparedStatement ps = cnx.prepareStatement(sql);
ps.setString(1, "redouan");
ps.setString(2, "Casablanca");
ps.setInt(3, 21);
ps.setString(4, "a.redouan@yahoo.fr");
int lignesInserees = ps.executeUpdate();
if (lignesInserees > 0) {
System.out.println("Un nouvel etudiant est inséré! ");
}
23
24. Exemple: SELECT
String sql = "SELECT * FROM ETUDIANT";
Statement st = cnx.createStatement();
ResultSet rs = st.executeQuery(sql);
while (rs.next()){
String nom = rs.getString(2);
String ville = rs.getString(3);
String age = rs.getInt("age");
String email = rs.getString("email");
System.out.println(nom+ "-" +ville + "-" +age + "-" email);
}
24
25. Exemple: UPDATE
String sql = "UPDATE ETUDIANT SET ville=?, email=? WHERE id=?";
PreparedStatement ps = cnx.prepareStatement(sql);
ps.setString(1, "Tanger");
ps.setString(2, "a.redouan@gmail.com");
ps.setInt(3,12);
int lignesModifiees = st.executeUpdate();
if (lignesModifiees > 0) {
System.out.println("Un étudiant existant a été mis à jour!");
}
25
26. Exemple: DELETE
String sql = "DELETE FROM ETUDIANT WHERE id=?";
PreparedStatement ps= cnx.prepareStatement(sql);
ps.setString(1, 12);
int lignesSupprimees = ps.executeUpdate();
if (lignesSupprimee> 0) {
System.out.println(« Un étudiant a été supprimé!");
}
26