Infotronique ITR2 Semaine du 16/02 au 27/02/2009 TP partie 1 Mapping Objet Relationnel Un compte rendu de ce TP est à rendre avant le 27/02/2009.



Documents pareils
Java DataBaseConnectivity

TP Programmation Java / JDBC / Oracle

Programmation d application Bases de données avec Java

Introduction à JDBC. Accès aux bases de données en Java

La persistance des données dans les applications : DAO, JPA, Hibernate... COMPIL 2010 francois.jannin@inp-toulouse.fr 1

Java et les bases de données: JDBC: Java DataBase Connectivity SQLJ: Embedded SQL in Java. Michel Bonjour

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Accès aux bases de données

Java et les bases de données

OpenPaaS Le réseau social d'entreprise

Application BdD et JDBC. Introduction 1/28. I Dans tout les cas, une seule problématique. I Quelques alternatives :

Tutoriel d installation de Hibernate avec Eclipse

Compte Rendu d intégration d application

Types d applications pour la persistance. Outils de développement. Base de données préexistante? 3 modèles. Variantes avec passerelles

Application web de gestion de comptes en banques

Création d une application JEE

JDBC le langage Java XVI-1 JMF

Développement Web - Object Relational Mapping and Hibernate

Connexion à SQL Server 2005 à partir du serveur d application SJSAS 9 Utilisation d une interface JDBC

La gestion de la persistance avec Hibernate. Hibernate et la gestion de persistance. La gestion de la persistance (1/2) Introduction

PHP. Bertrand Estellon. 26 avril Aix-Marseille Université. Bertrand Estellon (AMU) PHP 26 avril / 214

Notes de cours : bases de données distribuées et repliquées

La base de données XML exist. A. Belaïd

Alfstore workflow framework Spécification technique

Mise en oeuvre d'une base de données mono-utilisateur avec SQLite

Information utiles. webpage : Google+ : digiusto/

Formation Webase 5. Formation Webase 5. Ses secrets, de l architecture MVC à l application Web. Adrien Grand <jpountz@via.ecp.fr> Centrale Réseaux

Architecture JEE. Objectifs attendus. Serveurs d applications JEE. Architectures JEE Normes JEE. Systèmes distribués

Dialogue avec la base de données

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

JDBC JDBC. Java DataBase Connectivity

Bases de données et sites WEB

COMMANDES SQL... 2 COMMANDES DE DEFINITION DE DONNEES... 2

Auto-évaluation Programmation en Java

FileMaker 10. Guide ODBC et JDBC

Exploitation de bases de données relationnelles et orientées objet IFT287

Mysql. Les requêtes préparées Prepared statements

Module Administration BD Chapitre 1 : Surcouche procédurale dans les SGBDS

TP1 : Initiation à Java et Eclipse

CREATION WEB DYNAMIQUE

Remote Method Invocation (RMI)

Programme «Analyste Programmeur» Diplôme d état : «Développeur Informatique» Homologué au niveau III (Bac+2) (JO N 176 du 1 août 2003) (34 semaines)

Auto-évaluation Aperçu de l architecture Java EE

PHP 4 PARTIE : BASE DE DONNEES

Compte-rendu de projet de Système de gestion de base de données

4. Utilisation d un SGBD : le langage SQL. 5. Normalisation

Institut Supérieur de Gestion. Cours pour 3 ème LFIG. Java Enterprise Edition Introduction Bayoudhi Chaouki

CATALOGUE FORMATIONS DOMAINE Bases de données

MySQL avec Mac OS X. Quelques manipulations avec le terminal sont nécessaires si une version de MySQL est déjà lancée:

Logiciel de gestion de caisse et d ardoises

Bases de données Page 1 de 11. Bases de données. Prof. : Dzenan Ridjanovic

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Plan du cours. Historique du langage Nouveautés de Java 7

TD3: tableaux avancées, première classe et chaînes

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

APIs de table pour SQL Server

Mise en œuvre des serveurs d application

TP Contraintes - Triggers

Bases de Données relationnelles et leurs systèmes de Gestion

Construire une base de donnée pour bibliothèque

Premiers Pas en Programmation Objet : les Classes et les Objets

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

1. Langage de programmation Java

PHP. PHP et bases de données

ORACLE 10G DISTRIBUTION ET REPLICATION. Distribution de données avec Oracle. G. Mopolo-Moké prof. Associé UNSA 2009/ 2010

