Vous êtes sur la page 1sur 42

C’est quoi JDBC?

▪ JDBC est l'acronyme de Java Data Base Connectivity et désigne une API(application
programming interface) définie par Sun pour permettre un accès à des bases de
données depuis un programme Java au travers du langage SQL.

▪ L'API JDBC est indépendante des SGBD. Un changement de SGBD ne doit pas impacter
le code applicatif.
▪ Les classes et les interfaces de JDBC sont regroupées dans le package java.sql 2
Architecture JDBC
▪ Pour pouvoir utiliser JDBC, il faut un pilote (driver) qui est spécifique à la base de
données à laquelle on veut accéder
Ajout du driver JDBC (eclipse)
Récupérer l’archive correspondant
au pilote de la base de données
2 que vous voulez utiliser.
Par exemple le fichier mysql-
connector-java-xxx-bin.jar

1
3
La connexion à une base de données
1. Charger le pilote (driver)
2. Etablir la connexion
3. Préparer/exécuter une requête
4. Traiter le résultat de la requête

5
Chargement de driver
▪ Pour se connecter à une base de données, on doit charger la classe de driver dans la machine
virtuelle par le biais de la méthode statique Class.forName() afin que ce dernier
s’enregistre auprès du gestionnaire de pilotes.
▪ La méthode static forName() de la classe Class peut lever l'exception
java.lang.ClassNotFoundException.
▪ Exemple pour une BD MySQL :

• à partir de JDBC 4.0 plus besoin de charger explicitement le pilote JDBC

6
Etablissement de la connexion
▪ Pour se connecter à une base de données, il faut instancier un objet de la classe Connection en lui
précisant sous forme d'URL(Uniform Ressource Locator) la base à accéder.
▪ La méthode getConnection() de la classe DriverManager réalise cette connexion et retourne un
objet de type Connection
▪ Syntaxe :
Connection conn=DriverManager.getConnection(String url,String username,String
password);
▪ Exemple :

▪ Quand une Connection n’a plus d’utilité prendre soin de la fermer explicitement.
• Libération de mémoire et surtout des ressources de la base de données détenues par la connexion

7
Préparer/Exécuter une requête SQL
▪ Pour exécuter une requête SQL, il faut commencer par créer un objet Statement en
utilisant la méthode createStatement() de l’objet Connection.
▪ Syntaxe:
Statement st = cnx.createStatement();
▪ Pour exécuter une requête SQL de type insert, update et delete on peut utiliser la
méthode executeUpdate() de l’objet Statement :
• int valeur = st.executeUpdate(String commande);
o commande est une chaîne de caractères qui contient la commande SQL d’insertion, de mise à jour ou de
suppression.
o valeur est la valeur de retour de la méthode. Elle représente le nombre de lignes insérées, mises à jour ou
supprimées, en fonction de la commande exécutée

▪ Exemple:

8
Préparer/Exécuter une requête SQL
▪ Pour récupérer le contenu d’une base de données, il convient d’utiliser la méthode
executeQuery().
▪ La syntaxe est la suivante :
ResultSet rs = st.executeQuery(String commande);
• commande est une requête de type select
• rs est objet de la classe ResultSet, il contient, sous la forme d’une table,
toutes les données résultant de la requête select..
▪ Exemple :

9
Problème de Statement
▪ Le Statement permet bien évidement d’effectuer des requêtes paramétrées
• Cela impose de construire la requête en java par concaténation:

▪ La construction de ce genre de requête peut s’avérer fastidieuse et source d’erreur.


▪ Mais elle est surtout source de problèmes de sécurité car elle introduit la possibilité
d’effectuer des injections SQL.

10
PreparedStatement
▪ L'interface PreparedStatement définit les méthodes pour un objet qui va
encapsuler une requête précompilée.
▪ Ce type de requête est particulièrement adapté pour une exécution répétée d'une
même requête avec des paramètres différents.
▪ Lors de l'utilisation d'un objet de type PreparedStatement, la requête est
envoyée au moteur de la base de données pour que celui-ci prépare son exécution.
▪ Pour créer un objet de type PreparedStatement, on utilise la méthode
prepareStatement() de l’objet Connection.
▪ Cette méthode attend en paramètre une chaîne de caractères contenant la requête
SQL. Dans cette chaîne, chaque paramètre est représenté par un caractère ?.

