Vous êtes sur la page 1sur 42

Travailler avec une base de

données

Mr. Riadh BOUHOUCHI


Plan du cours

I. Travailler avec JDBC et une base de données


II. Utiliser le modèle DAO
III. Hibernate
IV. JPA (Java Persistance API)
Travailler avec JDBC et une base
de données (1)

JDBC : c'est une API qui fait partie intégrante de la plate-forme Java, et qui est
constituée de classes permettant l'accès via une application Java à des données
rangées dans une base des données.

Les actions rendues possibles par cette API sont :


1.La connexion avec le SGBD
2.L’envoi de requêtes SQL au SGBD depuis une application Java
3.Le traitement des données et éventuelles erreurs retournées par le SGBD lors
des différentes étapes du dialogue (connexion, requête, exécution, etc.)

1
Travailler avec JDBC et une base
de données(2)

2
Travailler avec JDBC et une base
de données (3)

Les avantage fournit par le JDBC sont la portabilité sur de nombreux O.S. et
sur de nombreuses SGBD l’uniformité du langage de description des
applications, des applets et des accès aux bases de données et la liberté totale
vis à vis des constructeurs.

Le JDBC est fournie par le package java.sql tel que il permet de formuler et
gérer les requêtes aux bases de données relationnelles.

3
Travailler avec JDBC et une base
de données (4)

Pour le JDBC 8 interfaces sont défi les objets nécessaires pour la connexion à
une base éloignée ou à la création et exécution de requêtes SQL

Les 8 interfaces sont :

Statement ResultSetMetaData
CallableStatement, ResultSet
PreparedStatement Connection
DatabaseMetaData Driver

4
Utiliser le modèle DAO (1)

DAO (Data Access Object) permet de faire le lien entre la couche métier et la
couche persistante, ceci afin de centraliser les mécanismes de mapping entre
notre système de stockage et nos objets Java. Il permet aussi de prévenir un
changement éventuel de système de stockage de données.

Le modelé DAO consiste à ajouter un ensemble d'objets dont le rôle sera


d'aller :
Lire, Ecrire. Modifier et Supprimer les données.

5
Utiliser le modèle DAO (2)

Le modèle DAO (Data Access Object) est maintenant un mécanisme pour


abstraire les détails de la persistance dans une application.

L'idée est qu’au lieu de communiquer directement avec la base de données, le


système de fichiers, le service Web ou tout autre mécanisme de persistance
utilisé par l’application, la logique du domaine s'adresse à une couche DAO.

La couche DAO (Data Access Objects) a pour but de transformer les objets
métiers en données sérialisées et inversement.

6
Hibernate (1)

Hibernate est une solution open source de type ORM (Object Relational
Mapping) qui permet de faciliter le développement de la couche persistance
d'une application. Hibernate permet donc de représenter une base de données
en objets Java et vice versa.

Il facilite la persistance et la recherche de données dans une base de données


en réalisant lui-même la création des objets et les traitements de remplissage
de ceux-ci en accédant à la base de données.

Hibernante est très populaire notamment à cause de ses bonnes performances


et de son ouverture à de nombreuses bases de données.

7
Hibernate (2)

Hibernate a besoin de plusieurs éléments pour fonctionner :

1. Une classe de type javabean qui encapsule les données d’une occurrence
d’une table
2. Un fichier de correspondance qui configure la correspondance entre la
classe et la table
3. Des propriétés de configuration notamment des informations concernant la
connexion à la base de données .

Une fois ces éléments correctement définis, il est possible d’utiliser Hibernate
dans le code des traitements à réaliser.

8
Hibernate (3)

L’architecture d’Hibernate est donc la suivante :

Pour assurer le mapping, Hibernate a besoin d’un fichier de correspondance on


appelle mapping file au format XML qui va contenir des informations sur la
correspondance entre la classe définie et la table de la base de données.

9
Hibernate (4)

Il est recommandé de définir un fichier de mapping pour plusieurs classes et le


plus simple est de définir un fichier de mapping par classe nommé du nom de la
classe suivi par l’extension ".hbm.xml".

Ce fichier doit être situé dans le même répertoire que la classecorrespondante ou


dans la même archive pour les applicationspackagées.

10
Hibernate (5)

Pour exécuter Hibernate, il faut lui fournir un certain nombre de propriétés


concernant sa configuration pour qu’il puisse se connecter à la base de données.

Ces propriétés peuvent être fournies sous plusieurs formes : un fichier de


configuration nommé hibernate.properties et stocké dans un répertoire inclus
dans le classpath ou un fichier de configuration au format XML nommé
hibernate.cfg.xml

11
Hibernate (6)

Le langage de requête HQL


