📌 PARTIE 1 : LES GRANDS CONCEPTS (à dire à l'oral)
1. Qu'est-ce que JDBC ?
Ce que tu dois dire
"JDBC est une API Java qui permet de connecter une application à une base de données relationnelle. Elle fait pa
Java SE, donc pas besoin d'installer des bibliothèques supplémentaires. L'intérêt est que mon application peut
communiquer avec n'importe quelle base (MySQL, Oracle, SQL Server) sans changer le code, il suffit de changer l
driver."
Pour toi : JDBC = le pont entre ton code Java et MySQL.
2. Les 4 types de pilotes JDBC
Type Nom Ce que tu dois dire
Type
JDBC-ODBC "C'est un pont vers ODBC. Plus utilisé, peu performant."
1
Type "Utilise des librairies natives du SGBDR. Performant mais dépendant
Pilote natif
2 système."
Type Pilote pur Java pour serveur
"Passe par un serveur intermédiaire. Flexible mais complexe."
3 intermédiaire
Type "LE PLUS UTILISÉ. Écrit en Java, communique directement avec la bas
Pilote pur Java direct
4 utilisant son protocole. Pas d'intermédiaire, donc plus rapide."
Pour toi : Tu utilises le type 4 avec [Link].
3. Les interfaces principales
Interface Rôle Ce que tu dois dire
Gère les pilotes et crée les "C'est le gestionnaire de drivers. Il trouve le bon pilot
DriverManager
connexions crée la connexion."
Interface Rôle Ce que tu dois dire
"Alternative plus performante. Gère un pool de conne
DataSource Pool de connexions
réutilisables."
"Représente la session avec la base. Permet d'exécute
Connection Connexion à la base
requêtes."
Statement Requête sans paramètres "Pour les requêtes SQL fixes, sans parties variables."
"Pour les requêtes avec paramètres. PROTÈGE CONTR
PreparedStatement Requête paramétrée
INJECTIONS SQL."
CallableStatement Procédure stockée "Pour exécuter des procédures stockées dans la base.
"Contient les lignes retournées par un SELECT. Un cur
ResultSet Résultat d'une requête
qu'on parcourt avec next()."
📌 PARTIE 2 : POUR CHAQUE CODE - CE QUE TU DOIS DIRE À L'ORAL
🔷 CODE 1 : TestConnexionJDBC (Connexion simple)
java
[Link](new [Link]());
Connection cnx = [Link](url, "mysqluser", "");
Ce que tu dois dire à l'oral
"Ce code établit une connexion directe à MySQL. D'abord, j'enregistre le driver MySQL dans DriverManager. Ensu
j'appelle getConnection avec l'URL, l'utilisateur et le mot de passe. Si tout va bien, j'obtiens un objet Connection
actif. L'intérêt est la simplicité. Mais l'inconvénient est qu'à chaque appel, je crée une nouvelle connexion physiq
qui est lent pour une application web très sollicitée."
Pour toi : Simple pour tester mais pas pour la production.
🔷 CODE 2 : TestConnexionPool (Avec DataSource)
java
@Resource(name = "jdbc/pool_demo_jakarta")
DataSource dataSource;
connection = [Link]();
Ce que tu dois dire à l'oral
"Ici j'utilise un pool de connexions. L'annotation @Resource demande à GlassFish d'injecter automatiquement la
DataSource configurée dans le serveur. Ensuite, getConnection() puise une connexion du pool au lieu d'en créer u
nouvelle. L'intérêt est la performance : les connexions sont réutilisées, pas recréées à chaque fois. En plus, le poo
le nombre de connexions simultanées pour ne pas saturer la base. La différence clé : avec DriverManager, close()
vraiment la connexion ; avec DataSource, close() retourne juste la connexion au pool."
Pour toi : C'est la méthode PRO à utiliser en production.
🔷 CODE 3 : TestStatementExecuteQuery (SELECT avec Statement)
java
Statement stmt = [Link]();
ResultSet rs = [Link]("SELECT * FROM clients");
while ([Link]()) {
String nom = [Link]("nom");
Ce que tu dois dire à l'oral
"Ce code exécute une requête SELECT. executeQuery() est spécifique aux SELECT et retourne un ResultSet. next()
le curseur ligne par ligne. Tant que next() retourne true, je peux lire les colonnes avec getString, getInt, etc. L'inté
Statement est sa simplicité pour les requêtes fixes sans paramètres. Mais attention : ne JAMAIS l'utiliser avec des
données saisies par l'utilisateur à cause des risques d'injection SQL."
Pour toi : Utile pour les requêtes statiques (ex: listes déroulantes fixes).
🔷 CODE 4 : TestStatementExecuteUpdate (UPDATE avec Statement)
java
int nb = [Link]("UPDATE clients SET nom = UPPER(nom) WHERE id = 1");
Ce que tu dois dire à l'oral
"executeUpdate() est pour les requêtes INSERT, UPDATE, DELETE. Elle retourne le nombre de lignes affectées. Ici
ligne existe, elle retourne 1, sinon 0. L'intérêt est de savoir si l'opération a réussi et combien de lignes ont été mo
C'est utile pour confirmer à l'utilisateur que son action a bien été prise en compte."
Pour toi : Savoir combien de lignes ont été modifiées = feedback utilisateur.
🔷 CODE 5 : TestStatementExecute (Méthode générique)
java
boolean estResultSet = [Link](sql);
if (estResultSet) {
ResultSet rs = [Link]();
} else {
int nb = [Link]();
Ce que tu dois dire à l'oral
"execute() est la méthode générique qui peut exécuter n'importe quel type de requête. Elle retourne true si le pr
résultat est un ResultSet (SELECT), false sinon. Ensuite, j'utilise getResultSet() ou getUpdateCount() selon le
cas. L'intérêt est de pouvoir traiter des requêtes dont je ne connais pas le type à l'avance, par exemple quand
l'utilisateur saisit lui-même la requête."
Pour toi : Utile pour les outils d'administration de base de données.
🔷 CODE 6 : TestPreparedStatementExecuteUpdate (INSERT sécurisé)
java
String sql = "INSERT INTO clients (nom, prenom) VALUES (?, ?)";
PreparedStatement pstmt = [Link](sql);
[Link](1, "Dupont");
[Link](2, "Jean");
[Link]();
Ce que tu dois dire à l'oral
"C'EST LE PLUS IMPORTANT. PreparedStatement protège contre les injections SQL. Les '?' sont des paramètres. s
remplace le premier '?' par la valeur. Pourquoi c'est sécurisé ? Parce que les valeurs sont traitées comme des don
pas comme du code SQL. Si un utilisateur malveillant tape 'OR 1=1', il sera échappé et deviendra une simple
chaîne. L'intérêt en plus : la requête est précompilée une seule fois, donc plus rapide pour les exécutions répétée
Pour toi : TOUJOURS utiliser PreparedStatement quand il y a des données utilisateur.
🔷 CODE 7 : TestLectureResultSet (Lecture des données)
java
while ([Link]()) {
int id = [Link]("identifiant");
String nom = [Link]("nom");
Ce que tu dois dire à l'oral
"Le ResultSet est comme un curseur positionné avant la première ligne. next() avance d'une ligne et retourne tru
une ligne. Je peux lire les colonnes de deux façons : par nom de colonne (plus lisible) ou par index (plus
rapide). Attention : il faut gérer le cas où la colonne peut être NULL avec wasNull(). L'intérêt est que je peux trans
les données SQL en objets Java."
Pour toi : Convertir les lignes SQL en objets Java (List<Client>).
🔷 CODE 8 : TestSQLException (Gestion des erreurs)
java
catch (SQLException e) {
[Link](); // Message lisible
[Link](); // Code MySQL (ex: 1452)
[Link](); // Code standard SQL
}
Ce que tu dois dire à l'oral
"SQLException est l'exception mère pour toutes les erreurs de base de données. getMessage() donne le texte de
l'erreur. getErrorCode() donne un code spécifique au SGBDR, par exemple 1452 pour une violation de clé étrangè
MySQL. getSQLState() donne un code standard XOPEN. L'intérêt est de pouvoir identifier précisément l'erreur po
afficher un message approprié à l'utilisateur."
Pour toi : Adapter le message selon l'erreur (ex: "Ce client n'existe pas").
🔷 CODE 9 : TestSQLWarning (Avertissements non bloquants)
java
SQLWarning warning = [Link]();
while (warning != null) {
[Link]();
warning = [Link]();
Ce que tu dois dire à l'oral
"SQLWarning est différent de SQLException : ce n'est pas une erreur bloquante. L'opération a réussi mais avec un
problème mineur. Par exemple, quand j'insère une chaîne trop longue, MySQL la tronque et crée un
warning. getWarnings() récupère les warnings. getNextWarning() permet de parcourir la chaîne de
warnings. L'intérêt est d'être informé des problèmes mineurs sans interrompre l'exécution."
Pour toi : Détecter les problèmes silencieux (troncature, arrondi...).
📌 PARTIE 3 : SCHÉMA À DESSINER AU TABLEAU (si le prof demande)
text
Application Java
JDBC API (interfaces)
Driver JDBC (type 4)
│
▼
Base de données (MySQL)
Explique :
"JDBC est une couche d'abstraction. Mon code Java utilise uniquement les interfaces JDBC.
Le driver, fourni par le fabricant de la base, implémente ces interfaces et communique avec
la base en utilisant son protocole spécifique."
📌 PARTIE 4 : TABLEAU RÉCAPITULATIF POUR L'ORAL
Concept Ce que tu dis en 1 phrase
JDBC "API Java pour se connecter aux bases de données."
Driver "Pont entre Java et la base, fourni par le fabricant."
Connection "Session avec la base de données."
Statement "Exécute des requêtes fixes."
PreparedStatement "Exécute des requêtes paramétrées, SÉCURISÉ."
ResultSet "Curseur sur les résultats d'un SELECT."
executeQuery() "Pour SELECT, retourne ResultSet."
executeUpdate() "Pour INSERT/UPDATE/DELETE, retourne nb lignes."
execute() "Pour tout type, retourne boolean."
next() "Avance d'une ligne dans ResultSet."
DataSource "Pool de connexions, plus performant."
SQLException "Erreur bloquante."
Concept Ce que tu dis en 1 phrase
SQLWarning "Avertissement non bloquant."
📌 PARTIE 5 : QUESTIONS PIÈGES FRÉQUENTES À L'ORAL
Question piège Ta réponse
"Car GlassFish charge DriverManager avant de connaître l'emplacement
"Pourquoi ma connexion échoue
driver. Solution : utiliser un pool de connexions ou charger manuelleme
sur GlassFish ?"
driver avec registerDriver()."
"Quelle est la différence entre "PreparedStatement protège contre les injections SQL, précompile la re
Statement et PreparedStatement donc plus rapide pour des exécutions répétées, et gère automatiqueme
?" l'échappement des caractères spéciaux."
"Que fait close() sur une connexion "Elle ne ferme PAS physiquement. Elle retourne la connexion au pool po
issue d'un pool ?" qu'elle soit réutilisée."
"Comment récupérer la clé auto-
"Avec getGeneratedKeys() sur le PreparedStatement."
générée après un INSERT ?"
"Pourquoi utiliser execute() plutôt "Quand je ne connais pas le type de requête à l'avance, par exemple si
que executeQuery() ?" l'utilisateur saisit lui-même la requête."