Vous êtes sur la page 1sur 49

L’ACCÈS AUX BASES DE

DONNÉES

Partie 1: Introduction sur la persistance des objets

ISET Mahdia AU 2020-2021


Généralités sur la persistance des
2
données dans les applications

 Lancement, exécution et arrêt d’une application peut


entraîner la perte des données et des états d’un
programme

 En programmation, la gestion de la persistance des


données est le mécanisme responsable de la
sauvegarde et la restauration de ces données.
Généralités sur la persistance des
3
données dans les applications
 Différentes solutions peuvent être utilisées pour la persistance des
objets en Java :

· Sérialisation(I/O)
· JDBC : Java Data Base Connectivity
· Génération de bytecode
· framework de mapping O/R (Object Relational Mapping)
· Base de données objet (ODBMS)
Généralités sur la persistance des
4
données dans les applications
 Stockage des données dans des fichiers ou bases de données
 Quels intérêts des BD?

 Meilleure gestion du cycle de vie des données

 Intégrité référentielle, cohérence par le transactionnel

 Architecture distribuée, réseau

 Exploitation, maintenance
Les modèles de données
5

 Il existe plusieurs types de base de données

Temps Théories ensemblistes et


Les données
l'algèbre sont
relationnel.
Hiérarchique organisées
Des tables de
façon hiérarchique
Clés primaires et
Relationnel grâce à des
étrangères.
pointeurs.SQL.
Requêtes
Objet
Exemple : MySQL,
XML PosgreSQL, HSQLDB,
Derby
·
CHAPITRE II: L’ACCÈS AUX
BASES DE DONNÉES
Partie 2: L’API JDBC (Java Data Base Connectivity)

ISET Mahdia AU 2020-2021


Les classes de L’API JDBC
7

 Cette API à était développée par SUN pour permettre à des


applications Java d'accéder à des bases de données relationnelles
quelconques

 Toutes les classes de JDBC sont dans le package java.sql. Il faut


donc l'importer dans tous les programmes devant utiliser JDBC.

Exemple : import java.sql.*;


Les classes de L’API JDBC
8

Classe Rôle
DriverManager Charger et configurer le driver de la
base de données.
Connection Réaliser la connexion et l'authentification
à la base de données.
Statement (et Contenir la requête SQL et la
PreparedStatement) transmettre à la base de données.
ResultSet Parcourir les informations retournées par
la base de données dans le cas d'une
sélection de données
Etapes d’accès à une BD
9

Première étape:
Préciser le type de driver que l'on veut utiliser. Le Driver
permet de gérer l'accès à un type particulier de SGBD

Deuxième étape:
Récupérer un objet « Connection » en s'identifiant
auprès du SGBD et en précisant le nom de la base de
donnée à utiliser
Etapes d’accès à une BD
10

Etapes suivantes
 A partir de la connexion, créer un « statement » (état)

correspondant à une requête particulière


 Exécuter ce statement au niveau du SGBD

 Fermer le statement

Dernière étape
Se déconnecter de la base en fermant la connexion
Étape 1: charger le pilote
Qu’est ce qu’un pilote/driver?
11

 Un pilote ou driver JDBC est un "logiciel" qui permet d'établir une


connexion entre un programme java et un système de gestion de
bases de données.
 Ce "logiciel" est en fait une implémentation de l'interface Driver, du package
java.sql.
 Le pont JDBC-ODBC est un exemple de driver JDBC, ce dernier permet
l'interfaçage avec ODBC ( sun.jdbc.odbc.JdbcOdbcDriver).
 I l existe 4 types de drivers JDBC qui se différencient par leur implémentation
Les drivers sont pris en charge par la classe DriverManager.
Étape 1: charger le pilote
12
Les types de drivers
Il existe 4 types de drivers JDBC :
 Le pont JDBC-ODBC (JDBC-ODBC bridge plus ODBC driver) : Ce
driver est présent dans J2SE (sun.jdbc.odbc.JdbcOdbcDriver). Il permet
l'accès au SGBD via le driver ODBC.
 Native-API partly-Java driver : Ce type de driver traduit les appels
de JDBC à un SGBD particulier, grâce à un mélange d'API java et d'API
natives.
 JDBC-Net pure Java driver : Ce type de driver (écrit entièrement en
java) passe par un serveur intermédiaire pour l'accès au SGBD.
 Native-protocol pure Java driver : Ce type de driver (écrit
entièrement en java) se connecte directement au SGBD.
Étape 1: charger le pilote
Les types de drivers
13
Étape 1: charger le pilote
Comment charger un driver?
14

 Utiliser la méthode Class.forName, qui aura pour effet d'enregistrer le


Driver auprès du DriverManager.
Exemples

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //pour le pont JDBC-ODBC


Class.forName("com.mysql.cj.jdbc.Driver"); //pour MySQL
Class.forName("oracle.jdbc.driver.OracleDriver"); //pour Oracle
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver "); //pour SQL
Server

 Invocation de la méthode newInstance() sur cet objet, qui nous


retourne une instance de ce driver, de type java.sql.Driver
Étape 2: Connexion à une BD
15

 Une connexion à une base de données avec JDBC est