Pour offrir un langage d’interrogation commun à toutes les bases de données,
Hibernate propose son propre langage nommé HQL (Hibernate Query
Language). Le langage HQL est proche de SQL avec une utilisation sous forme
d’objets des noms de certaines entités.

C’est Hibernate qui se charge de générer la requête SQL à partir de la requête


HQL en tenant compte du contexte. C’est-à-dire le type de base de données
utilisée et défini dans le fichier de configuration et la configuration du mapping.

12
Hibernate (7)

Une vue (très) haut niveau de l'architecture d'Hibernate

13
Hibernate (8)

Architecture Hibernate
Hibernate est flexible et supporte différentes approches. L'architecture légère
laisse l'application fournir ses propres connexions JDBC et gérer ses propres
transactions. Cette approche utilise le minimum des APIs Hibernate

14
Hibernate (9)

SessionFactory (org.hibernate.SessionFactory)

Un cache threadsafe (immuable) des mappings vers une (et une seule) base de
données.

Une factory (fabrique) de Session et un client de ConnectionProvider.


Peut contenir un cache optionnel de données (de second niveau) qui est
réutilisable entre les différentes transactions

15
Hibernate (10)

Session (org.hibernate.Session)

Un objet mono-threadé, à durée de vie courte, qui représente une conversation


entre l'application et l'entrepôt de persistance. Encapsule une connexion JDBC.

Factory (fabrique) des objets Transaction. Contient un cache (de premier niveau)
des objets persistants, ce cache est obligatoire.

Il est utilisé lors de la navigation dans le graphe d'objets ou lors de la


récupération d'objets par leur identifiant.

16
Hibernate (11)

Objets et Collections persistants

Objets mono-threadés à vie courte contenant l'état de persistance et la fonction


métier.

Ceux-ci sont en général les objets de type JavaBean; la seule particularité est
qu'ils sont associés avec une (et une seule) Session.

Dès que la Session est fermée, ils seront détachés et libres d'être utilisés par
n'importe laquelle des couches de l'application (ie. de et vers la présentation en
tant que Data Transfer Objects - DTO : objet de transfert de données).

17
Hibernate (12)

Transaction (org.hibernate.Transaction)

(Optionnel) Un objet mono-threadé à vie courte utilisé par l'application pour


définir une unité de travail atomique.

Abstrait l'application des transactions sous-jacentes qu'elles soient JDBC, JTA ou


CORBA.

Une Session peut fournir plusieurs Transactions dans certains cas.

18
Hibernate (13)

ConnectionProvider(org.hibernate.connection.ConnectionProvider)
(Optionnel) Le fabriquant des connexions JDBC. Abstrait l'application de la
Datasource ou du DriverManager sous-jacent. Non exposé à l'application, mais peut
être étendu/implémenté par le développeur.

Configuration d'Hibernate
Il y a trois manières d’effectuer la configuration d’Hibernate pour une application
donnée :
Par programme
Par un fichier de propriétés hibernate.properties
Par un document xml hibernate.cfg.xml

19
Hibernate (14)

1. Configurer par programme


org.hibernate.cfg.Configuration représente un ensemble de mappings des classes
Java d'une application vers la base de données SQL.

Configuration cfg = new Configuration()


.addResource("Item.hbm.xml")
.addResource("Bid.hbm.xml");

Éviter de câbler en dur dans le programme les noms de fichiers

20
Hibernate (15)

Configuration cfg = new Configuration()


.addClass(org.hibernate.auction.Item.class)
.addClass(org.hibernate.auction.Bid.class);

Hibernate va rechercher les fichiers de mappings


/org/hibernate/auction/Item.hbm.xml et /org/hibernate/auction/Bid.hbm.xml dans le
classpath

21
Hibernate (16)

2. Fichiers de propriétés
Ce n'est pas le seul moyen de passer des propriétés de configuration à Hibernate.
Les différentes options sont :

1. Passer une instance de java.util.Properties à Configuration.setProperties ().


2. Placer hibernate.properties dans un répertoire racine du classpath
3. Positionner les propriétés System en utilisant java -Dproperty=value.
4. Inclure des éléments <property> dans le fichier hibernate.cfg.xml

22
Hibernate (17)

Exemple de document hibernate.cfg.xml

<!DOCTYPE hibernate-configuration PUBLIC


"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
...
</session-factory>
</hibernate-configuration>

23
JPA (Java Persistance API) (1)

L'utilisation pour la persistance d'un mapping permet de proposer un niveau


d'abstraction plus élevé que la simple utilisation de JDBC : ce mapping permet
d'assurer la transformation d’objets vers la base de données et vice versa que
cela soit pour des lectures ou des mises à jour (création, modification ou
suppression).

L'API propose un langage d'interrogation similaire à SQL mais utilisant des