Paradox 9. Guide de l utilisateur jpdox Web Utilities

Les frameworks au coeur des applications web

Licence de MIDO - 3ème année Spécialités Informatique et Mathématiques Appliquées

SGBDR. Systèmes de Gestion de Bases de Données (Relationnelles)

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

1. Installation d'un serveur d'application JBoss:

Cours 1: Java et les objets

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Programmation en Java IUT GEII (MC-II1) 1

CQP Développeur Nouvelles Technologies (DNT)

JAVA 8. JAVA 8 - Les fondamentaux du langage. Les fondamentaux du langage Java. Avec exercices pratiques et corrigés JAVA 8 29,90.

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

RMI le langage Java XII-1 JMF

Présentation du module Base de données spatio-temporelles

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Bases de données avancées Introduction

Bases de données cours 1

Refonte front-office / back-office - Architecture & Conception -

Les bases de données

Compiere. Installation et adaptation avec Hibernate. Travail de Bachelor. Thibaut Schorderet Septembre 2005

//////////////////////////////////////////////////////////////////// Administration bases de données

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Gestion de stock pour un magasin

Module BD et sites WEB

A.E.C. GESTION DES APPLICATIONS TECHNOLOGIE DE L'INFORMATION LEA.BW

Programmer en JAVA. par Tama

Pratique et administration des systèmes

Connectivité aux bases de données Java (JDBC)

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Sécurité des sites Web Pas un cours un recueil du net. INF340 Jean-François Berdjugin

Transcription:

Infotronique ITR2 Semaine du 16/02 au 27/02/2009 TP partie 1 Mapping Objet Relationnel Un compte rendu de ce TP est à rendre avant le 27/02/2009. 1 Connexion client serveur JDBC Une connexion JDBC met en œuvre les éléments suivants : chargement du driver : différentes fonctionnalités sont offertes par les différents drivers JDBC d Oracle. Le driver OCI utilise un protocole spécifique et nécessite l installation des clients Oracle (librairies) sur les machines qui exécutent la partie applicative. Le driver thin utilise le protocole de communication standard Oracle Net et ne requiert que le pilote JDBC sous la forme d un fichier.zip ou.jar. Les différentes fonctions sont réparties dans deux types de packages : ceux préfixés par java sont les packages standard, ceux préfixés par oracle sont les packages propres à Oracle incluant des extensions propriétaires du protocole JDBC. Le tableau 1 récapitule les fonctionnalités fournies par les différents packages. Directive d import import java.sql.* ; import oracle.jdbc.* ; import oracle.jdbc.pool.* ; import oracle.sql.* ; Fonctionnalités package JDBC standard package JDBC contenant les extension d Oracle package OracleDataSource package contenant les types étendus TAB. 1 Directive import et fonctionnalités connexion à la base : utiliser la méthode getconnection(url, user, password) de la classe DriverManager. création d un statement : l objet Statement (environnement de connexion) possède les méthodes nécessaires pour réaliser les requêtes sur la base à laquelle il est associé. Il existe 3 types de Statement : 1. Statement : requêtes statiques 2. PreparedStatement : requêtes dynamiques précompilées analogues aux curseurs paramétrés de PL/SQL 3. CallableStatement : procédures stockées Pour les types 2 et 3, le passage de paramètres se fait par une méthode set : ps.setxxx(numéro colonne, valeur) Exemple : PreparedStatement ps = connect.preparestatement( "SELECT * FROM etudiant WHERE numero=?"); ps.setint(1, 34); exécution une requête : il existe 3 types d exécutions 1. executequery() : pour les requêtes SELECT qui retournent un ResultSet ; 2. executeupdate() : pour les requêtes INSERT, UPDATE, DELETE, CREATE TABLE, DROP TABLE qui retournent un entier (nombre de tuples traités) ; 3. execute() : pour les procédures stockées. traitement des données renvoyées : l objet ResultSet permet d accéder aux attributs des tuples retourné par l exécution executequery(). Un ResultSet se parcourt itérativement ligne par ligne au moyen de la méthode next() qui retourne false si le dernier tuple a été lu, true sinon. Pour lire la première ligne on doit appeler une fois next(). L accès aux valeurs des attributs se fait par les méthodes de la forme getxxx() ou GetObject(int col). Eric Leclercq Département IEM http://ufrsciencestech.u-bourgogne.fr 1

