Cours Java JDBC
Cours Java JDBC
Cours Java JDBC
Achref El Mouelhi
elmouelhi.achref@gmail.com
1 Introduction
2 Utilisation
3 Transactions
4 Restructuration du code
Classes connexion et dao
DataSource et fichier de propriétés
JDBC
L MO
h r e fE
A c
c
JDBC
L MO
h r e fE
c
JDBC ?
c A
Une API (interface d’application) créée par Sun Microsystems
Il permet d’accéder aux bases de données en utilisant un driver
JDBC
JDBC
I c
JDBC 8.0.13
EL H
U
MO
Aller sur
L
https://dev.mysql.com/downloads/file/?id=480292
f E l’archive .zip
Télécharger et Dh
c r e
écompresser
c
A
JDBC
JDBC
Ajouter JDBC au path du projet
I c
ELH
U
L MO
f E
chre
c A
JDBC
Ajouter JDBC au path du projet
I c
Ou aussi
ELH
U
MO
Faire clic droit sur le projet dans Package Explorer et aller dans Properties
L
Properties
f E
hre
Dans Java Build Path, aller dans l’onglet Libraries
c
c A
Cliquer sur Add JARs
Appliquer
JDBC
Ajouter JDBC au path du projet
I c
Ou aussi
ELH
U
MO
Faire clic droit sur le projet dans Package Explorer et aller dans Properties
L
Properties
f E
hre
Dans Java Build Path, aller dans l’onglet Libraries
c
c A
Cliquer sur Add JARs
Appliquer
JDBC
Avant de commencer, voici le script SQL qui permet de créer la base de
données utilisée dans ce cours
USE jdbc;
I c
E LH
CREATE TABLE personne(
num INT PRIMARY KEY AUTO_INCREMENT, OU
L M
nom VARCHAR(30),
prenom VARCHAR(30)
ref E
);
c h
c A
SHOW TABLES;
JDBC
Trois étapes I c
H
L cas)
Enotre
Charger le driver JDBC (pour MySQL dansU
la L
Établir la connexion avec E
MO
base de données
c h ref
c A
Créer et exécuter des requêtes SQL
JDBC
I c
EL H
Avant de commencer
O U
Tous les imports de ce chapitre sontM
fE L de java.sql.*;
c h r e
c
A
JDBC
Chargement du driver 5
try {
Class.forName("com.mysql.jdbc.Driver");
}
catch (ClassNotFoundException e) { I c
System.out.println(e.getMessage());
ELH
U
}
L MO
r8e f E
c h
Chargement du driver
try {
c A
Class.forName("com.mysql.cj.jdbc.Driver");
}
catch (ClassNotFoundException e) {
System.out.println(e.getMessage());
}
H & H: Research and Training 10 / 41
Utilisation
JDBC
JDBC
Connexion à la base
JDBC
I c
En cas de problème avec le chargement du driver, modifier l’URL
de connexion ainsi :
ELH
U
String url =
L MO
f E
"jdbc:mysql://localhost:3306/jdbc?useSSL=false&
serverTimezone=UTC";
chre
c A
JDBC
Préparation et exécution de la requête
// création de la requête (statement)
Statement statement = connexion.createStatement();
// Préparation de la requête
I c
EL H
String request = "SELECT * FROM Personne;";
O U
// Exécution de la requête M
ResultSet result = e fE L
c h r statement.executeQuery(request);
c A
JDBC
Préparation et exécution de la requête
// création de la requête (statement)
Statement statement = connexion.createStatement();
// Préparation de la requête
I c
EL H
String request = "SELECT * FROM Personne;";
O U
// Exécution de la requête M
ResultSet result = e fE L
c h r statement.executeQuery(request);
c
A
On utilise
executeQuery() pour les requêtes de lecture : select.
executeUpdate() pour les requêtes d’écriture : insert,
update, delete et create.
H & H: Research and Training 14 / 41
Utilisation
JDBC
JDBC
c
pour tous les autres attributs
// pareil
System.out.println(nom + " " + prenom);
}
JDBC
JDBC
JDBC
Pour récupérer la valeur de la clé primaire auto-générée
Statement statement = connexion.createStatement();
String request = "INSERT INTO Personne (nom,prenom) VALUES (’
Wick’,’John’);";
I c
primaire
ELH
// on demande le renvoi des valeurs attribuées à la clé
U
MO
statement.executeUpdate(request,Statement.RETURN_GENERATED_KEYS
);
f E L
h re attribuées à l’ensemble de tuples
// on parcourt les valeurs
c
c A = statement.getGeneratedKeys();
ajoutés
ResultSet
resultat
JDBC
Pour éviter les injections SQL, il faut utiliser les requêtes préparées
(pour la consultation, l’ajout, la suppression et la modification)
String request = "INSERT INTO Personne (nom,prenom)
VALUES (?,?);";
I c
PreparedStatement ps = connexion.prepareStatement(
ELH
U
request,PreparedStatement.RETURN_GENERATED_KEYS);
ps.setString(1, "Wick");
L MO
ps.setString(2, "John");
f E
ps.executeUpdate();
chre
c A
ResultSet resultat = ps.getGeneratedKeys();
if (resultat.next())
System.out.println("Le numéro généré pour cette
personne : " + resultat.getInt(1));
JDBC
Pour éviter les injections SQL, il faut utiliser les requêtes préparées
(pour la consultation, l’ajout, la suppression et la modification)
String request = "INSERT INTO Personne (nom,prenom)
VALUES (?,?);";
I c
PreparedStatement ps = connexion.prepareStatement(
ELH
request,PreparedStatement.RETURN_GENERATED_KEYS);
U
ps.setString(1, "Wick");
L MO
ps.setString(2, "John");
f E
ps.executeUpdate();
chre
c A
ResultSet resultat = ps.getGeneratedKeys();
if (resultat.next())
System.out.println("Le numéro généré pour cette
personne : " + resultat.getInt(1));
JDBC
Les transactions
I c
ensemble de requête SQL
EL H
U
MOles requête SQL) soit rien
appliquant le principe soit tout (toutes
L
e
activées par défautravec
E
f MySQL
A h
c ées et gérées par le développeur
pouvant
c être désactiv
JDBC
I c
ELH
U
Pour valider une transaction
L MO
f E
hre
connection.commit(false);
c
c A
Pour annuler une transaction
connection.rollback(false);
JDBC
Exemple avec les transactions
// désactiver l’auto-commit
connexion.setAutoCommit(false);
JDBC
Organisation du code
La classe MyConnection
package org.eclipse.config;
public class MyConnection {
private static String url = "jdbc:mysql://localhost:3306/jdbc?useSSL=
false&serverTimezone=UTC";
private static String utilisateur = "root";
private static String motDePasse = "";
private static Connection connexion = null;
I c
private MyConnection() {
try {
ELH
U
MO
Class.forName("com.mysql.cj.jdbc.Driver");
motDePasse );
f E L
connexion = DriverManager.getConnection( url, utilisateur,
hre
} catch ( Exception e ) {
c
c A
e.printStackTrace();
}
}
public static Connection getConnection() {
if (connexion == null) {
new MyConnection();
}
return connexion;
}
JDBC
JDBC
La classe Personne
package org.eclipse.model;
JDBC
L’interface PersonneDao
package org.eclipse.dao;
import java.util.List;
I c
EL H
U
MO
import org.eclipse.model.Personne;
fE L
h r e
public interface PersonneDao {
c save(Personne personne);
void
A
Personne
c remove(Personne personne);
Personne update(Personne personne);
Personne findById(int id);
List<Personne> getAll();
}
ps.setString(1, personne.getNom());
U
ps.setString(2, personne.getPrenom());
L MO
ps.executeUpdate();
f E
hre
ResultSet resultat = ps.getGeneratedKeys();
if (resultat.next()) {
c
c A
personne.setNum(resultat.getInt(1));
}
return personne;
} catch (SQLException e) {
e.printStackTrace();
}
}
return null;
}
c
personne (nom,prenom) values (?,?); ", PreparedStatement.
I
RETURN_GENERATED_KEYS);
ps.setString(1, personne.getNom());
ELH
ps.setString(2, personne.getPrenom());
U
ps.executeUpdate();
L MO
E
ResultSet resultat = ps.getGeneratedKeys();
f
hre
if (resultat.next()) {
c.commit();
c
c A
personne.setNum(resultat.getInt(1));
}
return personne;
} catch (SQLException e) {
e.printStackTrace();
}
}
return null;
}
JDBC
La classe PersonneDaoImpl (suite)
@Override
public Personne findById(int id) {
Personne personne = null;
Connection c = MyConnection.getConnection();
if (c != null) {
I c
try {
ELH
PreparedStatement ps = c.prepareStatement("select * from
U
MO
personne where num = ?; ");
ps.setInt(1, id);
E L
ResultSet r =ps.executeQuery();
f
hre
if (r.next())
c
personne = new Personne(r.getInt("num"),r.getString("nom"),r.
c A
getString("prenom"));
} catch (SQLException e) {
e.printStackTrace();
}
}
return personne;
}
}
import org.eclipse.dao.PersonneDaoImpl;
import org.eclipse.model.Personne;
ref = personneDaoImpl.save(personne);
Personne
A c h
Personne insertedPersonne
c
if (insertedPersonne != null)
System.out.println("personne numéro " + insertedPersonne.
getNum() + " a été insérée");
else
System.out.println("problème d’insertion");
}
}
JDBC
I
c
Remarque EL H
U
Oautres méthodes de
M
N’oublions pas d’implémenter les quatre
L
l’interface Dao
h r e fE
A c
c
JDBC
JDBC
L’interface Dao
package org.eclipse.dao;
I c
import java.util.List;
ELH
public interface Dao <T> { MO
U
f E L
c h re obj);
T save(T obj);
void remove(T
A obj);
Tcupdate(T
T findById(int id);
List<T> getAll();
}
JDBC
La classe PersonneDaoImpl
I c
package org.eclipse.dao;
EL H
U
MO Dao<Personne>{
public class PersonneDaoImpl implements
L
...
h r e fE
A c
c
pour le reste
Rien ne change
JDBC
JDBC
JDBC
I
c
Remarque H
EpasL le driver
Dans MyDataSourceFactory, on ne pr O U
écise
com.mysql.jdbc.Driver car Lon M
f Elui même le driver.
utilise un objet de la classe
c h e
MysqlDataSource quircharge
c
A
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
c
} catch (SQLException e) {
c A
e.printStackTrace();
}
}
public static Connection getConnection() {
if (connexion == null) {
new MyConnection();
}
return connexion;
}
import org.eclipse.dao.PersonneDaoImpl;
import org.eclipse.model.Personne;
ref = personneDaoImpl.save(personne);
Personne
A c h
Personne insertedPersonne
c
if (insertedPersonne != null)
System.out.println("personne numéro " + insertedPersonne.
getNum() + " a été insérée");
else
System.out.println("problème d’insertion");
}
}