Applications orientées données (NSY135)

Documents pareils
Java DataBaseConnectivity

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

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

Architecture Orientée Service, JSON et API REST

JavaServer Pages (JSP)

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

Programmer en JAVA. par Tama

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.

Application web de gestion de comptes en banques

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

OpenPaaS Le réseau social d'entreprise

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

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

TP Programmation Java / JDBC / Oracle

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

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

Alfstore workflow framework Spécification technique

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

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

Compte Rendu d intégration d application

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)

Devenez un véritable développeur web en 3 mois!

Création d une application JEE

Mise en œuvre des serveurs d application

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

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

RMI le langage Java XII-1 JMF

Programmation d application Bases de données avec Java

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

CONCOURS DE L AGRÉGATION INTERNE «ÉCONOMIE ET GESTION» SESSION 2015 SECONDE ÉPREUVE

Tutoriel d installation de Hibernate avec Eclipse

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

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

Apache Camel. Entreprise Integration Patterns. Raphaël Delaporte BreizhJUG

Module BD et sites WEB

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

Package Java.util Classe générique

2 Chapitre 1 Introduction

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Accès aux bases de données

1. Langage de programmation Java

Projet de programmation (IK3) : TP n 1 Correction

Applications orientées données

as Architecture des Systèmes d Information

Modélisation PHP Orientée Objet pour les Projets Modèle MVC (Modèle Vue Contrôleur) Mini Framework

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

Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs

CQP Développeur Nouvelles Technologies (DNT)

Programmation Par Objets

NFA016 : Introduction. Pour naviguer sur le Web, il faut : Naviguer: dialoguer avec un serveur web

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

Remote Method Invocation (RMI)

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

Documentation CAS à destination des éditeurs

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

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

Auto-évaluation Programmation en Java

Architectures client/serveur

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

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

Une introduction à la technologie EJB (2/3)

10. Base de données et Web. OlivierCuré

TP1 : Initiation à Java et Eclipse

Développement Logiciel

Java et les bases de données

Java Licence Professionnelle CISII,

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Généralités. javadoc. Format des commentaires. Format des commentaires. Caractères spéciaux. Insérer du code

HTTP. Technologies du Web. Programmation Web côté serveur. Mastère spécialisé Management et nouvelles technologies, 16 novembre 2009

Premiers Pas en Programmation Objet : les Classes et les Objets

Java Naming and Directory Interface

Les frameworks au coeur des applications web

Présentation du PL/SQL

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

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

Tolérance aux Fautes des Grappes d Applications J2EE. Applications Internet dynamiques

Logiciel de gestion de caisse et d ardoises

Un ordonnanceur stupide

Programme ASI Développeur

TP3. Mail. Attention aux fausses manoeuvres lors de ce TP vous pouvez endommager votre mail sur ouindose.

Java 1.5 : principales nouveautés

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

Installation d un serveur HTTP (Hypertext Transfer Protocol) sous Débian 6

Aspects techniques : guide d interfaçage SSO

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

Urbanisation des SI Conduite du changement IT 20/03/09. Patrick CHAMBET

Environnements de développement (intégrés)

Bases de données documentaires et distribuées Cours NFE04

4. Groupement d objets

Master I Génie Logiciel

INITIATION AU LANGAGE JAVA

ÉVALUATION DE LA MAINTENABILITÉ DE S3MDSS AVEC L OUTIL SONAR

Technologies Web. Ludovic Denoyer Sylvain Lamprier Mohamed Amine Baazizi Gabriella Contardo Narcisse Nya. Université Pierre et Marie Curie

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

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

Information utiles. webpage : Google+ : digiusto/

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

Objets et Programmation. origine des langages orientés-objet

Transcription:

Applications orientées données (NSY135) 6 Modèle: La base de données Auteurs: Raphaël Fournier-S niehotta et Philippe Rigaux (philippe.rigaux@cnam.fr,fournier@cnam.fr) Département d informatique Conservatoire National des Arts & Métiers, Paris, France

Introduction à JDBC 1 / 21 Plan du cours 2 Introduction à JDBC Contrôleur, vues et modèle Connexion à la base Exécution d une requête Requête: deuxième approche Requête: troisième approche 3 Résumé