Exemple : val = rs.getint(3); // accès à la 3ème colonne qui est un entier. Les métadonnées : la méthode getmetadata() permet d obtenir des informations sur les types de données d un ResulSet, elle renvoie des ResultSetMetaData on peut connaître entre autres : le nombre de colonnes : getcolummncount() le nom d une colonne : getcolumnname(int col) le type d une colonne : getcolumntypename(int col) la précision d une colonne : getprecision(int col) Les trois programmes suivants présentent l enchaînement des méthodes permettant d établir une connexion à une instance. Le premier est écrit avec le méthodes de l API JDBC standard, le second permet de traiter des implémentation non standard des JDK, le troisième utilise une classe wrapper proposée par Oracle pour établir une connexion de façon plus concise. C est ce dernier mode de connexion qui est utilisé pour la création de pools de connexions. Cette construction permet de définir une connexion physique et de lui associer plusieurs connexions logiques la partageant, ce qui a pour effet d augmenter les performances du protocole lors de l ouverture de connexions multiples. 1 import java.sql.*; class testel2{ 3 static private Connection conn; static final String query = "select Essai JDBC : sysdate from dual"; 5 public static void main(string args[]) throws SQLException{ try{ 7 Class.forName("oracle.jdbc.driver.OracleDriver"); conn = DriverManager.getConnection( 9 "jdbc:oracle:thin:@machine:port:sid", "login", 11 "passwd"); }catch(exception e){e.printstacktrace();} 13 Statement stmt = conn.createstatement(); ResultSet rset = stmt.executequery(query); 15 while (rset.next()) System.out.println(rset.getString(1)); 17 } } Listing 1 Connexion avec les méthodes standard import java.sql.*; 2 import oracle.jdbc.*; class testel1{ 4 static final String connect_string = "jdbc:oracle:thin:login/passwd@machine:port:base"; 6 static final String query = "select Essai JDBC : sysdate from dual"; public static void main(string args[]) throws SQLException{ 8 Connection conn; DriverManager.registerDriver(new oracle.jdbc.oracledriver()); 10 conn = DriverManager.getConnection(connect_string); Statement stmt = conn.createstatement(); 12 ResultSet rset = stmt.executequery(query); while (rset.next()) 14 System.out.println(rset.getString(1)); } 16 } Listing 2 Connexion avec les méthodes standard pour JDK spécifique import java.sql.*; 2 import oracle.jdbc.*; import oracle.jdbc.pool.oracledatasource; 4 class testel{ public static void main (String args[]) throws SQLException{ 6 OracleDataSource ods = new OracleDataSource(); ods.seturl("jdbc:oracle:thin:login/passwd@machine:port:sid"); 8 Connection conn = ods.getconnection(); // Création d un objet Oracle DatabaseMetaData Eric Leclercq Département IEM http://ufrsciencestech.u-bourgogne.fr 2

10 DatabaseMetaData meta = conn.getmetadata(); // Récupération d information sur le driver 12 System.out.println("driver JDBC " + meta.getdriverversion()); } 14 } Listing 3 Connexion avec wrapper 2 Les principes généraux d Hibernate Le développement d applications reposant sur les technologies internet oblige à travailler avec différents paradigmes de programmation comme par exemple le paradigme objet des langages de programmation orientés objet et la notion de table des bases de données relationnelle. Hibernate est un outil de mapping objet relationnel pour les applications Java. Le terme mapping objet/relationnel (ORM) décrit une technique consistant à mettre en correspondance la représentation des objet manipulés par les applications (objets métier) et leur représentation dans une base de données relationnelle définie par un schéma SQL. La base de données permet alors d assurer la persistance des propriétés des objets. FIG. 1 Architecture générale d Hibernate 3 Élements techniques Hibernate est un ensemble de librairies fournissant un framework pour la mise en place de mapping objetrelationnel. Hibernate est développé en open source et distribué sous licence GNU. Hibernate ne fournit pas seulement un mapping objet-relationnel mais également un mécanisme et un langage de requêtes. Ainsi, il peut générer dynamiquement des requêtes SQL et décharger les développeur d une parties des tâches de gestion des resultsets propres à JDBC. Les objets metier Java développés en s appuyant sur un couche de persitance comme Hibernate permettent un indépendance vis à vis du SGBD. Une première vue de haut niveau de l architecture d Hibernate montre que Hibernate vient s intercaler entre l application et la base de données pour proposer les services de persistances. Il utilise pour cela une connexion à la base de données (driver), des éléments de configuration contenant des propriétés nécessaires à son fonctionnement et des fichiers de mapping en XML pour établir les correspondances tables objets Java. Les éléments essentiels au fonctionnement de la couche de persistence sont : Session (org.hibernate.session) : représente une conversation entre l application et l entrepôt de persistance, encapsule une connexion JDBC, fabrique des objets Transaction. Objet mono-threadé, à durée de vie courte, représentant une conversation entre l application et l entrepôt de persistance. Contient un cache de premier niveau et obligatoire des objets persistants. SessionFactory (org.hibernate.sessionfactory) : fabrique des session et un client de ConnectionProvider. Cache immuable (threadsafe) des correspondances (mappings) vers une (et une seule) base de données. Coûteuse à construire car implique l analyse des fichiers de configuration. Construite à partir d un objet Configuration. Transaction (org.hibernate.transaction) : 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 autres ; Eric Leclercq Département IEM http://ufrsciencestech.u-bourgogne.fr 3