objets plutôt que des entités relationnelles de la base de données.

24
JPA (Java Persistance API) (2)

L'API Java Persistance repose sur des entités qui sont de simples POJOs
(plain old Java object) annotés et sur un gestionnaire de ces entités
(EntityManager) qui propose des fonctionnalités pour les manipuler (ajout,
modification suppression, recherche).

Ce gestionnaire est responsable de la gestion de l'état des entités et de leur


persistance dans la base de données.

25
JPA (Java Persistance API) (3)

Fichier de configuration

Un seul fichier de configuration XML


Il est nécessaire d’indiquer au fournisseur de persistance comment il peut se
connecter à la base de données
Ce fichier peut aussi comporter d’autres informations

26
JPA (Java Persistance API) (4)

Fichier de configuration

27
JPA (Java Persistance API) (5)

Les Entités

classes dont les instances peuvent être persistantes sont appelées des entités dans
la spécification de JPA

Le développeur indique qu’une classe est une entité en lui associant l’annotation
@Entity

Il faut importer javax.Persistence.Entity dans les classes entités.

28
JPA (Java Persistance API) (6)

Classes entités : Entity Class

Une classe entité doit posséder un attribut qui représente la clé primaire dans la
BD (@Id)
Elle doit avoir un constructeur sans paramètre protected ou public
Elle ne doit pas être final
Aucune méthode ou champ persistant ne doit être final
Une entité peut être une classe abstraite mais elle ne peut pas être une interface

29
JPA (Java Persistance API) (7)

Classes entités : Embedded Class

Il existe des classes incorporées (embedded) dont les données n’ont pas
d’identité dans la BD mais sont insérées dans une des tables associées à une entité
persistante

Par exemple, une classe Adresse dont les valeurs sont insérées dans la table
Employe

30
JPA (Java Persistance API) (8)

EntityManager

Classe javax.persistence.EntityManager
Le gestionnaire d’entités est l’interlocuteur principal pour le développeur.
Il fournit les méthodes pour gérer les entités :

les rendre persistantes,


les supprimer de la base de données,
retrouver leurs valeurs dans la base, etc

31
JPA (Java Persistance API) (9)

Relations

4 types de relations à définir entre les entités de la JPA:

One to One

Many to One

One to Many

Many to Many

32
JPA (Java Persistance API) (10)

Queries
Il est possible de rechercher des données sur des critères plus complexes que la
simple identité

Les étapes sont alors les suivantes :


1. Décrire ce qui est recherché (langage JPQL)
2. Créer une instance de type Query
3. Initialiser la requête (paramètres, pagination)
4. Lancer l’exécution de la requête

La JPA introduit le JPQL (Java Persistence Query Language), qui est, tout comme
le EJBQL ou encore le HQL, un langage de requête du modèle objet, basé sur SQL.

33
JPA (Java Persistance API) (11)

Interface Query

Représente une requête

Une instance de Query (d’une classe implémentant Query) est obtenue par les
méthodes

createQuery

createNativeQuery

createNamedQuery de l’interface EntityManager

34
JPA (Java Persistance API) (12)

Queries: NamedQueries

Peut être mise dans n’importe quelle entité, mais on choisira le plus souvent
l’entité qui correspond à ce qui est renvoyé par la requête

On peut sauvegarder des gabarits de requête dans nos entités.

Ceci permet :

La réutilisation de la requête

D’externaliser la requête du code.

35
JPA (Java Persistance API) (13)

Queries: NamedQueries

36
JPA (Java Persistance API) (14)

Queries: NativeQueries

Une façon de faire des requêtes en SQL natif.

Sert principalement à avoir plus de contrôle sur les requêtes à la base de données

37
JPA (Java Persistance API) (15)

Transactions

Deux façons de mettre en place les transactions:


JTA : En utilisant la Java Transaction API
Resource-local : En utilisant le modèle de transaction du persistance manager

Les fournisseurs de persistance doivent supporter les transactions locales à une


ressource, mais ne sont pas obligés de supporter les transactions JTA

La démarcation des transactions est choisie par le développeur

Les contextes de persistance peuvent couvrir plusieurs transactions

38
JPA (Java Persistance API) (16)

Comparaison Hibernate/JPA
Points Communs

Offrir des services de persistance


Mappage Objet/Relationnel déclaratif
Adopter un langage de requêtes

Points de divergence

 JPA est une brique de base du standard Java EE 5


 Hibernate est un Framework alors que JPA est une spécification (API)
 Hibernate peut être utilisé comme fournisseur de persistance
 JPA utilise les annotations Java 5 pour assurer le mappage
 JPA est plus simple à mettre en œuvre que Hibernate (Entity Manager, pas de
fichiers de mappage, …)
39
Merci pour votre attention