T.P. 3 Base de données, JDBC et Mapping Objet-relationnel



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

Groupe Eyrolles, 2005, ISBN :

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

Tutoriel d installation de Hibernate avec Eclipse

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

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

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

OpenPaaS Le réseau social d'entreprise

Application web de gestion de comptes en banques

BIRT (Business Intelligence and Reporting Tools)

Java DataBaseConnectivity

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)

Web Tier : déploiement de servlets

Etude de cas : PGE JEE V2

Olivier Mondet

Création d une application JEE

CREATION WEB DYNAMIQUE

DEVAKI NEXTOBJET PRESENTATION. Devaki Nextobjects est un projet sous license GNU/Public.

TP JEE Développement Web en Java. Dans ce TP nous commencerons la programmation JEE par le premier niveau d une application JEE : l application web.

Accès aux bases de données

PHP 5. La base de données MySql. A. Belaïd 1

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

Modélisation et Gestion des bases de données avec mysql workbench

Programmation d application Bases de données avec Java

LES ACCES ODBC AVEC LE SYSTEME SAS

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

Création d un service web avec NetBeans 5.5 et SJAS 9

Java - MySQL. Code: java-mysql

TP Programmation Java / JDBC / Oracle

IFT287 Exploitation de base de données relationnelles et orientées objet. Laboratoire Mon premier programme Java en Eclipse

La programmation orientée objet Gestion de Connexions HTTP Manipulation de fichiers Transmission des données PHP/MySQL. Le langage PHP (2)

Construire une base de donnée pour bibliothèque

Comment Connecter une Base de Données MySQL via un Driver JDBC Avec OpenOffice.org

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

TUTORIEL D INSTALLATION D ORACLE ET DE SQL DEVELOPPER TUTORIEL D INSTALLATION D ORACLE...1 ET DE SQL DEVELOPPER...1

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

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

Compte Rendu d intégration d application

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

Gestion de stock pour un magasin

Extension SSO Java. Cette note technique décrit la configuration et la mise en œuvre du filtre de custom SSO Java.

AFTEC SIO 2. Christophe BOUTHIER Page 1

Architecture Orientée Service, JSON et API REST

Le langage SQL pour Oracle - partie 1 : SQL comme LDD

Introduction à Eclipse

Gestion de base 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:

Attaques applicatives

Procédures Stockées WAVESOFT ws_sp_getidtable Exemple : ws_sp_getnextsouche Exemple :... 12

Test de HSQLDB et Comparatif avec Sqlite

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

Service Systèmes et Réseaux

Utilisation de GCM (Google Cloud Messaging) pour Android. Partie préliminaire éventuelle : Création d'un AVD lisant GCM

JavaServer Pages (JSP)

Installation FollowMe Q server

Guide d installation des licences Solid Edge-NB RB

Volet de visualisation

Configurer la supervision pour une base MS SQL Server Viadéis Services

Documentation CAS à destination des éditeurs

Déploiement d'une application Visual Studio Lightswitch dans Windows Azure.

Business Sharepoint Contenu

Système Normalisé de Gestion des Bibliothèques -SYNGEB : version Réseau-

TP Contraintes - Triggers

COMMENT INSTALLER LE SERVEUR QIPAIE

1. Base de données SQLite

Package Java.util Classe générique

Historisation des données

1-Introduction 2. 2-Installation de JBPM 3. 2-JBPM en action.7

Pratique et administration des systèmes

Guide d'installation NSi Mobile. Version 6.2

Guide de déploiement

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

Guide de mise à jour BiBOARD

Aspects techniques : guide d interfaçage SSO

Assistance à distance sous Windows

Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa Novembre 2008

API04 Contribution. Apache Hadoop: Présentation et application dans le domaine des Data Warehouses. Introduction. Architecture

I4 : Bases de Données

Corrigé de l'atelier pratique du module 3 : Récupération d'urgence

Création et Gestion des tables

WebSpy Analyzer Giga 2.1 Guide de démarrage

COURS 5 Mettre son site en ligne! Exporter son site avec WordPress Duplicator Installer un logiciel FTP Faire le suivi des visites de son site avec

Avant-propos 1. Avant-propos Organisation du guide À qui s'adresse ce guide?...4

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

A DESTINATION DES SERVICES TIERS. Editeurs d applications et ressources pédagogiques connectées à l ENT

FORMATION PcVue. Mise en œuvre de WEBVUE. Journées de formation au logiciel de supervision PcVue 8.1. Lieu : Lycée Pablo Neruda Saint Martin d hères