ConnectionProvider (org.hibernate.connection.connectionprovider) : fabrique des pools de connexion JDBC, abstrait l application de la Datasource ou du DriverManager sous-jacent ; TransactionFactory (org.hibernate.transactionfactory) : fabrique des instances de Transaction. Les types d objets manipulés sont les suivants : objets et collections persistants : sont en général les objets de type JavaBean (ou POJOs), 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. objets et collections transients : instances de classes persistantes qui ne sont actuellement pas associées à une Session. Elles ont pu être instanciées par l application et ne pas avoir (encore) été rendues persistantes s ou elles ont pu être instanciées par une Session fermée. Une instance d une classe persistante peut être dans l un des trois états de persistance suivants : passager/temporaire (transient) : instance non associée (et n ayant jamais été associée) à un contexte de persistance, instance sans identité persistante c est-à-dire sans valeur de clé primaire persistant : l instance est associée au contexte de persistance, elle possède une valeur de clé primaire et, peut-être, un enregistrement correspondant dans la base. Pour un contexte de persistance particulier, Pour un contexte de persistance particulier, garantie par Hibernate de l équivalence entre l identité persistante et l identité Java. détaché : l instance a été associée au contexte de persistance mais ce contexte a été fermé, ou l instance a été sérialisée vers un autre processus. Elle possède une identité persistante et peut-être un enregistrement correspondant dans la base. Pour des instances détachées, Hibernate ne donne aucune garantie sur la relation entre l identité persistante et l identité Java Les librairies nécessaires au TP sont : Bibliothèques Hibernate (en plus de hibernate3.jar) : antlr.jar : ANTLR (Another Tool for Language Recognition), indispensable à l exécution cglib-full.jar : générateur de bytecode CGLIB, indispensable à l exécution asm.jar, asm-attrs.jars : outils de manipulation de bytecode Java, requis si utilisation de CGLIB commons-collections.jar : bibliothèques du projet Apache Jakarta Commons pour manipuler les collections, indispensable à l exécution commons-logging.jar : bibliothèques du projet Apache Jakarta Commons pour utiliser la journalisation de façon transparente, indispensable à l exécution ehcache.jar : utilisé pour gérer le cache de second niveau si aucun autre fournisseur de cache n est paramètré, optionnel jta.jar : API JTA strandard, requis pour les applications s exécutant en dehors d un serveur d applications dom4j.jar : Aanalyseur Syntaxique de configuration XML et de mapping, indispensable à l exécution log4j.jar : mécanisme de journalisation (log) sous-jacent pouvant être utilisé par Commons Logging, optionnel Les éléments à modifier sont : hibernate.cfg.xml : fichier de configuration global contenant : les paramètres de connexion à la base de données (pilote, login, mot de passe, url, etc.) le dialecte SQL de la base de données la gestion de pool de connexions le niveau de détails des traces Pour chaque classe persistante réaliser : ClassePersistante.java : implémentation POJO (Plain Old Java Objects) de la classe ClassePersistante.hbm.xml : fichier XML de correspondances (mapping) ClassePersistanteHome.java : implémentation du DAO (Data Access Object) pour l isolation avec la couche de persistance, optionnel ClassePersistante.sql : code SQL de création de la ou les relations correspondantes, optionnel, réalisé dynamiquement par Hibernate Se connecter sur le site http://www.hibernate.org/hib_docs/v3/reference/fr/html/tutorial. html pour avoir une description du mode opératoire et télécharger Hibernate. 4 Exemple Nous utiliserons comme exemple une petite application permettant de gérer une liste d étudiants, les cours auxquels ils sont inscrits ainsi que les salles attribuées à chaque cours. Dans un premier temps, réaliser un diagramme de classes UML puis un diagramme de classes spécifique au modèle relationnel. Le diagramme de Eric Leclercq Département IEM http://ufrsciencestech.u-bourgogne.fr 4