• Exemple:
11
PreparedStatement
▪ L’affectation de la valeur se fait via les méthodes setXXX.
▪ Il existe une méthode setXXX appropriée à chaque type de données,
• setInt si la colonne contient des entiers
• setString si la colonne contient des chaines de caractères.
• …
▪ Ces méthodes prennent en paramètres l’index de la variable en commençant par 1.
▪ Pour l’exécution, on utilise là encore les méthodes executeQuery() et
executeUpdate() selon le cas, la seule différence est dans le fait que la requête
SQL est fournie dès la construction du PreparedStatement

12
PreparedStatement

▪ Exemple:

▪ A noter que les « ’ » qui servent à délimiter en SQL les chaines de caractères ne sont
plus nécessaires. Elles seront automatiquement ajoutées au moment du setString

13
Traitement du résultat
▪ executeQuery()renvoie un objet de type ResultSet qui contient les données issues de
l'exécution de la requête
▪ Pour parcourir un ResultSet, on utilise sa méthode next() qui permet de passer d’une ligne à
l’autre. Si la ligne suivante existe, la méthode next() retourne true. Si non elle retourne false.
▪ La navigation au sein d’une table de type ResultSet s’effectue de la même façon qu’un parcours de
tableau en utilisant une boucle while().
▪ Pour récupérer la valeur d’une colonne de la ligne courante du ResultSet, on peut utiliser les méthodes
getInt(colonne), getString(colonne), getFloat(colonne),
getDouble(colonne),getDate(colonne), etc…
• colonne représente le numéro ou le nom de la colonne de la ligne courante.

14
Traitement du résultat
▪ L’objet ResultSetMetaData est très utilisé quand on ne connait pas la structure
d’un ResultSet.
▪ Avec L’objet ResultSetMetaData, on peut connaitre le nombre de colonnes du
ResultSet, le nom, le type et la taille de chaque colonne.
▪ Exemple, le nombre de colonne peut être obtenu grâce à la méthode
getColumnCount() de cet objet :

15
Exemple Complet de requête Select

16
Gestion des transactions
▪ Transaction : permet de ne valider un ensemble de traitements sur une
BD que si ils se sont tous effectués correctement
▪ Exemple : transfert d’argent = débiter un compte + créditer un autre
compte
▪ L’interface Connection offre des services de gestion des transactions
• setAutoCommit(boolean autoCommit) définit le mode de la connexion
(auto-commit par défaut)
• commit() déclenche validation de la transaction
• rollback() annule la transaction

17
Gestion des transactions-Exemple

les instructions
qui constituent
la transaction

valider la transaction

annuler les opérations de la transaction

18
Architecture d’une application
▪ Dans la pratique, on cherche toujours à séparer la logique de métier de la
logique de présentation.
▪ On peut dire qu’on peut diviser une application en 3 couches:
• La couche d’accès aux données: DAO
o Partie de l’application qui permet d’accéder aux données de l’applications .
o En utilisant une couche DAO, on peut s’abstraire de la façon dont les données sont stockées
au niveau des objets métier (propres à l’entreprise).
o Le changement du mode de stockage ne remet pas en cause le reste de l’application : seules
les classes d’accès aux données sont à réécrire et/ou à adapter au nouveau type de stockage.
• La couche Métier:
o Regroupe l’ensemble des traitements que l’application doit effectuer.
o La couche métier offre des services applicatifs et métier à la couche présentation.

• La couche présentation:
o S’occupe de la saisie des données et de l’affichage des résultats;

19
Architecture d’une application
▪ Généralement la couche présentation respecte le pattern MVC qui
fonctionne comme suit:
1. La vue permet de saisir les données, envoie ces données au contrôleur
2. Le contrôleur récupère les données saisies. Après la validation de ces données,
il fait appel à la couche métier pour exécuter des traitements.
3. Le contrôleur stocke le résultat dans le modèle.
4. Le contrôleur fait appel à la vue pour afficher les résultats.
5. La vue récupère les résultats à partir du modèle et les affiche.

20
Mapping objet relationnel (ORM)
▪ D’une manière générale les applications sont orientée objet.
▪ D’autres part les données persistantes sont souvent stockées dans des
bases de données relationnelles.
▪ Le mapping Objet relationnel consiste à faire correspondre un
enregistrement d’une table de la base de données à un objet d’une
classe correspondante.
▪ Dans ce cas on parle d’une classe persistante.
▪ Une classe persistante est une classe dont l’état de ses objets sont
stockés dans une unité de sauvegarde (Base de données, Fichier, etc..)

