Bases de Données SQL et NoSQL LI328 Technologies Web



Documents pareils
Java DataBaseConnectivity

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

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

Accès aux bases de données

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

TP Programmation Java / JDBC / Oracle

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

Programmation d application Bases de données avec Java

Java et les bases de données

OpenPaaS Le réseau social d'entreprise

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)

Application web de gestion de comptes en banques

Bases de données et sites WEB Licence d informatique LI345

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

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

Compte Rendu d intégration d application

Cours Bases de données

JDBC le langage Java XVI-1 JMF

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

Implémentation des SGBD

Dialogue avec la base de données

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

Cours Bases de données 2ème année IUT

JDBC JDBC. Java DataBase Connectivity

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

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

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

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

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

Bases de données cours 1

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

Bases de Données. Stella MARC-ZWECKER. Maître de conférences Dpt. Informatique - UdS

Les bases de données

1. Langage de programmation Java

PHP 4 PARTIE : BASE DE DONNEES

CREATION WEB DYNAMIQUE

Java - MySQL. Code: java-mysql

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

PHP. PHP et bases de données

Bases de données et sites WEB

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

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

Réplication des données

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

Plan. Accès aux données dans le framework.net. ADO.NET Entity Framework LINQ ADO.NET ADO.NET. 1. ADO.NET Mode connecté Mode non connecté

Gestion des transactions et accès concurrents dans les bases de données relationnelles

Initiation aux bases de données (SGBD) Walter RUDAMETKIN

Module BD et sites WEB

CHAPITRE 1 ARCHITECTURE

Information utiles. webpage : Google+ : digiusto/

Bases de données relationnelles

Panorama des Bases de Données

Tutoriel d installation de Hibernate avec Eclipse

Pratique et administration des systèmes

A QUOI SERVENT LES BASES DE DONNÉES?

Architecture Orientée Service, JSON et API REST

PDO : PHP Data Object 1/13

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

Le langage SQL (première partie) c Olivier Caron

1 Introduction et installation

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

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

Optimisations des SGBDR. Étude de cas : MySQL

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

Bases de Données NoSQL

NFA 008. Introduction à NoSQL et MongoDB 25/05/2013

SQL Historique

Introduction aux Bases de Données Relationnelles Conclusion - 1

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

ISC Système d Information Architecture et Administration d un SGBD Compléments SQL

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

TP Bases de données réparties

Cours Base de données relationnelles. M. Boughanem, IUP STRI

Bases de données avancées Introduction

MySQL. (Administrateur) (Dernière édition) Programme de formation. France, Belgique, Suisse, Roumanie - Canada

Mysql avec EasyPhp. 1 er mars 2006

Cours: Administration d'une Base de Données

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Les transactions 1/46. I même en cas de panne logicielle ou matérielle. I Concept de transaction. I Gestion de la concurrence : les solutions

A QUOI SERVENT LES BASES DE DONNÉES?

TP Contraintes - Triggers

Logiciel de gestion de caisse et d ardoises

Magasins et entrepôts de données (Datamart, data warehouse) Approche relationnelle pour l'analyse des données en ligne (ROLAP)

Connexion à une base de données. Connexion à une base de données. Connexion à une base de données Développement d'une 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)

LES ACCES ODBC AVEC LE SYSTEME SAS

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

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

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

FileMaker 10. Guide ODBC et JDBC

Performances. Gestion des serveurs (2/2) Clustering. Grid Computing

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

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

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

C-JDBC. Emmanuel Cecchet INRIA, Projet Sardes.

MapReduce. Malo Jaffré, Pablo Rauzy. 16 avril 2010 ENS. Malo Jaffré, Pablo Rauzy (ENS) MapReduce 16 avril / 15

Bases de données Cours 1 : Généralités sur les bases de données

Transcription:

Bases de Données SQL et NoSQL LI328 Technologies Web Mohamed-Amine Baazizi (Slides de B. Amann) UPMC - LIP6 LI328 Technologies Web (B. Amann) 1

SGBD Universalité Systèmes «SQL» : Facilité d'utilisation Cohérence des données Persistance des données Fiabilité (pannes) Efficacité Universalité Vues «One size fits all» SQL Données structurées Transactions Optimisation de requêtes Indexation des données LI328 Technologies Web (B. Amann) 5

