06 Java EE Persistance
-
Upload
latifa-hadek -
Category
Documents
-
view
249 -
download
0
Transcript of 06 Java EE Persistance
-
8/2/2019 06 Java EE Persistance
1/12
07/01/2011
1
JEE (J2EE) & Les applicationsweb
Persistance des donnes
ABDELTIF ELBYED
Plan
1. Les services de persistance
Mapping objet/relationnel Bases Objet
2. JDBC
3. EJB
4. Hibernate
Persistance des donnes
La persistance des donnes dsigne le fait que ces dernires(les donnes) doivent exister mme aprs larrt du serveurJEE et au-del de la dure de lexploitation de lapplication
Il faut sauvegarder ltat courant des donnes manipulespar une application Donnes transcientes dans les programmes (tableaux, chaines de
caractres, etc.)
Utilisation ncessaire de base de donnes pour sauvegarder lesdonnes
Diffrents types de bases de donnes SGBDR (relationnels) : Oracle, PostgreSQL, etc.
SGBDO (objets) : Versant, O2, etc.
XML : EDI (Echange de D onnes Informatises)
Fichiers : Tableurs, fichiers texte, etc.
Problmatique
Lutilisation de bases de donnes objet nest pas encoreun choix pour les entreprises donnes existantes et vitales
mauvaise image des SGBD objet il existe des solutions hybrides : Oracle 8 par exemple
Actuellement, lutilisation des SGBD relationnels estincontournable dans les SI
Comment rendre persistants des objets dans une base
de donnes relationnelle ? adopter une stratgie pour choisir entre plusieurs solutions de
mise en correspondance objet-relationnel
effectuer des compromis entre puret dun modle etperformance
Contraintes
Objet = donnes (attributs) + comportement (mthodes)
Enregistrement = donnes
Les relations entre objets sont de diffrentes natures composition
hritage
Un modle objet est plus informatif quun modlerelationnel le passage objet vers relationnel ncessite de faire un choix parmi
plusieurs solutions
le passage relationnel vers objet nest pas souvent pertinent car
le modle objet rsultant est trs pauvre et dnatur
les objets identifis nont pas de comportement
Limpdance mismatch
De nombreuses questions se posent :
Comment convertir le rsultat dune requte SQL en objetsJAVA?
Comment rpercuter les modifications de ltat dun objetJAVA mapp?
Comment modliser les relations entre objets dans labase?
Comment modliser lhritage des objets dans la base?
Comment modliser les objets dont les donnes sontrparties dans plusieurs tables?
Quelle stratgie de cache utiliser pour viter des appelsrpts la base?
-
8/2/2019 06 Java EE Persistance
2/12
07/01/2011
2
Les solutions de Persistance
Lapproche JDBC (API, Design Pattern DAO)
LAPI et les types de drivers JDBC Framework iBatis
Lapproche composant Les EJB Entity
Les solutions de mapping Objet/Relationnel Open Source : Hibernate, OJB
Commerciales : TopLink, CocoBase
Lapproche standard JDO Open Source : JORM, TJDO, XORM, RI (Rfrence Implmentation)
Commerciales : JDO (Libelis, SolarMetric)
Lapproche full Object Base de donnes objet
Architecture de rfrence
Prsentation Modle Persistance
JSF
Struts
Struts Shale
Servlets/JSP
Applicationsclientes
EJB
SPRING
JavaBean
DAO, JDBC
EJB
Hibernate
Toplink
Connecteurs
Data-Access Objects Pattern
Permet de rester indpendant du type de la source dedonnes (SGBDR, Base Objets, Systme de fichiers)
Joue le rle dadaptateur entre le client et la source dedonnes
La stratgie daccs aux donnes ne doit pas dterminer lamodlisation des objets mtiers
Possibilit de changer la stratgie daccs aux donnes sansrcrire le code mtier
Approche lgre base sur le choix des bons Design Patterns
Le mapping Objet/Relationnel
Les avantages : Gain de productivit : vite lcriture de code bas niveau
Gain de performance : cache
Les inconvnients : Dans certains cas, les descripteurs de dploiement peuvent devenir
trs complexes
Prconis dans le cadre OLTP (On-Line Transaction Processing) sur des petits volumes de
donnes
Dconseill dans le cadre OLAP (On-Line Analytic Processing) sur des grands volumes de
donnes
Les bases de donnes objets
Extension de la machine virtuelle JAVA
Les instances sont stockes dans la base Avec leur champs
Les rfrences des objets sont galement stockes sous forme dobjetdans la base
Langage de requtage OQL
Avantages : Annule la problmatique de limpdance mismatch
Trs bonnes performances pour les parcours de graphes dobjets
Opportunits apportes par JDO
Inconvnients : March de niche
Gestion des traitements Batch
EJB: Enterprise Java Bean
Modle de composants mtiers, connu surtout dansle domaine de la persistance dobjets
La gestion de la persistance peut tre prise encharge par le bean lui mme (Bean Managed Persitence ou BMP)
le conteneur d'EJB (Container Managed Persistence ouCMP)
Inconvnients : Connu pour sa lourdeur
Difficile maintenir
Amlioration avec les EJB 3
-
8/2/2019 06 Java EE Persistance
3/12
07/01/2011
3
JDO: Java Data Object
JDO est une spcification de Sun
Version 1.0 a vu le jour en 2002 JDO a atteint une certaine maturit avec la version 2.0 en mars 2005
Depuis, JDO volue et devient un standard dans les solutions degestion de la persistance en Java
Nombreuses implmentations existantes : JPox ( implmentation derfrence de JDO), Castor JDO, etc.
Avantages Possibilit de persister les donnes vers tout type de systmes de
gestion de ressources (SGBDR, Systme de fichiers, etc.) La liaison avec la cible sera faite au dploiement de lapplication
Modlisation objet sans contrainte Supporte lhritage, les collections, etc
Gestion automatique du mapping des donnes
Prise en compte des transactions
Plan
1. Les services de persistance
2. JDBC3. EJB
4. Hibernate
Dfinition
Java DataBase Connectivity Specification API Java pour accder aux SGBDR (Systme de Gestion de Bases de
Donnes Relationnelles BD : ensemble de tables organises pour stocker des donnes qui
peuvent tre manipules par une ou plusieurs applications
Avantages Possibilit de changer de drivers sans modifier le code en cas de
changement de SGBDR Lors du passage du SGBDR MySQL vers le SGBDR PostegreSQL par
exemple Avec JDBC, il suffit de changer de driver et dutiliser celui adapt
PostgreSQL Avec PHP, il faut recoder lapplication car les mthodes invoques
sont spcifiques un SGBDR (mysql_connect(), mysql_close(),etc.)
Possibilit de se connecter plusieurs SGBDR en mme temps Bibliothques reposant sur SQL
Possibilit de slections, de jointures, de transactions, etc.
Dfinition
Version 3.0 fournie dans Java SE 6 Un programme crit avec JDBC envoie des requtes un
SGBDR et exploite le rsultat de ces requtes en Java. Objets et mthodes pour interagir avec les bases de donnes
(langage SQL) Package java.sql Package javax.sql
Quatre composants majeurs pilotes (ou drivers)
connexions requte (Statement) ensemble rsultat (ResultSet)
tapes pour la mise en uvre
1. Chargement du pilote
2. Connexion la base de donnes
3. Cration de la requte
4. Envoi de la requte
5. Rception dun ensemble rsultat
6. Extraction des donnes de lensemble rsultat
Chargement du pilote
Spcification du pilote charger
charge la classe dans la machine virtuelle
enregistre le pi lote dans le DriverManager
Ncessaire une seule fois par JVM
fait gnralement dans une mthode dinitialisation
Plusieurs pilotes peuvent tre chargs en mmetemps
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
1 -Chargement du pilote
2 - Connexion la base de donnes
3 - Cration de la requte
4 - Envoi de la requte5 -Rce ption dun ensemble rsultat
6 - Extraction des donnes
-
8/2/2019 06 Java EE Persistance
4/12
07/01/2011
4
Types de pilote JDBC (1/2)
Type 1 : Pont JDBC-ODBC traduit les appels lAPI JDBC en
appels lAPI ODBC
Open DataBase Connectivitypermet la communication entre clients pour bases de
donnes sous Windows et SGBD du march.
Type 2 : API native
traduit les appels lAPI JDBC en appels lAPI native de la base de donnes
Type 3 : protocole rseau
traduit les appels lAPI JDBC en appels un protocole rseau indpendant desSGBD
Type 4 : full JAVA
traduit les appels lAPI JDBC en appels un protocole rseau natif li au SGBD
Si lapplication doit tre installe sur plusieurs plates-forme, il est indispensabledutiliser un pilote de type 4
1 - Chargement du pilote
2 - Connexion la base de donnes
3 - Cration de la requte
4 - Envoi de la requte
5 - Rception dun ensemble rsultat
6 - Extraction des donnes
Types de pilote JDBC (2/2)
Les pilotes de type 1 et 2 introduisent une couche intermdiairede communication entre la couche JDBC et la base de donnes Prjudice lefficacit et aux performances de lapplication
On utilise souvent des pilotes de type 3 ou 4
Les pilotes de types 3 et 4 sont quivalent en termes deperformance
1 -Cha rgement du pilote
2 - Connexion la base de donnes
3 - Cration de la requte
4 - Envoi de la requte
5 -Rc eption dun ensemble rsultat
6 - Extraction des donnes
Connexion la base de donnes (1/2)
Identification de la base par une URLjdbc:subprotocol:subname
subprotocol : nom du pilote (mysql, db2, oracle, etc.)
subname : nom de la base (SAMPLE, etc.)
Exemplejdbc:db2:sample
Pour une base distante :jdbc:db2://mon_hote:port/sample
1 - Chargement du pilote
2 - Connexion la base de donnes
3 - Cration de la requte
4 - Envoi de la requte
5 - Rception dun ensemble rsultat
6 - Extraction des donnes
Connexion la base dedonnes (2/2)
La classe DriverManager est responsable de la gestion despilotes JDBC
Le gestionnaire de pilotes DriverManager cherche un piloteenregistr pouvant traiter lURL utilisateur (optionnel) : identifiant de lutilisateur
motDePasse (optionnel) : mot de passe utilisateur
Il demande une connexion au pilote trouv et la retourne auprogramme appelant
Une connexion reprsente une session avec une base dedonnes quil faudra fermer ds lors qu'elle nest plusutilise
String url = "jdbc:odbc:base";Connection conn = DriverManager.getConnection(url, utilisateur, motDePasse);
1 - Chargement du pilote
2 - Connexion la base de donnes
3 - Cration de la requte
4 - Envoi de la requte
5 - Rception dun ensemble rsultat
6 - Extraction des donnes
Conn.close();
Exemple de connexion
import java.sql.*
public void doGet(){
try{//Chargement du piloteClass.forName("com.ibm.db2.jdbc.app.DB2Driver");System.out.println("Pilote DB2 JDBC charg");
} catch (ClassNotFoundException e){e.printStackTrace();System.out.println("Erreur lors du chargement du Pilote DB2");}
try{// Creation de la connexionString url = "jdbc:db2:sample";Connection conn = DriverManager.getConnection(url,"user", "password");
System.out.println("Connexion oprationnelle");
} catch (SQLException e){
e.printStackTrace();
System.out.println("Erreur lors de ltablissement de la connexion");
}}
1 - Chargement du pilote
2 - Connexion la base de donnes
3 - Cration de la requte
4 - Envoi de la requte5 -Rc eption dun ensemble rsultat
6 - Extraction des donnes
Support des transactions (1/3)
Toutes les connexions JDBC sont rgles en modeauto-commit
chaque requte est excute dans une transaction spare
Pour crer une transaction comprenant plusieursrequtes, dsactiver le mode auto-commit
Connection.setAutoCommit(false)
1 - Chargement du pilote
2 - Connexion la base de donnes
3 - Cration de la requte
4 - Envoi de la requte5 - Rception dun ensemble rsultat
6 - Extraction des donnes
-
8/2/2019 06 Java EE Persistance
5/12
07/01/2011
5
Support des transactions (2/3)
Valider une transaction
Connection.commit()
Annuler une transaction
Connection.rollback()
1 - Chargement du pilote
2 - Connexion la base de donnes
3 - Cration de la requte
4 - Envoi de la requte
5 -Rc eption dun ensemble rsultat
6 - Extraction des donnes
Support des transactions (3/3)
Exemple
//Chargement du piloteconn = DriverManager.getConnection("jdbc:db2:SAMPLE");
// Dsactiver le mode Auto-Commitconn.setAutoCommit(false);
// Dbut dune nouvelle transaction ... // Excution de requtes SQLif (condition) {// Fin de transactionconn.commit();} else {// Fin de la transactionconn.rollback();}// Une nouvelle transaction commence
1 - Chargement du pilote
2 - Connexion la base de donnes
3 - Cration de la requte
4 - Envoi de la requte
5 - Rception dun ensemble rsultat
6 - Extraction des donnes
Cration de la requte
Crer un objet Statement
permet dexcuter une requte SQL
Par la suite, la ressource devra tre libre
Statement stmt = aConnection.createStatement();
1 - Chargement du pilote
2 - Connexion la base de donnes
3 - Cration de la requte
4 - Envoi de la requte
5 -Rc eption dun ensemble rsultat
6 - Extraction des donnes
stmt.close();
Envoi de la requte
Langage SQL
Requtes de type SELECT
executeQuery(requteSQL)
retourne un objet ResultSet
Requtes de type INSERT, UPDATE ou DELETE
executeUpdate(requteSQL)
retourne le nombre de lignes affectes ou 0
1 - Chargement du pilote
2 - Connexion la base de donnes
3 - Cration de la requte
4 - Envoi de la requte
5 - Rception dun ensemble rsultat
6 - Extraction des donnes
Exemple de requte
//Chargement du pilote et ouverture de la connexionClass.forName("com.ibm.db2.jdbc.app.DB2Driver");String url = "jdbc:db2:sample";Connection conn =DriverManager.getConnection(url,"admin", "azerty");
// Creation de la requete et executionStatement requete = conn.createStatement();ResultSet resultat =requete.executeQuery("SELECT lastName FROM EMPLOYEE");
1 - Chargement du pilote
2 - Connexion la base de donnes
3 - Cration de la requte
4 - Envoi de la requte5 - Rception dun ensemble rsultat
6 - Extraction des donnes
Type de requte :PreparedStatement (1/3)
Linterface PreparedStamement hrite deStatement
Excution dune requte SQL pr-compile vialinstanciation dun objet PreparedStatement
quand lobjet est cr, la requte SQL est envoye pourtre compile
le rsultat est stock pour pouvoir rpondre une ouplusieurs mthodes de type execute()
amliore les performances : permet lexcution de lamme requte plusieurs fois
passage de paramtres IN la requte
1 - Chargement du pilote
2 - Connexion la base de donnes
3 - Cration de la requte
4 - Envoi de la requte5 - Rception dun ensemble rsultat
6 - Extraction des donnes
-
8/2/2019 06 Java EE Persistance
6/12
07/01/2011
6
Type de requte :PreparedStatement (2/3)
Paramtres de la requte reprsents par des ? dans la requte SQL
numrots partir de 1 dans le sens de la lecture
valeurs dfinie par des mutateurs : set(position,)
String sql="SELECT lastName from EMPLOYEE WHERE SALARY > ? AND BONUS < ?";
PreparedStatement prepStmt = aConnection.prepareStatement(sql);
1 - Chargement du pilote
2 - Connexion la base de donnes
3 - Cration de la requte
4 - Envoi de la requte
5 - Rception dun ensemble rsultat
6 - Extraction des donnes
Type de requte :PreparedStatement (3/3)
Exemple
//Chargement du pilote et ouverture de la connexionClass.forName("com.ibm.db2.jdbc.app.DB2Driver");String url = "jdbc:db2:sample";Connection conn =DriverManager.getConnection(url,"admin", "azerty");
// Creation de la requete :// Selectionne tous les employs qui ont// un salaire > 20000 et une prime < 3000PreparedStatement requete =conn.prepareStatement("SELECT lastName FROM EMPLOYEE WHERE SALARY > ?AND BONUS < ?");requete.setFloat(1, 20000f);requete.setFloat(2, 3000f);
// Excution de la requteResultSet resultat =requete.executeQuery();
1 - Chargement du pilote
2 - Connexion la base de donnes
3 - Cration de la requte
4 - Envoi de la requte
5 - Rception dun ensemble rsultat
6 - Extraction des donnes
Type de requte :CallableStatement (1/3)
Excution de procdures SQL enregistres vialinstanciation dun objet CallableStatement, sous-classe de PreparedStatement
quand lobjet est cr, la requte dappel (call) est envoyepour tre compile
le rsultat est stock pour pouvoir rpondre une ouplusieurs mthodes de type execute
encore plus rapide que PreparedStatement
passage de paramtres IN et OUT
1 - Chargement du pilote
2 - Connexion la base de donnes
3 - Cration de la requte
4 - Envoi de la requte
5 - Rception dun ensemble rsultat
6 - Extraction des donnes
Type de requte :CallableStatement (2/3)
Paramtres de la requte
reprsents par des ? dans la requte SQL
IN valeur dfinie par des mutateur : set(position, )
OUT enregistrs via la mthode registerOutputParameter
valeur rcuprable par des accesseurs :
get
CallableStatement callStmt =aConnection.prepareCall("CALL GetNouveauSalaire(?, ?)");
1 - Chargement du pilote
2 - Connexion la base de donnes
3 - Cration de la requte
4 - Envoi de la requte
5 - Rception dun ensemble rsultat
6 - Extraction des donnes
Type de requte :CallableStatement (3/3)
Exemple
//Chargement du pilote et ouverture de la connexionClass.forName("COM.ibm.db2.jdbc.app.DB2Driver");String url = "jdbc:db2:sample";Connection conn =DriverManager.getConnection(url,"admin", "azerty");
// Calcule, mets a jour et recupere le nouveau salaire// Appelle GetNouveauSalaire(nom, salaire)// nom est un paramtre IN, salaire est un paramtre OUTCallableStatement requete =conn.prepareCall("Call GetNouveauSalaire(?, ?)");requete.setString(1,"Henri");requete.registerOutputParameter(2, java.sql.Types.DECIMAL, 0);
// Excution de la requte et rcupration de la valeurrequete.executeUpdate();BigDecimal nouveauSalaire = requete.getBigDecimal(2);
1 - Chargement du pilote
2 - Connexion la base de donnes
3 - Cration de la requte
4 - Envoi de la requte5 - Rception dun ensemble rsultat
6 - Extraction des donnes
Extraction des donnes (1/3)
Parcours de lobjet ResultSet
table de donnes
curseur pointant sur la range en cours
initialement, le curseur est plac avant la premire range
la mthode next() permet de passer la range suivante retourne false sil ny a plus de range
1 - Chargement du pilote
2 - Connexion la base de donnes
3 - Cration de la requte
4 - Envoi de la requte5 - Rception dun ensemble rsultat
6 -Extractio n des donnes
-
8/2/2019 06 Java EE Persistance
7/12
07/01/2011
7
Extraction des donnes (2/3)
Mthode Descript ion
next() Permetde passer la ligne suivante de ResultSet
previous() Permetde passer la ligne prcdente de ResultSet
first() Permetde se positionner sur la premire ligne
last() Permetde se positionner sur la dernire ligne
beforeFirst() Permet de se positionner avantla premire ligne
afterLast() Permet de se positionner aprs la dernire ligne
isFirst/
isBeforeFirs
t
Retourne si le positionnementest /avant la premire ligne
isLast/
isAfterLast
Retourne si le positionnementest /aprs la dernire ligne
absolute(index) Permet de se positionner lindex pass en paramtre
Close Permetde fermer le ResultSet
Mthodes de linterface ResultSet
1 - Chargement du pilote
2 - Connexion la base de donnes
3 - Cration de la requte
4 - Envoi de la requte
5 -Rc eption dun ensemble rsultat
6 -Extraction des donnes
Extraction des donnes (3/3)
Le ResultSet permet de rcuprer les colonnes de larange courante
en utilisant le nom ou lindex de la colonne
Les mthodes sont de la forme
get(int)
get(String)
exemple : String getString("prenom")
1 - Chargement du pilote
2 - Connexion la base de donnes
3 - Cration de la requte
4 - Envoi de la requte
5 - Rception dun ensemble rsultat
6 -Extractio n des donnes
Exemple dextraction de donnes
//Chargement du pilote et ouverture de la connexionClass.forName("com.ibm.db2.jdbc.app.DB2Driver");String url = "jdbc:db2:sample";Connection conn = DriverManager.getConnection(url,"admin", "azerty");
// Creation de la requete et executionStatement requete = conn.createStatement();ResultSet resultat = requete.executeQuery("SELECT * FROM EMPLOYEE");
// Parcours de lensemble rsultat et affichage
while (resultat.next()) {System.out.println(resultat.getString("prenom"));System.out.println(resultat.getDate("date"));}
// Libration des ressourcesresultat.close();requete.close();conn.close();
1 - Chargement du pilote
2 - Connexion la base de donnes
3 - Cration de la requte
4 - Envoi de la requte
5 -Rc eption dun ensemble rsultat
6 -Extraction des donnes
Correspondance des types
SQL Java SQL Java
CHAR
VARCHAR
LONGVARCHAR
NUMERIC
DECIMAL
BIT
TINYINT
SMALLINT
INTEGER
BIGINT
String
String
String
java.math.BigDecimal
java.math.BigDecimal
Boolean
Byte
Short
Int
long
REAL
FLOAT
DOUBLE
BINARY
VARBINARY
LONGVARBINARY
DATE
TIME
TIMESTAMP
float
Double
Double
byte[]
byte[]
byte[]
java.sql.Date
java.sql.Time
java.sql.Timestamp
Gestion des exceptions
La plupart des mthodes cites peuvent dclencher uneSQLException doit tre capture lintrieur dun bloc try/catch
volontairement non traite dans les exemples pour plus de clart
try {}
catch (SQLException e) {// traitement de lexception}
Exemple dextraction de donnes avec gestion desexceptions (1/2)
import java.sql.*
public void doGet(){Connection conn = null;try{
//Chargement du piloteClass.forName("com.ibm.db2.jdbc.app.DB2Driver");System.out.println("Pilote DB2 JDBC charg");
} catch (ClassNotFoundException e){e.printStackTrace();System.out.println("Erreur lors du chargement du Pilote DB2");}
try{// Creation de la connexionString url = "jdbc:db2:sample";Connection conn = DriverManager.getConnection(url,"user", "password");
System.out.println("Connexion oprationnelle");
// Creation de la requete et execution
Statement requete = conn.createStatement();
ResultSet resultat = requete.executeQuery("SELECT * FROM EMPLOYEE");
-
8/2/2019 06 Java EE Persistance
8/12
07/01/2011
8
Exemple dextraction de donnes avec gestion desexceptions (2/2)
// Parcours de lensemble rsultat et affichagewhile (resultat.next()){
System.out.println(resultat.getString("prenom"));
System.out.println(resultat.getDate("date"));
}
} catch (SQLException e){
e.printStackTrace();
System.out.println("Erreur lors de ltablissement de la connexion");
}
// Libration des ressources
try{
resultat.close();
requete.close();
conn.close();
} catch (SQLException e){
e.printStackTrace();
System.out.println("Erreur lors de la libration des ressources");
}
}
NB : La libration des ressources seffectue toujours dans lordre inverse de cration
Gestion des exceptions
Erreur de programmation mme si le code est fonctionnel Si une exception est lance par la mthode getConnexion ou par un
Statement ou un ResultSet, le code correspondant la libration desressources ne sera pas dclench
Pour faire en sorte que toutes les ressources soient libresquil y est exception ou non, il faut mettre le code delibration dans le bloc finally de la structuretry/catch/finally
Exemple dextraction de donnes avec gestiondes exceptions modifi
try{
// Creation de la connexion
String url = "jdbc:db2:sample";
Connection conn = DriverManager.getConnection(url,"user", "password");
System.out.println("Connexion oprationnelle");
// Creation de la requete et execution
Statement requete = conn.createStatement();
} catch (SQLException e){
e.printStackTrace();
System.out.println("Erreur lors de ltablissement de la connexion");
}
finally{
// Libration des ressources
try{resultat.close();
requete.close();
conn.close();
} catch (SQLException e){
e.printStackTrace();
System.out.println("Erreur lors de la libration des ressources");
}
}
Gestion des exceptions
Autre erreur de programmation mme si le code estfonctionnel Si une exception est lance par resultat.close() par exemple, le code
correspondant la fermeture de la requte et la fermeture de laconnexion ne sera pas dclench
Erreur courante mme avec des dveloppeurs confirms
Pour faire en sorte que toutes les ressources soient libres,il faut entourer chaque fermeture dun bloc try/catch
Exemple dextraction de donnes avec gestion desexceptions corrig
try{
} catch (SQLException e){
}
finally{
// Libration des ressourcesif(resultat!=null) {
try{resultat.close();
} catch (SQLException e){
e.printStackTrace();}
}
if(requete!=null) {
try{
requete.close();
} catch (SQLException e){
e.printStackTrace(); }
}
if(conn!=null) {
try{
conn.close();
} catch (SQLException e){
e.printStackTrace(); }
}
}
Gestion des exceptions
Code correct et fonctionnel mais programmation longue etlourde
Possibilit dutiliser une classe statique qui servira fermerles connexions Pas besoin dinstanciation, on utilise directement le nom de la classe
Pas besoin de constructeur dans la classe statique
-
8/2/2019 06 Java EE Persistance
9/12
07/01/2011
9
Exemple dextraction de donnes avec gestion desexceptions amlior (1/2)
import java.sql.Connexion;import java.sql.Statement;import java.sql.ResultSet;
public class OutilsFermetureBD{
// Fermeture dun ResultSetpublic static void fermerConnexion(ResultSet resultat){
if(resultat!=null) {try{
resultat.close();} catch (SQLException e){
e.printStackTrace();}}
}
// Fermeture dun Statementpublic static void fermerConnexion(Statement stat){
if(stat!=null) {try{
stat.close();} catch (SQLException e){
e.printStackTrace(); }}
}
Exemple dextraction de donnes avec gestion desexceptions amlior (2/2)
// Fermeture dune connexion
public static void fermerConnexion(Connexion conn)
{if(conn!=null) {
try{
conn.close();
} catch (SQLException e){
e.printStackTrace(); }
}
}
}
try{
} catch (SQLException e){}
finally{
// Libration des ressources
OutilsFermetureBD.fermerConnexion(resultat);
OutilsFermetureBD.fermerConnexion(requete);
OutilsFermetureBD.fermerConnexion(conn);}
Code dutilisation de la classe
Performances avec JDBC
Laccs aux bases de donnes constitue souvent un gouletdtranglement dans une application
Lefficacit de JDBC sera accrue par lutilisation des bons pilotes
la limitation du nombre des requtes au strict minimum
lutilisation de PreparedStatement et de CallableStatement lorsque
cest appropri La minimisation du trafic avec la base
HIBERNATE
A. ELBYED - JEE 52
Pourquoi utiliser des framework de persistance ?
Lutilisation directe de JDBC prsente de nombreuses limites Adhrence dans le code aux noms des Schmas, des Tables, des
colonnes
Rptitivit de lcriture des requtes SQL qui doivent toutes trecrites
volution et maintient du code difficile
Pas de fonctionnalit haut niveau (ex: liens entre enregistrements,chargement la demande, hritage, )
Problmes doptimisation (exemple: nombre de requtes sur lestransactions longues)
Lide Dfinir une fois pour toutes la correspondance entre le monde objet et
le monde relationnel puis laisser le framework gnrer lui mme lesrequtes SQL (INSERT, DELETE, SELECT, UPDATE)
Cette correspondance se nomme mapping Objet/Relationnel
Plan
1. Les services de persistance
2. JDBC
3. EJB
4. Hibernate
-
8/2/2019 06 Java EE Persistance
10/12
07/01/2011
10
La norme EJB
Base de donnes
Prsentation
Mtier
Persistance
La norme EJB
Les EJBs sont des composants Java qui rsident dans
le container EJB des serveur dapplication J2EE
Les EJBs sont des composants Distribus (accessibles distance, ex: RMI)
Portables
Persistants
Transactionnels
La dernire version des EJB est la version mise disposition depuis le 10/12/2009
EJB : Entreprise JavaBean
ServeurClient
Browser
Serveur 1
ServeurHTTP
JVM
HTTP
HTML Moteur deservlets
ServletsetJSP
RMI
RMI
Serveur 3JDBC
JVM
Container
EJBEJB
EJB
Serveur 2
JDBC
JVM
Container
EJBEJB
EJB
La notion de composant
Les composants sont des morceaux de programmedvelopps et dploys de faon indpendante etqui prsentent une interface permettant leurassemblage
analogie avec llectronique, notion de bote noire
La spcification EJB dtaille comment implmenterces composants
Objectifs des EJBs
Permettre aux dveloppeurs de se focaliser sur lalogique mtier sans avoir se proccuper desproblmes lis aux architectures distribues : Gestion des communications rseaux Gestion du multi-threading et des accs concurrents Gestion des transactions Gestion de la persistance
Offrir une solution standard indpendante des OS et des fournisseurs de serveur
dapplications
Couvrir les phases de dveloppement, dploiement etexploitation
Les diffrents types dEJB
Trois utilisations diffrentes de composants lapplication cliente accde la logique mtier rsidant sur le
serveur
lapplication cliente manipule un objet mtier reprsentant desdonnes persistantes
lapplication cliente dpose une demande de traitementasynchrone. Ce traitement sera ralis par un rcepteurasynchrone.
Trois types dEJB pour rpondre ces besoins Session Bean
Entity Bean
Message Driven Bean
-
8/2/2019 06 Java EE Persistance
11/12
07/01/2011
11
Prsentation des EJB Session
Reprsente une communication avec un client
Est accd par un seul client la fois Peut tre vu comme une extension du client dans certains
cas
Manipule gnralement des objets mtier persists
Peut participer une transaction, mais son tat nest pastransactionnel
Deux types : Sans tat (Stateless)
Avec tat (Stateful)
Architecture base dEJB Session
ClientClient
Autresystme
Etat de lasession
Session Bean
Container EJB
SGBD
Prsentation des EJB Entits
Reprsente des donnes persistantes ex : une entre dans une table dun SGBDR
Le bean reprsente une entit mtier (clients, commandes,etc.) et non pas une procdure. Ex : CommandEJB serait un bean entit, mais CommandVerifierEJB
serait un bean session.
A une dure de vie indpendante du serveur dEJB les donnes en base permettent de reconstruire lEJB mme si
linstance du bean sest termine ou que le serveur dEJB est arrt
Gr de faon transactionnelle Deux types : BMP (Bean Managed Persistence) CMP (Container Managed Persistence)
Concurrent des frameworks de persistance exemple: Hibernate
EJB Session et EJB Entits
ClientClient
Container EJB
Entity Bean SGBD
Architecture base dEJB Entits
ClientClient
Container EJB
Entity Bean SGBD
Etat de lasession
Session Bean
Prsentation des Message Driven Bean
Un Message Bean est un bean qui peut tre activ par unmessage provenant dun middleware orient message (ex :MQSeries) Rcepteur asynchrone suite lenvoi dun message sur une file
dattente ou propos dun sujet pr-dtermin
Utilisation de JMS (Java Messaging Service)
Traitements asynchrones de messages JMS
Lutilisateur demande un travail, mais nattend pas larponse Exemples
Demande dimpression
Demande de production de carte sim
-
8/2/2019 06 Java EE Persistance
12/12
07/01/2011
12
Architecture MDB
ClientClient
Container EJB
MDBQueue demessages
Appel asynchrone