classe initial comporte 3 classes et 2 associations. Le diagramme de classes UML représente la vue du monde réel. La vue côté logiciel est développée selon : l axe base de données : un diagramme de classes spécifique fait apparaître les identifiants, les identifiants externes, les types de chaque attribut (spécifique au SGBD), les séquences éventuelles, les classes associations. Les associations disparaissent et sont traduites par les identifiants externes et evéntuellement des triggers. l axe programmation objet (Java) : un diagramme de classe spécifique au langage de programmation retenu (ici Java) faissant apparaître les types des propriétés. Les associations disparaissent au profit de listes de références ou de tableaux de références. 4.1 Les classes du notre modèle de données La première étape consite à créer les classes Java du modèle de données. On crée tout d abord une classe Java respectant les directives JavaBeans c est-à-dire une méthode get et une méthode set pour chaque attribut, un constructeur public sans argument. Un exemple de classe Etudiant est donné ci dessous. public class Student{ 2 private int id; private String firstname; 4 private String lastname; private int semester; 6 private Collection courses; 8 public int getid(){ return id; 10 } 12 public void setid(int id){ this.id = id; 14 } à compléter... Il n y a pas d interface spécifique à implémenter ni classe à étendre, Hibernate fonctionne avec n importe quel type d objet et ne nécessite aucune étape de compilation supplémentaire. 4.2 Décrire les objets dans un fichier HBM La seconde étape consiste à décrire les objets dans un fichier HBM (hibernate-mapping) c est-à-dire pour chaque objet, les attributs qui doivent persister. 1 <hibernate-mapping> 2 <class name="example.student" table="student"> 3 <id name="id" column="id"> 4 <generator class="native"/> 5 </id> 6 <property name="firstname"/> 7 <property name="lastname"/> 8 <property name="semester"/> 9 <set name="courses" table="student_course" lazy="true"> 10 <key column="studentid"/> 11 <many-to-many class="example.course" column="courseid"/> 12 </set> 13 </class> 14 </hibernate-mapping> Les lignes 3 à 5 définissent l identifiant de l objet, ici id. Il est possible de préciser que l on délègue la gestion de l identifiant à la base de données La balise <property> permet de définir les attributs simples (types primitifs de Java sont supportés ainsi que String et Date). Les lignes 9 à 12 définissent enfin entre la classe Student et la classe Course. Le paramètre lazy permet de ne charger les objets Course que lorsque l application en fait explicitement la demande. Eric Leclercq Département IEM http://ufrsciencestech.u-bourgogne.fr 5

5 Manipulation des objets Une fois le mapping décrit, il est possible de manipuler les objets. Les fonctionnalités courantes CRUD (create, read, update, delete) sont disponibles. 1 // Création Student student = new Student(); 3 student.setfirstname("toto"); student.setlastname("durant"); 5 student.setsemester(1); 7 // Sauvegarde Session session = HibernateManager.getSession(); 9 Transaction transaction = session.begintransaction(); session.save(student); 11 transaction.commit(); 13 Collection courses = new HashSet(); 15 courses.add(coursea); student.setcourses(courses); 17 session.update(student); 1. Installer et configurer Hibernate sur votre compte pour le faire fonctionner avec une base Oracle. Complèter les programmes donnés en exemple : implanter la classe étudiant, la classe cours et l association entre étudiant et cours. 2. Que se passe-t-il lorsque deux programmes accèdent au même objet? 3. Comment gérer le fait qu un programme puisse enregistrer l état d un ou plusieurs objets les manipuler et les sauver pendant qu un autre programme aura fait la même choses sur un autre ensemble d objets dont certains sont commun avec le premier programme. Attention il ne s agit pas d un problème de concurrence habituel. 4. Faire de même pour la gestion de commandes dans certains produits peuvent être achétés par lots. Traduire des association 1 to 1, 1 to many, et many to many. Eric Leclercq Département IEM http://ufrsciencestech.u-bourgogne.fr 6