Les évolutions... Nouvelles Données : Web 2.0 : Facebook, Twitter, news, blogs,... LOD : graphes, ontologies,... Flux : capteurs, GPS, Nouveaux Traitements : Moteurs de recherche Extraction, analyse,... Recommandation, filtrage collaboratif, Nouvelles Infrastructures : Cluster, réseaux mobiles, microprocesseurs multi-coeurs, très gros volumes, données pas ou faiblement structurées transformation, agrégation, indexation distribution, parallélisation, redondance LI328 Technologies Web (B. Amann) 6

Évolution Spécialisation Systèmes «nosql» (not only SQL) : Facilité d'utilisation Cohérence des données Persistence des données Fiabilité (pannes) Efficacité Universalité Langages spécialisées Données hétérogènes Réplication Parallélisation Indexation de contenus «Systèmes sur mesure» LI328 Technologies Web (B. Amann) 7

SQL NoSQL Cohérence forte : Logique : Schémas, contraintes Physique : Transactions ACID Distribution des données Transactions distribuées Ressources limitées Optimisation de requêtes Langage standard : SQL Cohérence faible : Schémas, contraintes Cohérence «à terme» Distribution des traitements : Traitements «batch» MapReduce Ressources «illimitées» Passage à l'échelle horizontal Langages spécialisés, API LI328 Technologies Web (B. Amann) 9

Plan 1re séance : Introduction comparative des systèmes SQL et NoSQL Bases de données SQL 2nde séance : Bases de données NoSQL LI328 Technologies Web (B. Amann) 3

Objectifs Objectif de ce cours : Savoir développer des applications simples avec Java et un SGBD Pré-requis Bases de données relationnelles (LI341) : SQL, curseurs, transactions Programmation Java : classes, méthodes, exceptions LI328 - Technologies Web 2

Plan Programmation Bases de Données JDBC premiers pas Architectures Driver, Connection, Statement, Rowset JDBC avancé Métaschéma Transactions Exceptions Datasource LI328 - Technologies Web 3

Programmation Bases de Données LI328 - Technologies Web 4

Programmation et Bases de Données Langages de Programmation : JAVA, C, C#, JavaScript Langages procédural : «je fais quoi?» Accès itératif : boucles récursion Types complexes Langages de requêtes : SQL : Structured Query Language Langage déclaratif : «je veux quoi?» Accès ensembliste : {a,b,c} Q {d,e} Types simples Programmation d'applications Données structurées en mémoire Accès aux données gérés par un SGBD Données structurées sur disque LI328 - Technologies Web 5

Java + Fichiers Fichiers : opérations simples : ouvrir/fermer, lire/écrire différentes méthodes d accès (séquentiel, indexé, haché, etc.) utilisation par plusieurs programmes difficile (format?) PROGRAM 1 Données PROGRAM 2 open/close Fichier 1 Données PROGRAM 3 Données read/write Fichier 2 Introduction aux BD-6

Java + BD PROGRAM 1 PROGRAM 1 SGBD Requêtes Données Transactions Index,... Base de données PROGRAM 2 Introduction aux BD-7

Fichiers versus BD Fichier : Faible structuration des données Dépendance entre programmes et fichiers Redondance des données Absence de contrôle de cohérence globale des données Base de Données : Structuration des données à travers un schéma de données Indépendance entre programmes et données Données partagées Contrôle de la cohérence logique et physique (schémas, transactions) Introduction aux BD-8

SQL SELECT var i.a ik, attributs FROM R i1 var 1, R i2 var 2 tables WHERE P prédicat/condition var i désigne la table R ij Les variables dans la clause SELECT et dans la clause WHERE doivent être liées dans la clause FROM. Simplifications : Si var j n est pas spécifiée, alors la variable s appelle par défaut R ij. Si une seule table/variable var possède l attribut A, on peut écrire plus simplement A au lieu de var.a. LI328 - Technologies Web 9

Requêtes Emp (Eno, Ename, Title, City) Project(Pno, Pname, Budget, City) Pay(Title, Salary) Works(Eno, Pno, Resp, Dur) Noms et titres des employés qui travaillent dans un projet pendant plus de 17 mois? SELECT Ename, Title FROM Emp, Works WHERE Dur > 17 AND Emp.Eno = Works.Eno Noms et titres des employés qui travaillent dans un projet à Paris? SELECT Ename, Title FROM Emp E, Works W, Project P WHERE P.City = Paris AND E.Eno = W.Eno AND W.Pno = P.Pno LI328 - Technologies Web 10