UNIVERSITE DE CONSTANTINE 1 FACULTE DES SIENCES DE LA TECHNOLOGIE DEPARTEMENT D ELECTRONIQUE 3 ème année LMD ELECTRONIQUE MEDICALE

Les Triggers SQL. Didier DONSEZ. Université de Valenciennes Institut des Sciences et Techniques de Valenciennes

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Objectifs du TP : Initiation à Access

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

Supervision et infrastructure - Accès aux applications JAVA. Document FAQ. Page: 1 / 9 Dernière mise à jour: 15/04/12 16:14

Guide Utilisateur pour accès au réseau WiFi sécurisé 802.1X

JOnAS Day 5.1. Outils de développements

Les Utilisateurs dans SharePoint

Network Camera. Camera. Network. Guide d installation v1.1. Installation Guide v R1.1. Anglais. Français. Espagnol. Allemand R1.

Architectures client/serveur

Transcription:

EPITA Ala Eddine BEN SALEM App-Ing2 J2EE T.P. 3 Base de données, JDBC et Mapping Objet-relationnel L'objectif de ce TP est de vous faire pratiquer l'api JDBC qui permet d'accéder à une base de données relationnel à partir d'un composant Java J2EE. Dans la première partie du TP, une base de données Derby sera créée à l'aide d'eclipse. L'objectif de la deuxième partie est de mettre en place un site web pour l'administration et la commande de pizzas : une pizza est déterminée par son type et son prix à l'unité. un stock (quantité) est donné pour chaque type de pizza une commande se définit par un type de pizza, une quantité, le total de la commande, l'email de confirmation de la commande. 1. Base de données Eclipse contient par défaut la base de données Derby développée par Sun. Derby permet de stocker les tables de la base de données directement dans le système de fichiers (sous forme d'un dossier) sans passer par la configuration du serveur de base de données. 1.1. Télécharger le driver JDBC d'une base de données Derby: URL: http://archive.apache.org/dist/db/derby/db-derby-10.2.1.6/db-derby-10.2.1.6-lib.zip (ou db-derby-10.2.1.6-lib.tar.gz) Dézipper db-derby-10.2.1.6-lib.zip dans «C:\», le chemin obtenu du driver est: «C:\db-derby-10.2.1.6-lib\lib\derby.jar». 1.2. Configurer un driver Derby dans Eclipse: Sélectionner: Eclipse Préférences Data Management Connectivity Driver Definitions. Cliquer sur le bouton «Add» (à droite):

Une boite de dialogue «New Driver Definition» s'ouvre. Cliquer sur l'onglet Name/Type et sélectionner "Derby Embeded JDBC Driver " version 10.2. Note : Pourquoi «Embeded Derby»? Utiliser Embeded Derby permet la création de bases de données directement dans le système de fichiers (sous forme d'un dossier) sans passer par la configuration du serveur de base de données. Ensuite, Cliquer sur l'onglet «JAR List» et sélectionner «derby.jar». Un clic sur le bouton Edit JAR/Zip ouvre l'explorateur des fichiers. Sélectionner le chemin vers le fichier "derby.jar" : «C:\db-derby-10.2.1.6-lib\lib\derby.jar», OK. Cliquer sur OK pour fermer la fenêtre «Preferences». 1.3. Création de la base de données PizzaDB: L'onglet (view Eclipse) «Data Source Explorer», qui se trouve à coté de l'onglet «Servers», permet de gérer des bases de données, les drivers disponibles, les connecteurs possibles (un connecteur par base de donnée créée). Un tel connecteur permet de créer et ensuite d'accéder directement à la base de donnée, de voir les tables et leur contenu, d'exécuter des requêtes SQL (SQL Scrapbook). Dans, la suite, on va utiliser l'onglet «Data Source Explorer» pour créer la base de données suivante: - nom : PizzaDB - user name : pizza - password : pizza Pour créer une base de donnée, il faut cliquer droit sur «Database Connections» puis «New».

Sélectionner "Derby", entrer le nom pour le profile de connexion (au choix): par exemple «PizzaDB Connexion», puis cliquer sur "Next": Dans le champ «Drivers», sélectionner le driver Derby configuré à l'étape 1.2 : "Derby Embedded JDBC Driver". Un clic sur l'onglet "General", puis sélectionner un dossier de destination pour la base de données: «C:\PizzaDB», le nom du répertoire «PizzaDB» est le nom de la base de données.

Enter un nom d'utilisateur dans "User name: pizza" et un mot de passe dans "Password: pizza" (entrées optionnelles). Ne rien changer dans le champ "URL". Ce champ change automatiquement avec le nom de la base, c'est cette URL qui va identifier la base dans les classes java (PizzaFacade.java,...). Cocher la case "Create Database" et "Connect when the wizard completes" 1.4. Création des Tables de la base de données PizzaDB: Dans l'onglet «Data Source Explorer», cliquer droit sur «PizzaDB Connexion» et sélectionner «SQL Scrapbook»: un éditeur SQL s'ouvre. Pour exécuter des commandes SQL sur la base pizzadb, sélectionner «Database: pizzadb» dans la liste déroulante en haut à droite. Entrer les commandes SQL de création des tables PIZZA et STOCK: CREATE TABLE PIZZA."PIZZA" ("PIZZA_ID" VARCHAR(10) not null, "PRIX" numeric) ; ALTER TABLE PIZZA.pizza ADD PRIMARY KEY (PIZZA_ID); CREATE TABLE PIZZA."STOCK" ("STOCK_ID" INTEGER generated always as identity primary key, "PIZZA_ID" VARCHAR(10), "QUANTITE" numeric) ; alter table PIZZA.stock add foreign key (pizza_id) references PIZZA.pizza ; Pour exécuter ces commandes, cliquer droit à l'intérieur de l'éditeur et sélectionner «Execute All»:

Si Le code SQL est bien exécuté, l'onglet "SQL Result" affiche "success" et l'onglet "status" affiche le code exécuté. Il est possible d'afficher le contenu des tables en descendant dans l'arborescence suivante: Database Connections PizzaDB Connexion pizzadb Schemas PIZZA Tables. Un clic doit permet d'afficher un menu «data» pour visualiser, éditer, les données des tables:

2. L'API Java/JDBC et Mapping Objet-relationnel: L'objectif de cette partie est de mettre en place un site web pour l'administration et la commande de pizzas : une pizza est déterminée par son type et son prix à l'unité. un stock (quantité) est donné pour chaque type de pizza une commande se définit par un type de pizza, une quantité, le total de la commande, l'email de confirmation de la commande. 2.1. Servlet AdminPizza: - Créer un nouveau projet web dynamique: TP3_Pizza-war. - Dans ce projet, on va mettre en place à l'aide de JDBC, un Mapping Objet-relationnel (Hibernate que vous avez déjà vu et EJB 3 sont basés sur cette technique de programmation). Comme rappel, vous pouvez consulter le lien http://fr.wikipedia.org/wiki/mapping_objetrelationnel. Un Mapping Objet-relationnel permet d'associer un Objet JavaBean à chaque ligne d'une table de la base de données. Par exemple, le contenu de chaque ligne de la table PIZZA sera récupéré (coté Java) dans un JavaBean de la classe Pizza.java (voir le code de la classe Pizza.java en annexe A et dans l'annexe B la méthode findpizzabyid() de la classe PizzaFacade.java). Ainsi, le contenu de toutes les lignes de la table PIZZA sera récupéré sous la forme d'une liste de JavaBeans de la classe Pizza.java (voir la méthode getlistpizzas() de la classe PizzaFacade.java en annexe). - Dans le répertoire «src», créer les classes JavaBean mappant les tables de la base PizzaDB: pour cela, il suffit de compléter la classe Pizza.java (getter et setter pour tous les champs) et de créer la classe Stock.java de la même manière. - Dans le répertoire «src», créer les classes (Façade) utilisant JDBC pour accéder à la base de données. Ces classes nécessitent l'ajout du driver JDBC «derby.jar» dans le répertoire WEB-INF/lib. La classe PizzaFacade.java est fournie en Annexe, elle implémente les méthodes suivantes: 1. la méthode getconnection() permet de récupérer une connexion vers la Base PizzaDB, 2. la méthode create(pizza p) permet d'exécuter une requête SQL de type «Insert» afin de stocker une nouvelles ligne dans la Table PIZZA. 3. la méthode findpizzabyid(string pizzaid) permet d'exécuter une requête SQL de type «Select» afin de récupérer la ligne de la Table PIZZA correspondant à une clef primaire égale à la valeur du paramètre «pizzaid». Le contenu de la ligne sélectionnée est retourné sous la forme d'un JavaBean Pizza.java. 4. la méthode findallpizzas() permet d'exécuter une requête SQL de type «Select» afin de récupérer toutes les lignes de la Table PIZZA (sous la forme d'une liste de JavaBeans Pizza.java). - En s'inspirant de la classe PizzaFacade, créer la classe StockFacade proposant des méthodes findallstocks() et create(stock s) analogues au méthodes de PizzaFacade. - Copier la Servlet AdminPizza.java à partir du TP2. Ensuite, afin d'utiliser la base PizzaDB comme source de données, adapter le code de AdminPizza.java pour utiliser les Façades PizzaFacade et StockFacade développées dans les questions précédentes. (Rappel: dans le TP2, les Façades utilisaient la «Session» comme source de données, dans ce TP on utilise une base de données).

- Tester la Servlet AdminPizza.java: Attention, il faut déconnecter «PizzaDB Connexion» avant de démarrer le serveur Tomcat (dans l'onglet «Data Source Explorer», cliquer droit sur «PizzaDB Connexion» puis sélectionner «Disconnect». Utiliser la Servlet pour créer des nouveaux types de pizza, puis vérifier que les tables (Pizza et Stock) de la base de données ont été mises à jour. 2.2. Gestion des commandes de pizzas: 2.2.1. Servlet CommandePizza: En utilisant le code fourni en Annexe C, créer une Servlet «CommandePizza.java» permettant de gérer les commandes de pizzas. Le code fourni implémente uniquement les fonctionnalités suivantes: - Afficher la liste des stocks de pizzas. - Saisir des nouvelles commandes de pizzas. Dans la suite du TP (section 2.2.2), on va ajouter ces fonctionnalités: - Mettre à jours le stock après chaque commande - Refuser les commandes pour un stock insuffisant et refuser les commandes pour un type de pizza inexistant. Ajouter la table COMMANDE à la base de données PizzaDB: une commande se définit par un id (COMMANDEID) généré automatiquement, un type de pizza (PIZZAID), une quantité, le total de la commande, l'email de confirmation (ne pas oublier la contrainte sur la clé étrangère PIZZAID). CREATE TABLE PIZZA."COMMANDE"( "COMMANDEID"INTEGER generated always as identity primary key, "PIZZAID" VARCHAR(10), "QUANTITE" numeric, "TOTAL" numeric, "EMAIL"varchar(20) ); alter table PIZZA.commande add foreign key(pizzaid) references PIZZA.PIZZAID; Dans le répertoire «src», créer la classe JavaBean correspondant à la table COMMANDE, puis ajouter la Façade CommandeFacade.java contenant l'implémentation des méthodes appelées par la Servlet CommandePizza.java. Enfin, utiliser la Servlet pour créer des commandes et vérifier le résultat. 2.2.2. Développements: Compléter le code de la Servlet CommandePizza et des Façades pour implémenter les fonctionnalités suivantes : 1. Refuser les commandes pour un type de pizza inexistant et refuser les commandes pour un stock insuffisant. Pour cela, ajouter le code ci-dessous à la Servlet CommandePizza et ajouter à StockFacade une méthode findstockbypizzaid(string pizzaid) qui retourne un JavaBean Stock contenant la ligne de la table Stock correspondant au paramètre pizzaid. Stock stock = stockfacade.findstockbypizzaid(type); if (stock == null) { out.println("nous ne prenons pas les commandes pour les pizzas "+type+"<br/>"); else if (stock.getquantite() < quantite) { out.println("commande non effectuée. Vous demandez "+quantite+" pizzas et le stock est de " + stock.getquantite() + "<br/>"); else {... 2. Mettre à jour le stock après chaque commande: Pour cela, la Servlet CommandePizza doit mettre à jour le (JavaBean) stock puis appeler la méthode suivante de la classe StockFacade:

public void update(stock stock) { Connection connection = getconnection(); String query = "update stock set quantite = " + stock.getquantite() + " where pizza_id = '" + stock.getpizzaid() + "'"; connection.createstatement().executeupdate(query); connection.close(); catch (SQLException e) { e.printstacktrace(); Annexe: A. Code des JavaBeans: - Code du JavaBean Pizza.java: package entitypizza; public class Pizza implements Serializable { private String pizzaid; private Integer prix; public Pizza() { //TODO generate getters and setters for all fields... public void setpizzaid(string pizzaid) { this.pizzaid = pizzaid; public void setprix(integer prix) { this.prix = prix; - Code du JavaBean Stock.java: package entitypizza; public class Stock implements Serializable { private static final long serialversionuid = 1L; private Integer stockid; private Integer quantite; private String pizzaid; public Stock() { //TODO generate getters and setters for all fields... - Code du JavaBean Commande.java: package entitypizza; public class Commande implements Serializable { private Integer commandeid; private Integer quantite; private Integer total; private String email; private String pizzaid; public Commande() { //TODO generate getters and setters for all fields...

B. Code de la Façade PizzaFacade.java: import java.sql.connection; import java.sql.drivermanager; import java.sql.resultset; import java.sql.sqlexception; import java.util.arraylist;import java.util.list; public class PizzaFacade { public void create(pizza p) { Connection connection = getconnection(); String query = "insert into pizza(pizza_id,prix) "; query = query + "values ('" + p.getpizzaid() + "'," + p.getprix() + ")"; connection.createstatement().executeupdate(query); connection.close(); catch (SQLException e) {e.printstacktrace(); public Pizza findpizzabyid(string pizzaid) { Pizza pizzabean = null; Connection connection = getconnection(); String query = "SELECT * FROM Pizza WHERE pizza_id = '" + pizzaid + "'"; ResultSet rs = connection.createstatement().executequery(query); if (rs.next()) { pizzabean = new Pizza(); // / Get the data from the row using the column name pizzabean.setpizzaid(rs.getstring("pizza_id")); pizzabean.setprix(rs.getint("prix")); connection.close(); catch (SQLException e) {e.printstacktrace(); return pizzabean; public List<Pizza> findallpizzas() { ArrayList<Pizza> pizzas = new ArrayList<Pizza>(); Connection connection = getconnection(); String query = "SELECT * FROM Pizza"; ResultSet rs = connection.createstatement().executequery(query); // Fetch each row from the result set while (rs.next()) { Pizza pizzabean = new Pizza(); // Get the data from the row using the column name pizzabean.setpizzaid(rs.getstring("pizza_id")); pizzabean.setprix(rs.getint("prix")); pizzas.add(pizzabean); connection.close(); catch (SQLException e) { e.printstacktrace(); return null; return pizzas; private Connection getconnection() { Class.forName("org.apache.derby.jdbc.EmbeddedDriver"); //TODO modifier la ligne suivante avec le chemin de votre base de données return DriverManager.getConnection("jdbc:derby:[à remplacer par l'url votre base]/pizzadb","pizza", "pizza"); catch (Exception e) { e.printstacktrace(); return null;

C. Code de la Servlet CommandePizza.java (gestion des commandes de pizzas): package gestionclient; import entitypizza.commandefacade; import entitypizza.pizza; import entitypizza.pizzafacade; import entitypizza.stock; import entitypizza.stockfacade; public class CommandePizza extends HttpServlet { private StockFacade stockfacade = new StockFacade(); private CommandeFacade commandefacade = new CommandeFacade(); private PizzaFacade pizzafacade = new PizzaFacade(); protected void processrequest(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { response.setcontenttype("text/html;charset=utf-8"); PrintWriter out = response.getwriter(); out.println("<html>"); out.println("<head>"); out.println("<title>commande Pizza</title>"); out.println("</head>"); out.println("<body>"); List lstocks = stockfacade.getliststocks(); for (Iterator it = lstocks.iterator(); it.hasnext();) { Stock stock = ((Stock) it.next()); out.println("type : <b>" + stock.getpizzaid() + " </b> "); out.println("stock : " + stock.getquantite() + "<br/>"); out.println("<h1>choisissez votre pizza : </h1>"); String type=request.getparameter("type"); if (type!=null) { Pizza pizza = pizzafacade.find(type); int quantite=new Integer(request.getParameter("quantite")); //On ajoute une commande dont le prix total est égale à: int total = quantite * pizza.getprix(); Commande commande = new Commande(); commande.settotal(total); commande.setpizzaid(request.getparameter("type")); commande.setquantite(new Integer(request.getParameter("quantite"))); commande.setemail(request.getparameter("email")); //On persiste la commande en base de données commandefacade.create(commande); //Commande effectuée, donc on recharge la page response.sendredirect("commande_pizza"); catch (Exception ex) { out.println("commande non effectuée"); ex.printstacktrace(); out.println("<form method='post' action='commande_pizza'>"); out.println("type: <input type='text' name='type'><br/>"); out.println("quantité: <input type='text' name='quantite'><br/>"); out.println("email: <input type='text' name='email'><br/>"); out.println("<input type='submit'><br/>"); out.println("</form>"); out.println("<a href='admin_pizza'> Administration pizza</a>"); out.println("</body>"); out.println("</html>"); finally { out.close(); protected void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { processrequest(request, response); protected void dopost(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { processrequest(request, response);