21
Application
▪ On considère une base de données qui contient une table « t_etudiant » qui permet
de stocker les étudiants d’une école. La structure de cette table est la suivante:

▪ Nous souhaitons créer une application java qui permet de gérer des étudiants
(ajouter, modifier, rechercher, supprimer, consulter)
▪ Dans cette application nous devons séparer les couches DAO, métier et présentation.

22
Application (1)
Travail à faire:
A.
1. Créer la base de données «scolarite» de type MySQL
2. Créer la table « t_etudiant » dans la base de données « scolarite »
B.
1. Créer la classe persistante « Etudiant.java » (package metier.entity)
2. Créer la classe « SingletonConnection.java » contenant une méthode statique getConnection() qui
permet de retourner une Connection unique vers la base de données (package dao)
3. Créer l’interface « Iscolarite.java » (package dao) contenant les méthodes suivantes:

23
Application (2)
4. Créer la classe « ScolariteImpl.java » (package dao) qui implémente l'interface
« Iscolarite.java » et redéfinir toutes les méthodes de l'interface.
5. Créer une classe Test.java qui permet de tester l’ensemble des méthodes de la
couche Dao .(package dao)
6. Créer une application java/swing (package presentation) qui permet de:
• Ajouter un étudiant. Afficher tous les étudiants de la table « t_etudiant » dans un JTable
• Chercher les étudiants par mot clé (les étudiants dont le nom contient ce mot clé). Utiliser
JTable pour afficher le résultat

24
Structure du projet
classe Etudiant

26
Classe SingletonConnection
Le singleton est un design pattern dont l'objectif est de restreindre
l'instanciation d'une classe à un seul objet.
Il est utilisé lorsqu'on a besoin exactement d'un objet pour
coordonner des opérations dans un système.
Le modèle est parfois utilisé pour son efficacité, lorsque le système
est plus rapide ou occupe moins de mémoire avec peu d'objets
qu'avec beaucoup d'objets similaires.

27
Classe SingletonConnection (2ème façon)

28
Classe SingletonConnection

29
Interface IScolarite

30
Classe ScolariteImpl (ajouter un étudiant)

31
Classe ScolariteImpl (consulter la liste des étudiants)

32
Classe ScolariteImpl (consulter la liste des étudiants par mot clé)

33
Classe ScolariteImpl (rechercher un étudiant)

34
Classe ScolariteImpl (modifier un étudiant)

35
Classe ScolariteImpl (supprimer un étudiant)

36
Classe TableModele

37
Classe ScolaritePresentation.java

38
Classe AddPresentation

39
Classe FindPresentation

40
Exercice d’application
On souhaite créer une application java qui permet de gérer un catalogue de produits. Ce catalogue est formé par des produits classés par
catégorie qui sont stockés dans une base de données MYSQL.

Une catégorie est définie par :


- Un code de type INT, clé primaire, Auto_Increment
- Le nom de catégorie de type VARCHAR de taille 30.
Un produit appartenant à une catégorie est défini par :
- Une référence de type int, clé primaire
- Le nom du produit
- Le prix du produit
- La quantité en stock
L’application à développer doit respecter la séparation des couches Dao, métier et présentation. Elle doit permettre de :
- Ajouter une nouvelle catégorie
- Ajouter un nouveau produit appartenant à une catégorie
- Consulter toutes les catégories.
- Consulter tous les produits
41
- Consulter les produits sachant le code catégorie.
Exercice d’application
Travail à faire
1. Etablir le diagramme de classe de la couche métier
2. Créer la base de données MYSQL
3. Créer les classes persistantes Produit et Categorie
4. Créer l’interface IDaoCatalogue déclarant les méthodes à implémenter
5. Créer une classe SingletonConnection contenant une méthode statique geConnection() qui permet de retourner une connexion
unique vers la base de données.
6. Créer une implémentation de l’interface IDaoCatalogue
7. créer une interface utilisateur avec la bibliothèque Swing. Cette interface permet de rechercher des produits par catégorie (voir
figure ci-dessous) :

42

Vous aimerez peut-être aussi