Professional Documents
Culture Documents
Plan
1. Les services de persistance
Mapping objet/relationnel Bases Objet
Problmatique
Lutilisation de bases de donnes objet nest pas encore un 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 est incontournable 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 et performance
Contraintes
Objet = donnes (attributs) + comportement (mthodes) Enregistrement = donnes Les relations entre objets sont de diffrentes natures
composition hritage
Limpdance mismatch
De nombreuses questions se posent :
Comment convertir le rsultat dune requte SQL en objets JAVA? Comment rpercuter les modifications de ltat dun objet JAVA mapp? Comment modliser les relations entre objets dans la base? Comment modliser lhritage des objets dans la base? Comment modliser les objets dont les donnes sont rparties dans plusieurs tables? Quelle stratgie de cache utiliser pour viter des appels rpts la base?
07/01/2011
Architecture de rfrence
Lapproche composant
Les EJB Entity
Prsentation
Modle
Persistance
Le mapping Objet/Relationnel
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
Modle de composants mtiers, connu surtout dans le domaine de la persistance dobjets La gestion de la persistance peut tre prise en charge par
le bean lui mme (Bean Managed Persitence ou BMP) le conteneur d'EJB (Container Managed Persistence ou CMP)
Avantages :
Annule la problmatique de limpdance mismatch Trs bonnes performances pour les parcours de graphes dobjets Opportunits apportes par JDO
Inconvnients :
Connu pour sa lourdeur Difficile maintenir
Inconvnients :
March de niche Gestion des traitements Batch
07/01/2011
Plan
1. 2. 3. 4. Les services de persistance JDBC EJB Hibernate
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
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
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
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.
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
Chargement du pilote
07/01/2011
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
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
Les pilotes de type 1 et 2 introduisent une couche intermdiaire de 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 de performance
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
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
La classe DriverManager est responsable de la gestion des pilotes JDBC Le gestionnaire de pilotes DriverManager cherche un pilote enregistr pouvant traiter lURL
utilisateur (optionnel) : identifiant de lutilisateur motDePasse (optionnel) : mot de passe utilisateur
String url = "jdbc:odbc:base"; Connection conn = DriverManager.getConnection(url, utilisateur, motDePasse);
Exemple
jdbc:db2:sample Pour une base distante : jdbc:db2://mon_hote:port/sample
Il demande une connexion au pilote trouv et la retourne au programme appelant Une connexion reprsente une session avec une base de donnes quil faudra fermer ds lors qu'elle nest plus utilise Conn.close();
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
import java.sql.* public void doGet(){ try{
Exemple de connexion
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
//Chargement du pilote Class.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 connexion String 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"); } }
Pour crer une transaction comprenant plusieurs requtes, dsactiver le mode auto-commit
Connection.setAutoCommit(false)
07/01/2011
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
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
// Dbut dune nouvelle transaction ... // Excution de requtes SQL if (condition) { // Fin de transaction conn.commit(); } else { // Fin de la transaction conn.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
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
Envoi de la requte
Requtes de type INSERT, UPDATE ou DELETE Par la suite, la ressource devra tre libre
stmt.close();
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
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
//Chargement du pilote et ouverture de la connexion Class.forName("com.ibm.db2.jdbc.app.DB2Driver"); String url = "jdbc:db2:sample"; Connection conn = DriverManager.getConnection(url, "admin", "azerty"); // Creation de la requete et execution Statement requete = conn.createStatement(); ResultSet resultat = requete.executeQuery("SELECT lastName FROM EMPLOYEE");
Linterface PreparedStamement hrite de Statement Excution dune requte SQL pr-compile via linstanciation dun objet PreparedStatement
quand lobjet est cr, la requte SQL est envoye pour tre compile le rsultat est stock pour pouvoir rpondre une ou plusieurs mthodes de type execute() amliore les performances : permet lexcution de la mme requte plusieurs fois passage de paramtres IN la requte
07/01/2011
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
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
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<Type>(position, <Type>)
String sql="SELECT lastName from EMPLOYEE WHERE SALARY > ? AND BONUS < ?"; PreparedStatement prepStmt = aConnection.prepareStatement(sql);
Exemple
//Chargement du pilote et ouverture de la connexion Class.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 < 3000 PreparedStatement requete = conn.prepareStatement("SELECT lastName FROM EMPLOYEE WHERE SALARY > ? AND BONUS < ?"); requete.setFloat(1, 20000f); requete.setFloat(2, 3000f); // Excution de la requte ResultSet 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
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
Excution de procdures SQL enregistres via linstanciation dun objet CallableStatement, sousclasse de PreparedStatement
quand lobjet est cr, la requte dappel (call) est envoye pour tre compile le rsultat est stock pour pouvoir rpondre une ou plusieurs mthodes de type execute encore plus rapide que PreparedStatement passage de paramtres IN et OUT
Paramtres de la requte
reprsents par des ? dans la requte SQL IN
valeur dfinie par des mutateur : set<Type>(position, <Type>)
OUT
enregistrs via la mthode registerOutputParameter valeur rcuprable par des accesseurs : <Type> get<Type>
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
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
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
07/01/2011
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
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
Retourne si le positionnement est /aprs la dernire ligne Permet de se positionner lindex pass en paramtre Permet de fermer le ResultSet
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
//Chargement du pilote et ouverture de la connexion Class.forName("com.ibm.db2.jdbc.app.DB2Driver"); String url = "jdbc:db2:sample"; Connection conn = DriverManager.getConnection(url, "admin", "azerty"); // Creation de la requete et execution Statement 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 ressources resultat.close(); requete.close(); conn.close();
07/01/2011
Pour faire en sorte que toutes les ressources soient libres quil y est exception ou non, il faut mettre le code de libration dans le bloc finally de la structure try/catch/finally
Pour faire en sorte que toutes les ressources soient libres, il faut entourer chaque fermeture dun bloc try/catch
07/01/2011
HIBERNATE
A. ELBYED - JEE
52
Plan
1. 2. 3. 4. Les services de persistance JDBC EJB Hibernate
Lide
Dfinir une fois pour toutes la correspondance entre le monde objet et le monde relationnel puis laisser le framework gnrer lui mme les requtes SQL (INSERT, DELETE, SELECT, UPDATE) Cette correspondance se nomme mapping Objet/Relationnel
07/01/2011
La norme EJB
Prsentation
La norme EJB
Les EJBs sont des composants Java qui rsident dans le container EJB des serveur dapplication J2EE Les EJBs sont des composants
Mtier
Persistance
Base de donnes
La dernire version des EJB est la version mise disposition depuis le 10/12/2009
La notion de composant
Les composants sont des morceaux de programme dvelopps et dploys de faon indpendante et qui prsentent une interface permettant leur assemblage
Client
HTTP
Browser
HTML
Serveur HTTP
Servlets et JSP
RMI
EJB EJB EJB JVM Serveur 3 Container EJB EJB EJB JVM
J D B C
Serveur
J D B C
10
07/01/2011
SGBD
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.
Client
Client
Entity Bean
SGBD
Container EJB
Traitements asynchrones de messages JMS Lutilisateur demande un travail, mais nattend pas la rponse
Client
Container EJB
Exemples
Demande dimpression Demande de production de carte sim
11
07/01/2011
Architecture MDB
Appel asynchrone
Client
Client
Queue de messages
MDB
Container EJB
12