Académique Documents
Professionnel Documents
Culture Documents
Spring Boot
Manal Mounir
manal.mounir@etu.uae.ac.ma
1
2
Introduction à JDBC
▪ JDBC pour Java DataBase Connectivity
▪ API Java adaptée à la connexion avec les bases de données Relationnelles et
Objet-Relationnelles
▪ L ’API Fournit un ensemble de classes et d’interfaces permettant l’utilisation
d’un ou plusieurs SGBD à partir d’un programme
JDBC
Database
Architecture de JDBC
ResultSet ResultSet ResultSet
Connection
Oracle Sybase
SQL
Access
Server
Modèles de connexion en Java
Architecture 2-tiers Architecture 3-tiers
Communication
directe avec le SGBD
Class.forName("com.mysql.jdbc.Driver");
Class.forName("oracle.jdbc.driver.OracleDriver");
URL de connexion :
• qui spécifie :
• jdbc : l ’utilisation de JDBC
• <sous-protocole> : le driver ou le type de SGBD
• l ’identification de la base locale ou distante
• avec des paramètres de configuration éventuels
• nom utilisateur, mot de passe, ...
• Exemples :
String url = "jdbc:mysql://localhost:3306/dbeleve";
Connexion à la base
Établissement de la
Chargement des Drivers Appel à getConnection Essai des Pilotes
Connexion
Gestionnaire de pilotes
Enregistrement dans le Recherche du pilote capable de se
DriverManager connecter à la base de données essaie tous les pilotes Utilisation du pilote trouvé
enregistrés jusqu'à ce qu'il pour établir la connexion à
en trouve un qui peut gérer la base de données
la connexion
Connexion Résultante
La connexion est renvoyée
pour être utilisée dans le
programme
Création d ’un Statement
• L ’objet Statement possède les méthodes nécessaires pour réaliser les requêtes sur
la base associée à la connexion dont il dépend
• 3 types de Statement :
Statement st = connexion.createStatement();
ResultSet rs = st.executeQuery("SELECT nom, prenom FROM clients WHERE nom='itey' ORDER BY nom");
• executeUpdate() : pour les requêtes (INSERT, UPDATE, DELETE, CREATE TABLE, DROP TABLE) qui
retournent un entier (nombre de tuples traités)
Statement st = connexion.createStatement();
int nb = st.executeUpdate("INSERT INTO dept(DEPT) VALUES(06)");
• execute() : pour requêtes inconnus. Renvoie true si la requête a donné lieu à la creation d ’un objet ResultSet
Statement st = connexion.createStatement();
boolean result = st.execute("SELECT nom, prenom FROM clients WHERE nom='itey' ORDER BY nom");
if (result) {
ResultSet rs = st.getResultSet();
// Traitement des résultats s'il y en a
} else {
int nb = st.getUpdateCount();
// Traitement du nombre de lignes affectées dans le cas d'une requête de mise à jour
}
Exécution d ’une requête
Code Java
• Le code SQL n ’est pas interprété par Java.
• C ’est le pilote associé à la connexion (et au JDBC
final par le moteur de la base de données) qui
interprète la requête SQL
• Si une requête ne peut s ’exécuter ou qu’une
erreur de syntaxe SQL a été détectée, Pilote JDBC (MySQL, Oracle, etc.)
l ’exception SQLException est levée
Interprétation et Exécution de la
Requête SQL
En cas d’erreur
Gestion d'Exceptions
(SQLException)
Exécution d ’une requête
Pilote JDBC
• Le driver JDBC effectue d ’abord un accès à la Premier Accès à la Base pour
base pour découvrir les types des colonnes Découvrir les Types de Données
impliquées dans la requête puis un 2ème Colonnes
pour l ’exécuter..
executeQuery()
ResultSet
Structure
Utilité
Permet l'accès et la
manipulation des données
extraites
Exécution d ’une requête
public class ExempleJDBC {
} catch (Exception e) {
e.printStackTrace();
}
}
}
Types de données JDBC
SGBD
Requête SQL
Résultats sous forme de types
SELECT * FROM table spécifiques
(CHAR, DECIMAL INTEGER DATE …
Programme Java
En Java
Méthodes retournant un objet
Base de données getString(),
getObject(), null
NULL getDate()
Méthodes numériques
getByte()
getInt()
0
getDouble()
getBoolean() false
Fermer les différents espaces
try {
// Utilisation de ResultSet, Statement, et Connection
// ...
} catch (SQLException e) {
// Gestion des exceptions, si nécessaire
e.printStackTrace();
} finally {
// Fermeture propre des objets JDBC
try { Pour terminer proprement
if (resultSet != null) { un traitement, il faut
resultSet.close(); fermer les différents
} espaces ouverts. sinon le
if (statement != null) { garbage collector s ’en
statement.close();
occupera mais moins
}
if (connection != null) { efficace
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
Fermer les différents espaces
Requête SQL en concaténant des chaînes de caractères avec des données d'entrée utilisateur
code SQL
Requête SQL utilisant PreparedStatement
valeur
PreparedStatement : Optimisation des Performances
public class ExempleOptimisationPerformances {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/ma_base_de_donnees";
String utilisateur = "utilisateur";
String motDePasse = "mot_de_passe";
try (Connection connection = DriverManager.getConnection(url, utilisateur, motDePasse)) {
// Requête SQL paramétrée
String sql = "SELECT * FROM employes WHERE poste = ?";
try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
// Exécution répétée de la même requête avec des paramètres différents
Transaction 1
Instruction 1
Transaction 2 Commit 2
Instruction 2
...
Transaction n
Instruction n
Validation de transaction : Commit
Par défaut, JDBC est configuré en mode auto-commit
Transaction 1
Débiter le montant du
compte source
Transaction 2 Commit 2
Créditer le montant sur le
compte de destination
Base de données
l'opération de crédit échoue incohérente
public class ExempleModeAutoCommit {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/ma_base_de_donnees";
String utilisateur = "utilisateur";
String motDePasse = "mot_de_passe";
Transaction
Débiter le montant du
Etat Exécution Exécution
compte source Operation 1 commit
initial Operation 2
Créditer le montant sur le
compte de destination
Rollback
Base de données
cohérente
try {
// Opération 1: Débit du compte source
debitCompte(connection, "compte_source", 100.00);
// Validation de la transaction
connection.commit();
} catch (SQLException e) {
// En cas d'erreur, rollback pour annuler les opérations précédentes
connection.rollback();
e.printStackTrace();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Passage en mode manuel pour la gestion explicite des transactions
Exercice d’application:
Imaginez que vous développez une application de gestion de bibliothèque. Vous devez créer un système pour gérer les livres, les auteurs et
les emprunteurs. Utilisez JDBC pour interagir avec une base de données relationnelle.
▪ Livres : Cette table représente les informations sur les livres. La clé primaire est l'ISBN (International Standard Book Number), et la
table contient des informations telles que le titre, la date de publication, et le nombre d'exemplaires disponibles.
▪ Auteurs : Cette table contient des informations sur les auteurs. La clé primaire est l'AuteurID, et la table comprend le nom et le prénom
de l'auteur.
▪ Emprunteurs : Cette table représente les emprunteurs de livres. La clé primaire est l'EmprunteurID, et la table comprend des
informations telles que le nom, l'adresse, et le numéro de téléphone de l'emprunteur.
Exercice d’application:
▪ Dans la classe Bibliothèque, créez les méthodes suivantes pour gérer les différentes tables de la bibliothèque :
o creerTables : Cette méthode devra créer les tables nécessaires à la gestion des livres, des auteurs, des emprunteurs et des
emprunts. Assurez-vous d'inclure les clés primaires et étrangères appropriées.
➔ createAuteursTable(Connection connection)
➔ createEmprunteursTable(Connection connection)
➔ createEmpruntsTable(Connection connection)
o insererDonneesExemple : Insérez au moins un exemple de livre, d'auteur, d'emprunteur et d'emprunt dans votre base de
données. Assurez-vous que ces données exemplaires respectent les contraintes de clé étrangère.
o rechercherLivresParAuteur : Cette méthode devra accepter le nom d'un auteur en paramètre et retourner la liste des livres écrits
par cet auteur.
o rechercherLivresEmpruntes : Cette méthode devra retourner la liste des livres actuellement empruntés, avec les détails de
l'emprunteur.
o enregistrerEmprunt : Cette méthode devra accepter l'ISBN d'un livre et l'ID d'un emprunteur, puis enregistrer un nouvel emprunt
dans la base de données. Assurez-vous de mettre à jour le nombre d'exemplaires disponibles du livre.
Exercice d’application:
Consignes supplémentaires :
o Utilisez des requêtes paramétrées avec des PreparedStatement pour éviter les attaques par injection SQL.
o Gérez les transactions de manière appropriée, en particulier pour l'enregistrement d'un nouvel emprunt.
o Assurez-vous de gérer les exceptions JDBC correctement en les affichant à la console.
Note :
o Assurez-vous de télécharger le connecteur JDBC driver et de l'importer correctement dans votre projet
avant d'exécuter le programme.
o Pour MySQL, le pilote JDBC couramment utilisé est le connecteur MySQL JDBC. Vous devez télécharger le
connecteur MySQL JDBC depuis le site officiel de MySQL (https://dev.mysql.com/downloads/connector/j) et
l'ajouter à votre projet Java.