Couplage SQL langage de programmation (Embedded SQL) Accès une BD depuis un programme d'application SQL n'est pas suffisant pour écrire des applications (SQL n est pas «Turing complet») SQL a des liaisons (bindings) pour différents langages de programmation C, C++, Java, PHP, etc. les liaisons décrivent la connexion de langages hôtes avec un SGBD relationnel UPMC - UFR 919 Ingéniérie - Cours Bases de données (BD-L3)

JDBC Java Database Connectivity LI328 - Technologies Web 12

JDBC 2.0 : Fonctions API Java standard pour accéder à des données tabulaires BD relationnelles, mais aussi feuilles Excel,... Bibliothèque Java 2 SDK Requêtes SQL (select, update, insert, delete) Gestion de transactions Traitement des exceptions / erreurs LI328 - Technologies Web 13

JDBC : Architecture Logiciel Application Application Java / Java SQL Client / SQL JDBC JDBC Driver Manager Application Pont JDBC-ODBC Driver JDBC Oracle Driver JDBC MySQL Driver ODBC S Q L S Q L Réseau S Q L SGBD LI328 - Technologies Web 14

JDBC : Architecture Web Client JavaScript/Applet JavaScript/Applet Client H T T P H T T P Réseau H T T P EJB JSP Servlet JDBC Driver Manager Serveur Pont JDBC-ODBC Driver JDBC Oracle Driver JDBC MySQL d'application Driver ODBC S Q L S Q L Réseau S Q L SGBD LI328 - Technologies Web 15

Programmation JDBC 1) Charger Driver JDBC 2) Créer connexion BD 3) Accès aux données (requêtes, maj) : Créer ordre SQL (statement object) Exécuter ordre SQL Traiter le résultat (ResultSet, curseur) Fermer ordre SQL (close) 4) Fermer la connexion (close) LI328 - Technologies Web 16

Chargement Driver JDBC Driver = classe Java Class.forName( package.classe_driver ) Class.forName( com.mysql.jdbc.driver"); Class.forName( oracle.jdbc.driver.oracledriver"); Class.forName( sun.jdbc.odbc.jdbcodbcdriver ); Exception / erreur : Par exemple : le driver n'est pas accessible par CLASSPATH java.lang.classnotfoundexception e LI328 - Technologies Web 17

Code pour MySQL try { Class.forName("com.mysql.jdbc.Driver"); } catch(java.lang.classnotfoundexception e) { System.err.print("Exception: "); System.err.println(e.getMessage()); } LI328 - Technologies Web 18

Connexion au SGBD (1) Établir une connexion : Connection c = Driver.getConnection(<url>, <login>, <mdp>) <url> = <driver>:<protocole>:@<addr_bd> Exemple : jdbc:oracle:thin:@oracle.ufr-info-p6.jussieu.fr:1521:ora10 driver protocole addr_bd LI328 - Technologies Web 19

Connexion au SGBD (2) Établir une connexion : Connection c = Driver.getConnection(<string>) ; <string> = toutes les infos de connexion Exemple : jdbc:mysql://<host>:3306/<bd> user=<user>&password=<pw> driver host port nom_bd login mdp LI328 - Technologies Web 20

Créer et exécuter des ordres (statement) SQL Créer un ordre (statement) : Statement stmt = c.createstatement(); c est une connexion ouverte/active vers une bases de données Exécuter un ordre : stmt.executequery(<sql>) : interrogation (QL) stmt.executeupdate(<sql>) : mises-à-jour données (DML) et schéma (DDL) LI328 - Technologies Web 21

Exécution d'ordres ResultSet res = statement.executequery("select A,B,C from R") int executeupdate( insert... ) nombre de lignes insérées Int executeupdate( update... ) nombre de lignes modifiés int executeupdate( create table... ) int executeupdate( drop table... ) Comment accéder au résultat d'une requête? ResultSet res = curseur A B C res LI328 - Technologies Web 22