représentée par une instance de la classe java.sql.Connection.

 Pour ouvrir une connexion vers une base de données, il suffit de


spécifier l'url de connexion, le login et le password, à la méthode
getConnection de DriverManager.
Étape 2: Connexion à une BD
16
Syntaxe
 Syntaxe:

String url = "url";


String login = "log";
String password = "pass";
try{
Connection connection = DriverManager.getConnection(url,login,password);
} catch(SQLException sqle)
{ // gérer l’erreur }
Finally
{ //fermer la connexion }
Étape 2: Connexion à une BD
17
Structure d’une URL
Les URL JDBC sont définies sous forme de String selon ce schéma :
String url = "jdbc:<subprotocol>:<subname>"
Avec:
<jdbc>: Le protocole dans une URL JDBC est toujours jdbc
<subprotocol>: Cela correspond au nom du driver ou au mécanisme
de connexion à la base de données.
<subname> : Une manière d'identifier la source de données. Ce
dernier élément dépend complètement du sous-protocole et du driver.
Étape 2: Connexion à une BD
Exemples d’URL
18

jdbc:odbc:maBase;CacheSize=30;ExtensionCase=LOWER
jdbc:mysql://localhost/maBase
jdbc:oracle:oci8@:maBase
jdbc:oracle:thin@://localhost:8000:maBase
jdbc:sybase:Tds:localhost:5020/maBase
Étape 2: Connexion à une BD
19
Comment fermer une connexion?
La connexion est fermée automatiquement par le garbage collector,
mais il est toujours préférable de fermer soi même une connexion.
De manière générale il est nécessaire de bien gérer les exceptions
suivantes:
ClassNotFoundException: problème de chargement du driver (ex:
driver introuvable)
SqlException: problème au niveau de la connexion(ex: BD
introuvable)
Étape 2: Connexion à une BD
Comment fermer une connexion?
20
Étape 3: Accès à la BD
Comment créer un statement?
21

L'interface Statement représente une instruction SQL.


L'obtention d'une instance de cette interface se fait à partir de
la Connection :
Étape 3: Accès à la BD
Comment exécuter un statement?
22

Méthode d’exécution Rôle Type de retour


execute Générique pour n'importe un boolean
quelle expression SQL. true si l'instruction renvoie un
ResultSet, false sinon

executeQuery SELECT un ResultSet contenant les


résultats

executeUpdate INSERT, UPDATE, DELETE, int indiquant le nombre de


CREATE, etc tuples (lignes) modifiés

exécuteBatch Spécifique aux transactions int[] : un tableau d'entiers


indiquant le nombre de
tuples modifiés pour chaque
commande contenue dans le
batch.
Étape 3: Accès à la BD
Quelques exemples
23
Étape 3: Accès à la BD
La classe ResultSet
24

 C'est une classe qui représente une abstraction d'une table qui se compose de
plusieurs enregistrements constitués de colonnes qui contiennent les données.
 Les principales méthodes pour obtenir des données sont :
 getInt(int/String) : retourne sous forme d'entier le contenu de la colonne dont le
numéro/nom est passé en paramètre.

 getFloat(int/String) : retourne sous forme d'un nombre flottant le contenu de la colonne


dont le numéro/nom est passé en paramètre.
 getDate(int/String) : retourne sous forme de date le contenu de la colonne dont le
numéro/nom est passé en paramètre.
 next()/previous()/last()/First()/beforeFirst()/afterLast(): déplacer le curseur sur
l’enregistrement en question.
 close(): ferme le ResultSet
 getMetaData(): retourne un objet de type ResultSetMetaData associé au ResultSet.
Étape 3: Accès à la BD
Le parcours d’un resultSet
25
Étape 3: Accès à la BD
Le parcours d’un resultSet
26
Étape 3: Accès à la BD
Le parcours d’un resultSet
27
Étape 3: Accès à la BD
Le parcours d’un resultSet
28
Étape 3: Accès à la BD
L’interface ResultSetMetaData
29
Étape 3: Accès à la BD
Qu’est ce qu’un PreparedStatement?
30

 L'interface PreparedStatement étend Statement et représente une


instruction paramétrée. Cette interface diffère de Statement sur deux points
principaux :

 Les instances de PreparedStatement contiennent une instruction SQL dèjà


compilée. D'où le terme prepared. Cela améliore notamment les
performances si cette instruction doit être appelée de nombreuses fois.

 Les instructions SQL des instances de PreparedStatement contiennent un


ou plusieurs paramètres d'entrée, non spécifiés lors de la création de
l'instruction. Ces paramètres sont représentés par des points
d'interrogation(?). Ces paramètres doivent être spécifiés avant l'exécution.
Étape 3: Accès à la BD
Création d’un PreparedStatement
31

 PreparedStatement prep1 =
connection.prepareStatement("SELECT * FROM
Annuaire WHERE nom = ?");
 PreparedStatement prep2 =
connection.prepareStatement("UPDATE Annuaire SET
noTel = ? WHERE nom = ?");
 PreparedStatement prep3 =
connection.prepareStatement("SELECT Attribut1,
Attribut2 FROM MaTable");
Étape 3: Accès à la BD
Passage des paramètres
32

 Le passage des paramètres d'entrée des


PreparedStatement se fait grâce à l'ensemble des
méthodes setXXX. Il est important de connaître
les correspondances entre les types SQL et les types
java
Étape 3: Accès à la BD
Passage des paramètres
33
Étape 3: Accès à la BD
Passage des paramètres
34

String sql = "UPDATE Stocks SET prix = ?, quantite = ?


WHERE nom = ?";

PreparedStatement preparedStatement =
connection.prepareStatement(sql);
preparedStatement.setBigDecimal(1,15.6);
preparedStatement.setInt(2,256);
preparedStatement.setStringl(3,"café");
preparedStatement.executeUpdate();
Exemple complet
35
Exemple complet
36
Étape 3: Accès à la BD
La gestion de SqlException
37

 La classe SQLException représente les erreurs émises


par la base de données. Elle contient trois attributs qui
permettent de préciser l'erreur :
 message : contient une description de l'erreur
 SQLState : code défini par les normes X/Open et SQL99
 ErrorCode : le code d'erreur du fournisseur du pilote
 La classe SQLException possède une méthode
getNextException() qui permet d'obtenir les autres
exceptions levées durant la requête. La méthode renvoie
null une fois la dernière exception renvoyée.
Étape 3: Accès à la BD
La gestion de SqlException
38
Étape 4: Déconnexion
39

La méthode close() permet de libérer les ressources prises


par la création d'objets de type ResultSet, Statement,
et Connection. Elle existe pour chacune de ces interfaces.
Elle est le plus souvent employée pour une Connection,
car elle libère en même temps toutes les ressources qui lui
sont associées.

Il faut commencer par libérer le ResultSet, puis le


Statement et enfin la connection.
Étape 4: Déconnexion
40
CHAPITRE : L’ACCÈS AUX
BASES DE DONNÉES

Partie 3: La persistance de données avec


DAO (Data Access Object/
Objet d’accès aux données)

ISET Mahdia AU 2020-2021


Les problèmes rencontrés avec la
42
solution JDBC
Les problèmes rencontrés avec la
43
solution JDBC
 La première approche pour faire une correspondance entre le
modèle objet et relationnel a été d'utiliser l'API JDBC fournie
en standard avec le JDK. Cependant cette approche possède
plusieurs inconvénients majeurs :
 nécessite l'écriture de nombreuses lignes de codes, souvent
répétitives
 le mapping entre les tables et les objets est un travail de bas
niveau
 Le code pour la persistance selon le type de stockage (BD
relationnelles, BD objet, fichiers simples, etc.) avec les
implémentations des fournisseurs de SGBD ‰
 Si le code pour la persistance est imbriquée avec le code «
métier », il est difficile de changer de sources de données
Solution: Ajouter une couche de
44
persistance
 La partie du code responsable de l'accès aux données
dans une application multiniveau doit être encapsulée
dans une couche dédiée aux interactions avec la base de
données de l'architecture généralement appelée couche
de persistance. Celle-ci permet notamment :
 d'ajouter un niveau d'abstraction entre la base de
données et l'utilisation qui en est faite.
 de simplifier la couche métier qui utilise les traitements
de cette couche
 de masquer les traitements réalisés pour mapper les
objets dans la base de données et vice versa
 de faciliter le remplacement de la base de données
utilisée
Les opérations de type CRUD
45

 ‰'acronyme CRUD (Create, Read, Update and Delete)


L
désigne les quatre opérations réalisables sur des
données (création, lecture, mise à jour et suppression).
 Create pour créer une nouvelle entité dans la base ‰
 Retrieve pour retrouver une ou plusieurs entités de la
base
 Update pour modifier une entité de la base ‰
 Delete pour supprimer une entité de la base ‰
Le modèle de conception DAO
46

 P‰ ermet d’encapsuler le code lié à la persistance des données


dans des objets DAO dont l’interface est indépendante de la
source de données‰
 Quand l’application a besoin d’effectuer une opération liée à
la persistance d’un objet, elle fait appel à un objet DAO à qui
elle passe les informations nécessaires pour effectuer
l’opération. ‰
Chaque classe d’objet métier a son propre type de
DAO (DAOEmploye, DAODepartement, …) ‰ Mais le même objet
DAO peut être utilisé pour tous les objets d’une classe d’objet
métier
Le modèle de conception DAO
47

 Exemple: une interface qui propose des opérations de


type CRUD pour un objet de type Employe
public DAOEmploye
{ public Employe obtenir(Integer id);
public void creer(Employe emp);
public void modifier(Employe emp);
public Collection obtenirTous();
public void supprimer(Employe emp); }
Le modèle DAO
48

 Les DAOs sont placés dans la couche dite « d’accès aux


données » qui est souvent sur une autre machine que la couche
des objets métiers ‰
 Les échanges de messages entre les DAOs et les objets métiers
engendrent donc souvent des appels distants et des DTO
peuvent donc être utilisés pour améliorer la vitesse des
échanges
Le modèle DAO
49

Vous aimerez peut-être aussi