Introduction à JDBC 2 / 21 Introduction Nous allons découvrir JDBC par l intermédiaire d un ensemble d exemples accessibles par notre application Web dans un unique contrôleur, que nous appelons Jdbc pour faire simple. Ce contrôleur communiquera lui-même avec un objet-modèle TestJdbc qui se chargera des accès à la base. Nous restons toujours dans un cadre MVC, avec l exigence d une séparation claire entre les différentes couches. Chaque exemple JDBC correspondra à une action du contrôleur, en l absence d action nous afficherons une simple page HTML présentant le menu des actions possibles. Nous suivons les règles définies à la fin du chapitre MVC.

Introduction à JDBC Contrôleur, vues et modèle 3 / 21 Servlet package controleurs; import java.sql.*; /** * Servlet implementation class Jdbc */ @WebServlet("/jdbc") public class Jdbc extends HttpServlet { private static final String SERVER="localhost", BD="webscope", LOGIN="orm", PASSWORD="orm", VUES="/vues/jdbc/"; protected void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { // On devrait récupérer l'action requise par l'utilisateur String action = request.getparameter("action"); // Notre objet modèle: accès à MySQL TestsJdbc jdbc; // La vue par défaut String mavue = VUES + "index.jsp"; try { jdbc = new TestsJdbc(); if (action == null) { // Rien à faire else if (action.equals("connexion")) { // Action + vue test de connexion jdbc.connect(server, BD, LOGIN, PASSWORD); mavue = VUES + "connexion.jsp"; else if (action.equals("requetea")) { // Etc... catch (Exception e) { mavue = VUES + "exception.jsp"; request.setattribute("message", e.getmessage()); // On transmet à la vue RequestDispatcher dispatcher = getservletcontext().getrequestdispatcher(mavue); dispatcher.forward(request, response);

Introduction à JDBC Contrôleur, vues et modèle 4 / 21 Servlet (suite) Notez l import de java.sql.* : toutes les classes de JDBC. L ensemble des instructions contenant du code JDBC (encapsulé dans TestJdbc) est inclus dans un bloc try pour capturer les exceptions éventuelles. Nous avons également déclaré des variables statiques pour les paramètres de connexion à la base. Il faudrait faire mieux (pour partager ces paramètres avec d autres contrôleurs), mais pour l instant cela suffira.

Introduction à JDBC Contrôleur, vues et modèle 5 / 21 Contrôleur : index.jsp <%@ page language="java" contenttype="text/html; charset=utf-8" pageencoding="utf-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>menu JDBC</title> </head> <body> <h1>actions JDBC</h1> <ul> <li><a href="${pagecontext.request.contextpath/jdbc?action=connexion">connexion</a> <li><a href="${pagecontext.request.contextpath/jdbc?action=requetea">requêtea</a> </li> <li>...</li> </ul> </body> </html>

Introduction à JDBC Contrôleur, vues et modèle 6 / 21 Modèle : TestJdbc Se charge de la connexion à MySQL implantation des différentes actions de test des fonctionnalités JDBC package modeles; import java.sql.*; public class TestsJdbc { private static final Integer port = 3306; /** * Pour communiquer avec MySQL */ private Connection connexion; /** * Constructeur sans connexion */ public TestsJdbc() throws ClassNotFoundException { /* On commence par "charger" le pilote MySQL */ Class.forName("com.mysql.jdbc.Driver"); (...)

Introduction à JDBC Contrôleur, vues et modèle 7 / 21 Modèle (suite) Nous avons un objet privé, connexion, instance de la classe JDBC Connection. L interface JDBC est abstraite: pour communiquer avec un serveur de données, il faut charger le pilote approprié. C est ce que fait l instruction : Class.forName("com.mysql.jdbc.Driver"); Si vous avez bien placé le jar de MySQL dans le répertoire WEB-INF/lib, le chargement devrait s effectuer correctement, sinon vous aurez affaire à une exception ClassNotFoundException.

Introduction à JDBC Connexion à la base 8 / 21 Connexion à la base public void connect(string server, String bd, String u, String p) throws SQLException { String url = "jdbc:mysql://" + server + ":" + port + "/" + bd; connexion = DriverManager.getConnection(url, u, p); Paramètres le nom du serveur: c est pour nous localhost, sinon c est le nom de domaine ou l IP de la machine hébergeant le serveur MySQL; le port, par défaut fixé à 3306 le nom de la base le nom d utilisateur MySQL (ici variable u) le mot de passe (ici variable p). Exemple jdbc:mysql://locahost:3306/webscope affichons maintenant la vue par défaut (index.jsp) et cliquons sur Connexion pour déclencher l action qui exécute cette méthode connect

Introduction à JDBC Exécution d une requête 9 / 21 Requête : première approche On arrive à l essentiel : accéder aux données de la base Et l on se confronte au fameux impedance mismatch, l incompatibilité de représentation des données entre une base relationnelle et une application orientée objet (OO) C est cette incompatibilité qui nécessite des conversions répétitives et rend leur intégration dans une architecture générale (type MVC) laborieuse

Introduction à JDBC Exécution d une requête 10 / 21 Mécanisme d interrogation Mécanisme assez simple (avec des requêtes non préparées ): on instancie un objet statement par lequel on exécute une requête SQL; l exécution renvoie un objet ResultSet par lequel on peut parcourir le résultat. Ajout de cherchefilma dans TestJdbc.java public ResultSet cherchefilmsa() throws SQLException { Statement statement = connexion.createstatement(); return statement.executequery( "SELECT * FROM Film"); Peu de choses sont effectuées par cette méthode Elle retourne l objet ResultSet créé par l exécution de SELECT * FROM Film

Introduction à JDBC Exécution d une requête 11 / 21 Mécanisme d interrogation Retourner ce ResultSet est mauvais Cela implique que le travail est délégué aux autres composants dont ce n est pas le rôle Dans le contrôleur cette méthode est appelée par l action requetea : if (action.equals("requetea")) { ResultSet resultat = jdbc.cherchefilmsa(); request.setattribute("films", resultat); mavue = "/vues/jdbc/filmsa.jsp"; impose donc d importer les classes JDBC java.sql.* dans le contrôleur (propagation de dépendances dans diverses couches)

Introduction à JDBC Exécution d une requête 12 / 21 Vue filmsa.jsp <%@ page language="java" contenttype="text/html; charset=utf-8" pageencoding="utf-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ page import="java.sql.*" %> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>liste des films</title> </head> <body> <h1>liste des films</h1> <ul> <% ResultSet films = (ResultSet) request.getattribute("films"); while (films.next()) { out.println ("<li>titre du film: " + films.getstring("titre") + "</li>"); %> </ul> <p> <a href="${pagecontext.request.contextpath/jdbc">accueil</a> </p> </body> </html>

Introduction à JDBC Exécution d une requête 13 / 21 Vue (suite) Nous avons été obligés d introduire de la programmation Java dans notre vue! Pire, la gestion des accès JDBC est maintenant répartie entre le modèle, la vue et le contrôleur. Tout changement dans une couche implique des changements dans les autres : nous avons des dépendances qui compliquent très sérieusement la maintenance du code à court ou moyen terme. On va faire mieux, en restreignant strictement l utilisation de JDBC au modèle.

Introduction à JDBC Requête: deuxième approche 14 / 21 Requête : deuxième approche public List<Map<String, String>> cherchefilmsb() throws SQLException { List<Map<String, String>> resultat = new ArrayList<Map<String, String>>(); Statement statement = connexion.createstatement(); ResultSet films = statement.executequery( "SELECT * FROM Film"); while (films.next()) { Map<String, String> film = new HashMap<String, String> (); film.put("titre", films.getstring("titre")); resultat.add(film); // Et on renvoie return resultat; on ne renvoie plus un objet ResultSet mais une structure Java permettant de représenter le résultat de la requête sans dépendance à JDBC le mécanisme de parcours d un résultat avec JDBC est on boucle sur l appel à la méthode next() de l objet ResultSet (itérateur pointant successivement sur les lignes du résultat) Des méthodes getint(),getstring(), getdouble(), etc., récupèrent les valeurs des champs en fonction de leur type

Introduction à JDBC Requête: deuxième approche 15 / 21 Nouvelle version de la vue il faut mettre à jour le contrôleur <h1>liste des films</h1> <ul> <c:foreach items="${requestscope.films" var="film"> <li> <c:out value="${film.titre"/> </li> </c:foreach> </ul> <p> <a href="${pagecontext.request.contextpath/jdbc">accueil</a> </p> on s appuie cette fois sur les balises de la JSTL possible grâce à l emploi de structures Java standard plutôt que ResultSet Remarquez la soimplicité du code et l indépendance de la notion d accès à la BDD

Introduction à JDBC Requête: troisième approche 16 / 21 Requête : troisième approche limitation évidente de la méthode précédente nous manipulons des structures (listes et tables de hachage), pour représenter des entités de notre domaine applicatif on préférerait manipuler ces entités comme des objets : encapsulation des propriétés possibilité d associer des méthodes navigation vers d autres objets associés (acteurs, metteur en scène) on va introduire une classe Film, un bean classique, et modifier TestJdbc pour renvoyer des instances de Film

Introduction à JDBC Requête: troisième approche 17 / 21 Film package modeles; /** * Encapsulation de la représentation d'un film * */ public class Film { private String titre; private Integer annee; public Film() { public void settitre(string letitre) { titre = letitre; public void setannee(integer lannee) { annee = lannee; public String gettitre() {return titre; public Integer getannee() {return annee;

Introduction à JDBC Requête: troisième approche 18 / 21 JDBC modifié public List<Film> cherchefilmsc() throws SQLException { List<Film> resultat = new ArrayList<Film>(); Statement statement = connexion.createstatement(); ResultSet films = statement.executequery( "SELECT * FROM Film"); while (films.next()) { Film film = new Film (); film.settitre(films.getstring("titre")); film.setannee(films.getint("annee")); resultat.add(film); // Et on renvoie return resultat; $

Introduction à JDBC Requête: troisième approche 19 / 21 3e approche (suite) On renvoie donc une liste de films tout ce qui concerne la base de données est confiné dans l objet-service JDBC en complétant le contrôleur et la vue, on constate qu ils changent très peu par rapport à la version précédente le niveau indépendance est presque total cela demande un peu plus de travail que la version "basique" définir une classe supplémentaire appliquer des fastidieux get et set pour chaque propriété pour les conversions (incompatibilités) Nous allons bientôt voir comment nous épargner ces tâches répétitives (plus d excuses pour ne pas faire les choses proprement!)

Résumé 19 / 21 Plan du cours 2 Introduction à JDBC Contrôleur, vues et modèle Connexion à la base Exécution d une requête Requête: deuxième approche Requête: troisième approche 3 Résumé

Résumé 20 / 21 Résumé Dans toute application, l accès à une base de données relationnelle se fait par l interface fonctionnelle (API) du SGBD. En Java, l interface JDBC normalise ces accès les mécanismes restent les mêmes quel que soit le langage et le système de bases de données utilisé : on effectue une requête on récupère un curseur sur la résultat on itère sur ce curseur en obtenant à chaque étape une structure (typiquement un tableau) représentant une ligne de la table Notre application est orientée objet nous avons modélisé notre domaine fonctionnel par des classes et les instances de ces classes (des objets) doivent être rendus persistants par stockage dans la base relationnelle on doit donc souvent convertir des objets en lignes, et réciproquement de convertir des lignes ramenées par des requêtes en objets

Résumé 21 / 21 Résumé (suite) Deux derniers points : dans une application objet, tout doit être objet; la couche de persistance, celle qui accède à la base de données, doit donc renvoyer des objets : elle est en charge de la conversion, et c est l approche finale à laquelle nous sommes parvenus; à l échelle d une application non triviale (avec des dizaines de tables et des modèles complexes), la méthode consistant à coder manuellement les conversions est très pénalisante pour le développement et la maintenance; une méthode automatique est grandement souhaitable. c est le rôle d une solution ORM, abordée dans le prochain chapitre