ResultSet : accès à la réponse rs.beforefirst() : Place le curseur avant la première ligne (défaut à l'ouverture du curseur) rs.next() : Avance vers la prochaine ligne dans la réponse (premier appel avance vers la première ligne) Retourne false si fin ou erreur rs.close(): Libère les ressources JDBC/BD rs est fermé automatiquement avec l'exécution d'une nouvelle requête LI328 - Technologies Web 23

ResultSet (Continued) rs.get<type>(<attr>) Retourne la valeur de l'attribut <attr> avec transformation vers le type java <type> <attr> : nom ou position de l'attribut <type> : double byte int Date String float short long Time Object LI328 - Technologies Web 24

Transformation de types SQL JAVA LI328 - Technologies Web 25

Exemple try { Class.forName("oracle.jdbc.driver.OracleDriver"); connexion = DriverManager.getConnection(url, user, password); Statement lecture = connexion.createstatement(); ResultSet curseur = lecture.executequery( select... ); while (curseur.next()) { out.println(curseur.getstring( nom )); out.println(curseur.getint( age )); } curseur.close(); lecture.close(); connexion.close(); } catch(java.lang.classnotfoundexception e) { System.err.print("Exception: "); System.err.println(e.getMessage()); } LI328 - Technologies Web 26

JDBC Avancé LI328 - Technologies Web 27

createstatement, preparestatement, preparecall Ordre avec exécution unique : Statement s = createstatement(<param_opt>); Ordre avec exécution multiple : PreparedStatement ps = preparestatement(<sql>, <param_opt>); Appel de procedure stockée : CallableStatement pc = preparecall(<sql>, <param_opt>); LI328 - Technologies Web 28

PreparedStatement PreparedStatement Requête SQL avec un '?' pour chaque paramètre set<type>(<int>,<valeur>) : sett(i,v) : remplace le i-ème '?' par la valeur v de type T Avantages : Exécution plus rapide : une seule phase d'optimisation pour plusieurs exécutions Réutilisation de code Facilite le passage de paramètres : par exemple chaînes avec ' LI328 - Technologies Web 29

Exemple PreparedStatement updatesales; String updatestring = "update NOTES set NOTE =? '' + ''where NO_ETUDIANT =?"; updatesales = con.preparestatement(updatestring); int [] notes = {12,20,2,9}; int [] nums = {123456,289068,376876,465687}; int len = notes.length; for(int i = 0; i < len; i++) { updatesales.setint(1, notes[i]); updatesales.setint(2, nums[i]); updatesales.executeupdate(); } LI328 - Technologies Web 30

Creation de statement : paramètres optionnels int resultsettype TYPE_FORWARD_ONLY : lecture avant (par défaut) TYPE_SCROLL_INSENSITIVE : lecture aléatoire TYPE_SCROLL_SENSITIVE : lecture aléatoire, lectures sales int resultsetconcurrency CONCUR_READ_ONLY : sans maj (verrous partagés), concurrence élevée CONCUR_UPDATABLE : avec maj (verrous exclusives), concurrence plus faible int resultsetholdability HOLD_CURSORS_OVER_COMMIT : curseur reste ouvert au moment d'un commit CLOSE_CURSORS_AT_COMMIT : curseur est fermé au moment d'un commit Voir documentation pour des exemples... LI328 - Technologies Web 31

ResultSet : accès aléatoire rs.previous(): Recule vers la ligne précédente rs.absolute(int <num>): Aller vers la ligne <num> rs.relative (int <num>): Avancer (positif) ou reculer (négatif) <num> lignes rs.first() / rs.last() Aller vers la première / dernière ligne LI328 - Technologies Web 32

ResultSet : métadonnées int rs.getmaxrows() / setmaxrows(int max): Détermine la taille maximale (nombre de lignes) d'un ResultSet 0 = taille illimitée int getquerytimeout() / setquerytimeout(int ms): Détermine le temps d'attente maximal avant de déclencher une exception (SQLException) LI328 - Technologies Web 33

ResultSet : Mises-à-jour Possible sous certaines contraintes : Une seule table dans FOR Pas de group by Pas de jointures Conditions pour insert : Tous les attributs non nulles et sans valeurs par défaut sont dans SELECT Sinon on utilise les ordres SQL: UPDATE, DELETE, INSERT LI328 - Technologies Web 34

ResultSet : Mises-à-jour Mise-à-jour d'une ligne : rs.update<type>(<attr>,<valeur>),... : maj en mémoire rs.updaterow() : propagation dans la BD Effacement d'une ligne : rs.deleterow() : effacer ligne actuelle Insertion d'une ligne : rs.movetoinsertrow(); rs.updateint(1,123) ; rs.updatestring(2, 'toto') ; rs.insertrow(); LI328 - Technologies Web 35

ResultSet : Métadonnées Méta-données : Nombre d'attributs Nom et type d'un attributs Méthodes : ResultSetMetaData md = rs.getmetadataobject(): int md.getcolumncount(); String md.getcolumnname(int column); String md.gettablename(int column); String md.getcolumntypename(int column); Boolean md.iswritable(int column)... LI328 - Technologies Web 36

Traitements des exceptions Pratiquement toutes les méthodes peuvent déclencher des exception SQLException avec SQLException sqle ; sqle.getmessage() : description de l'erreur sqle.getsqlstate() : état SQLState (spécification Open Group SQL specification) sqle.geterrorcode() : code d'erreur sqle.getnextexception() : exception suivante (si présente) LI328 - Technologies Web 37

SQL Exception Example try {... // JDBC statement. } catch (SQLException sqle) { while (sqle!= null) { System.out.println("Message:"+sqle.getMessage()); System.out.println("SQLState:" + sqle.getsqlstate()); System.out.println("Vendor Error:"+ sqle.geterrorcode()); sqle.printstracktrace(system.out); sqle = sqle.getnextexception(); } } LI328 - Technologies Web 38

Transactions Transaction = séquence d actions qui transforment une BD d un état cohérent vers un autre état cohérent opérations de lecture et d écriture de données de différentes granularités granules = tuples, tables, pages disque, etc BD dans un état cohérent La BD peut être dans un état incohérent BD dans un (autre) état cohérent Début de Transaction Exécution Fin de Transaction UPMC - UFR 919 Ingéniérie - Cours Bases de données (BD-LI341)

Programmation Une transaction est démarrée implicitement : au début du programme ou après la fin d une transaction (Oracle) ou explicitement : par une instruction (start_transaction) Une transaction comporte des opérations de : lecture ou écriture (SQL) manipulation : calculs, tests, etc. (JAVA) transactionnelles : commit : validation des modifications explicite ou implicite à la fin abort (ou rollback): annulation de la transaction on revient à l état cohérent initial avant le début de la transaction UPMC - UFR 919 Ingéniérie - Cours Bases de données (BD-LI341)

Transactions dans JDBC Transaction : Exécution atomique (tout ou rien) d'une collection d'ordres Mode automatique (autocommit) : mode par défaut à la création d'une connexion chaque ordre est traité comme une transaction Contrôle explicite : c.setautocommit(false); Validation explicite : c.commit(); Annulation explicite : c.rollback(); LI328 - Technologies Web 41

Propriétés des transactions ATOMICITE : Les opérations entre le début et la fin d une transaction forment une unité d exécution DURABILITE: Les mises-à-jour des transactions validées persistent. COHERENCE : Chaque transaction accède et retourne une base de données dans un état cohérent (pas de violation de contrainte d intégrité). ISOLATION : Le résultat d un ensemble de transactions concurrentes et validées correspond au résultat d une exécution successive des mêmes transactions. Gestion de pannes Cache Journalisation Gestion de cohérence Sérialisibilité Algorithmes de contrôle de concurrence UPMC - UFR 919 Ingéniérie - Cours Bases de données (BD-LI341)

Degrés d isolation SQL-92 Lecture sale (lecture d une maj. non validées): T1: Write(A); T2: Read(A); T1: abort Si T 2 annule, T 1 a lu des données qui n existent pas dans la base de données Lecture non-répétable (maj. intercalée) : T1: Read(A); T2: Write(A); T2: commit; T1: Read(A); La deuxième lecture de A par T 1 peut donner un résultat différent Fantômes (requête + insertion) : T1: Select where R.A= ; T2: Insert Into R(A) Values ( ); Les insertions par T2 ne sont pas détectées comme concurrentes pendant l évaluation de la requête par T1 (résultat incohérent possible). UPMC - UFR 919 Ingéniérie - Cours Bases de données (BD-LI341)

degré d isolation degré de concurrence Degrés d isolation SQL-92 haut bas Degré Lecture sale Lectures non répétable Fantômes READ_UNCOMMITTED possible possible possible READ_COMMITTED impossible possible possible REPEATABLE_READ impossible impossible possible SERIALIZABLE impossible impossible impossible bas haut UPMC - UFR 919 Ingéniérie - Cours Bases de données (BD-LI341)

Datasource Description logique d'une connexion BD : Adresse physique nom logique Catalogue de connexions : Java Naming and Directory Interface (JNDI) Remplace DriverManager : Connection getconnection(); Connection getconnection(username, password) ; Avantages : Portabilité du code Gestion des ressources (pool de connexions) LI328 - Technologies Web 45

Datasource dans context Tomcat context.xml <Context> <!-- maxactive: nombre maximal de connexions --> <!-- maxidle: nombre minimal de connexions libres à retenir dans le pool --> <!-- maxwait: temps d'attente maximal pour obtenir une connexion --> <!-- username and password --> <!-- driverclassname: nom du driver JDBC --> <!-- url: url de connexion --> <Resource name="jdbc/testdb" auth="container" type="javax.sql.datasource" maxactive="100" maxidle="30" maxwait="10000" username="javauser" password="javadude" driverclassname="com.mysql.jdbc.driver" url="jdbc:mysql://localhost:3306/javatest"/> </Context> LI328 - Technologies Web 46

Exemple Servlet Java package foo; import javax.naming.*; import javax.sql.*; import java.sql.*; public class DBTest { public void init() { try{ Context ctx = new InitialContext(); if(ctx == null ) throw new Exception("Boom"); DataSource ds = (DataSource)ctx.lookup( "java:comp/env/jdbc/testdb"); if (ds!= null) { Connection conn = ds.getconnection(); if(conn!= null) { Statement stmt = conn.createstatement(); ResultSet rst = stmt.executequery("select "); if(rst.next()) { } conn.close(); } } } catch(exception e) { e.printstacktrace(); } } } LI328 - Technologies Web 47

Conclusion Driver JDBC : connexion d'une application Java vers un SGBD. Six étapes : Charger driver JDBC Établir connexion vers SGBD Création d'objet Statement Exécution de requêtes Traitement des résultats (ResultSet) Fermeture de la connexion PreparedStatements Plus rapides (optimisation) Paramétrage Transactions : Commit(), rollback() LI328 - Technologies Web 48

Références JDBC Data Access API : http://www.oracle.com/technetwork/java/javase/jdbc /index.html Tutoriel : http://docs.oracle.com/javase/tutorial/ LI328 - Technologies Web 49

Alternatives à JDBC ODBC : JDBC pour C (pointeurs) Plus complexe Hibernate : Mapping Objet-Relationnel (ORM) Classes Java persistantes HQL : Hibernate Query Language LI328 - Technologies Web 50

Exemple complet LI328 - Technologies Web 51

Exemple complet import java.sql.*; import java.io.*; public class Acces { String url = "jdbc:oracle:thin:@oracle.ufr-info-p6.jussieu.fr:1521:ora10"; String user = "M1000"; // login String password = "M1000"; // mot de passe Connection connexion = null; PrintStream out = System.out; LI328 - Technologies Web 52

Exemple complet public static void main(string in[]) { Acces c = new Acces(); String sql = in[0]; c.traiterequete(sql); } public Acces(){ try { Class.forName("oracle.jdbc.driver.OracleDriver"); } catch(exception e) { gestiondeserreurs(e); } } LI328 - Technologies Web 53

Exemple complet public void traiterequete(string requete) { out.println(requete); try { connexion = DriverManager.getConnection(url, user, password); Statement lecture = connexion.createstatement(); ResultSet curseur = lecture.executequery(requete); ResultSetMetaData inforesultat = curseur.getmetadata(); int nbchamp =inforesultat.getcolumncount(); out.println("le resultat de la requete est:"); String entete = ""; for(int i=1; i<= nbchamp; i++) { String nomchamp = inforesultat.getcolumnname(i); entete = entete + nomchamp + "\t"; } out.println(entete); out.println("-----------------------------"); LI328 - Technologies Web 54

Exemple complet /* affichage des tuples */ while (curseur.next()) { String tuple = ""; for(int i=1; i<= nbchamp; i++) { String valeurchamp = curseur.getstring(i); tuple = tuple + valeurchamp + "\t"; } out.println(tuple); } curseur.close(); lecture.close(); connexion.close(); } catch(exception e) { gestiondeserreurs(e); } } /* fin traiterequete */ LI328 - Technologies Web 55

Exemple complet protected void gestiondeserreurs(exception e) { out.println("exception: " + e); e.printstacktrace(); try { if (connexion!= null) connexion.close(); } catch(exception se) { out.println("tout autre probleme: " + se); } throw new RuntimeException("Arret immediat"); } LI328 - Technologies Web 56