JDBC. Java Database Connectivity (JDBC) JDBC JDBC. Java Database Connectivity (JDBC) Lionel Seinturier. Université Pierre & Marie Curie



Documents pareils
Java DataBaseConnectivity

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

Programmation d application Bases de données avec Java

TP Programmation Java / JDBC / Oracle

JDBC le langage Java XVI-1 JMF

JDBC JDBC. Java DataBase Connectivity

Accès aux bases de données

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

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é

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

1. Langage de programmation Java

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

Java et les bases de données

OpenPaaS Le réseau social d'entreprise

Dialogue avec la base de données

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

Application web de gestion de comptes en banques

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)

Olivier Mondet

Création et Gestion des tables

Java Database Connectivity (JDBC) - Langage SQL

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

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

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

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

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

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

CREATION WEB DYNAMIQUE

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

1/ Présentation de SQL Server :

I. MySQL : Serveur et SGBD

FileMaker 13. Guide ODBC et JDBC

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

Bases de données relationnelles

SQL Historique

Implémentation des SGBD

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

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

INSTALLATION DE L APPLICATION DU CONTEXTE ITASTE

Java - MySQL. Code: java-mysql

1. Base de données SQLite

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

laposte.net) Ministère de l'éducation nationale Atelier sécurité Rabat RALL 2007

PHP 4 PARTIE : BASE DE DONNEES

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

PDO : PHP Data Object 1/13

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

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

Pratique et administration des systèmes

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

Compte Rendu d intégration d application

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

Construire une base de donnée pour bibliothèque

Stockage du fichier dans une table mysql:

FileMaker 10. Guide ODBC et JDBC

Le Langage De Description De Données(LDD)

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

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

Panorama des Bases de Données

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

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

Optimisations des SGBDR. Étude de cas : MySQL

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

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

Module BD et sites WEB

Bases de données cours 1

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

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

TP Contraintes - Triggers

Paradox 9. Guide de l utilisateur jpdox Web Utilities

Les bases de données

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

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)

A QUOI SERVENT LES BASES DE DONNÉES?

Cours: Administration d'une Base de Données

Les BASES de DONNEES dans WampServer

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

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

Architectures web/bases de données

I4 : Bases de Données

Tutoriel d installation de Hibernate avec Eclipse

Création d une application JEE

Service Systèmes et Réseaux

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

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

Remote Method Invocation (RMI)

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

Historisation des données

Encryptions, compression et partitionnement des données

LES ACCES ODBC AVEC LE SYSTEME SAS

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

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

2 Serveurs OLAP et introduction au Data Mining

CHAPITRE 1 ARCHITECTURE

as Architecture des Systèmes d Information

BTS S.I.O PHP OBJET. Module SLAM4. Nom du fichier : PHPRévisionObjetV2.odt Auteur : Pierre Barais

Les bases de données Page 1 / 8

Transcription:

Java Database Connectivity () Lionel Seinturier Université Pierre & Marie Curie Lionel.Seinturier@lip6.fr 10/9/04 1 Lionel Seinturier Java Database Connectivity () Permet à un programme Java d'interagir localement ou à distance avec une base de données relationnelle Fonctionne selon un principe client/serveur client = le programme Java serveur = la base de données Principe le programme Java ouvre une connexion il envoie des requêtes SQL il récupère les résultats... il ferme la connexion 2 Lionel Seinturier Java Database Connectivity () Architecture API d'interaction avec un SGBD nombreuses utilisations - sauvegarde de données de manière sûre - exploration du contenu d'un SGBD - client/serveur 3 tiers - J2EE : persistence des entity beans explicite (BMP) ou transparente (CMP) présentation traitement donnée -ODBC bridge driver ODBC driver Application Java Driver Manager driver pour MySQL driver pour Oracle API... client serveur d'applications SGBD MS Access... SQL Server MySQL Oracle 3 Lionel Seinturier 4 Lionel Seinturier

Architecture Drivers Gestionnaire de drivers (driver manager) chaque prog. Java charge le (ou les) drivers dont il a besoin driver manager = gestionnaire de tous les drivers chargés par un prog. Java Driver : gère les détails des communications avec un type de SGBD untype de driver par BD (Oracle, MySQL, PostGres,...) driver générique -ODBC pour toutes les données accessibles par ODBC - SGBD : MS Access, SQL Server, Oracle, dbase,... - tableurs : Excel,... - tout autre application conforme ODBC Type I passerelle -ODBC accès local seulement fourni avec le JDK (sun.jdbc.odbc.jdbcodbcdriver) Type II drivers partiellement écrits en Java reposent sur des librairies propriétaires (par ex. en C) pour accéder au SGBD Type III drivers 100 % Java communiquent localement ou à distance avec le SGBD selon un protocole réseau générique Type IV idem III mais utilisent un protocole propriétaire (spécifique au SGBD) 5 Lionel Seinturier 6 Lionel Seinturier URLs Utilisation de Schéma de désignation des bases de données avec pour les drivers de type I et II jdbc:driver:source ex : jdbc:odbc:employes pour les drivers de type III et IV jdbc:driver:adresse ex : jdbc:mysql://elios.lip6.fr/employes source = nom source de données ODBC La syntaxe de l'adresse peut varier selon les SGBD ex : jdbc:oracle:thin:@elios.lip6.fr:employes L'ensemble de l'api est définie dans le package java.sql 1. Chargement du driver (= chargement de la classe du driver dans la JVM) Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 2. Ouverture d'une connexion avec la base ages Connection cx = DriverManager.getConnection("jdbc:odbc:ages", "login", "passwd" ); 3. Création d'une requête SQL en utilisant un objet de la classe Connection 4. Envoi d'une requête SELECT ResultSet rs = st.executequery( "SELECT * FROM ages" ); Envoi d'une requête CREATE, INSERT ou UPDATE int res = st.executeupdate( "INSERT INTO ages VALUES ('toto',12)" ); 7 Lionel Seinturier 8 Lionel Seinturier

Utilisation de (suite) 5. Récupération du résultat rs.next() retourne vrai tant qu'il reste des enregistrements dans le résultat et positionne le curseur sur l'enregistrement suivant rs.getstring(string attribut) (ex. : rs.getstring("nom") ) retourne la valeur de l'attribut attribut de type String dans le résultat rs.getint(string attribut), getboolean, getbyte, getdouble, getfloat idem pour des attributs de type int, boolean, byte, double ou float while( rs.next() ) { String nom = rs.getstring("nom"); int age = rs.getint("age"); System.out.println( nom + " a " + age + " ans" ); } Utilisation de (code complet) import java.sql.*; public class Test { public static void main( String[] args ) throws Exception { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection cx = DriverManager.getConnection( "jdbc:odbc:ages", "", "" ); ResultSet rs = st.executequery( "SELECT * FROM ages" ); while (rs.next()) { String nom = rs.getstring("nom"); int age = rs.getint("age"); System.out.println( nom + " a " + age + " ans" ); } } } /** Fermetures */ rs.close(); st.close(); cx.close(); 9 Lionel Seinturier 10 Lionel Seinturier Correspondances types données SQL/Java Correspondances types données SQL/Java Type SQL CHAR VARCHAR Type Java String Méthode getter getstring() Type SQL DATE Type Java java.sql.date Méthode getter getdate() INTEGER int getint() TIME java.sql.time gettime() TINYINT byte getbyte() TIMESTAMP java.sql.timestamp gettimestamp() SMALLINT BIGINT short long getshort() getlong() TIMESTAMP heure avec nanosecondes BIT REAL FLOAT DOUBLE boolean float double getboolean() getfloat() getdouble() rs.getstring(string attributname) ou rs.getstring(int colnum) peuvent être utilisés pour n'importe quel type de paramètre! récupération de la valeur de l'attribut sous forme de chaîne NUMERIC DECIMAL java.math.bigdecimal getbigdecimal() 11 Lionel Seinturier 12 Lionel Seinturier

Types pour les données de grande taille BLOB Binary Large OBject CLOB Character Large OBject! permettent de stocker des données de grande taille (ex. : fichier) dans une table Curseurs multi-directionnel (scrollable) & dynamique (updatable) Par défaut ResultSet avance seule + lecture seule Connexion cx =... Statement st = cx.createstatement( int direction, int maj ); Type SQL BLOB CLOB Type Java java.lang.object java.lang.object Méthode getter getobject() getobject() direction ResultSet.TYPE_FORWARD_ONLY ResultSet.TYPE_SCROLL_INSENSITIVE ResultSet.TYPE_SCROLL_SENSITIVE maj ResultSet.CONCUR_READ_ONLY ResultSet.CONCUR_UPDATABLE 13 Lionel Seinturier 14 Lionel Seinturier Curseurs multi-directionnel (scrollable) & dynamique (updatable) Exemple curseur multi-directionnel Connexion cx =... Statement st = cx.createstatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY ); ResultSet rs = st.executequery( "..." ); boolean rs.absolute( int row ); boolean rs.relative( int row ); int getrow(); boolean next(); boolean previous(); void beforefirst(); void afterlast(); boolean isfirst(); boolean islast(); Curseurs multi-directionnel (scrollable) & dynamique (updatable) Exemple curseur dynamique Connexion cx =... Statement st = cx.createstatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE ); ResultSet rs = st.executequery( "..." ); void rs.updatestring( int columnindex, String value ); void rs.updatestring( String columnname, String value ); updatedouble, updateshort, updatedate, updateobject,...!! modification prise en compte seulement après!! void rs.updaterow(); 15 Lionel Seinturier 16 Lionel Seinturier

Types de requêtes SQL Requêtes SQL précompilées "normale" - interprétée à chaque exécution précompilée - paramétrable - préparée pour être exécutée plusieurs fois - gérée par le programme procédure stockée - paramétrable - écrite dans le langage interne du SGBD (ex SQL Server Transac-SQL) - gérée par le SGBD + masque schéma base - langage propriétaire (- évolution) + meilleures perf - risque de mélange + validées par rapport schéma base logiques traitement/donnée 1. Création en utilisant un objet de la classe Connection Possibilité de définition de 1 ou +sieurs paramètres! caractères? PreparedStatement pst = cx.preparestatement("select * FROM ages WHERE nom=? AND age>?"); 2. Les paramètres sont renseignés par des appels à des méthodes setter pst.setstring( 1, "Paul" ); // 1 = 1er? pst.setint( 2, 25 ); // 2 = 2ème? Rq : setboolean, setbyte, setdouble, setfloat pour les autres types 3. Exécution de la requête ResultSet rs = pst.executequery(); Rq : executeupdate pour les autres types de requêtes SQL 17 Lionel Seinturier 18 Lionel Seinturier Procédures stockées Transactions Exemple de procédure stockée Transact-SQL (SQL Server) CREATE PROCEDURE [pubs].[getrange] @age int AS SELECT nom FROM ages WHERE age < @age GO Le code d appel de la procédure CallableStatement cst = cx.preparecall("{call pubs.getrange(?)}"); cst.setint( 1, 25 ); ResultSet rs = cst.executequery(); Groupes de requêtes devant être exécutés de façon indivisible La transaction doit être - validée (commit)! les résultats ne sont visibles qu'à partir de ce moment -ou annulée(rollback) cx.setautocommit(false); déclaration du début de la transaction st.executeupdate( "INSERT INTO ages VALUES ('Pierre',12)" ); st.executeupdate( "UPDATE ages SET age=15 WHERE nom='paul'" ); cx.commit(); validation de la transaction 19 Lionel Seinturier 20 Lionel Seinturier

Transactions Niveau d'isolation des transactions Exemple CREATE TABLE comptes ( nom VARCHAR(30) PRIMARY KEY, solde FLOAT CHECK(solde>=0) ); cx.setautocommit(false); try { st.executeupdate("update comptes SET solde=solde+montant WHERE nom='paul'" ); st.executeupdate("update comptes SET solde=solde-montant WHERE nom='bob'" ); cx.commit(); } catch( SQLException e ) { cx.rollback(); } 21 Lionel Seinturier Différents niveaux d'isolation possibles pour les transactions ( à quel moment les résultats des transactions sont visibles) Positionables par appel à cx.settransactionisolation(niveau); TRANSACTION_SERIALIZABLE (niveau = 8) -t 1 lit un ensemble d'enregistrement -t 2 ajoute un enregistrement à l'ensemble -sit 1 lit à nouveau l'ensemble, il ne voit pas celui ajoutée par t 2! les transactions apparaissent comme si elles avaient été exécutées en séquence TRANSACTION_REPEATABLE_READ (niveau = 4) -t 1 lit un enregistrement -t 2 modifie cet enregistrement -sit 1 lit à nouveau l'enregistrement, il lit la même valeur que précédemment 22 Lionel Seinturier Niveau d'isolation des transactions Traitement par lots (batch) TRANSACTION_READ_COMMITED (niveau = 2) -t 1 modifie un enregistrement -t 2 ne peut pas lire cet enregistrement tant que t 1 n'a pas été engagée (ou annulée) TRANSACTION_READ_UNCOMMITED (niveau = 1) -t 1 modifie un enregistrement -t 2 peut lire cet enregistrement TRANSACTION_NONE (niveau = 0) pas de support pour les transactions Selon les couples (BD, driver ), tous ces modes ne sont pas forcément disponibles dirty reads interdits dirty reads autorisés 23 Lionel Seinturier But : réduire le coût d'une série de mise à jour 1. Création d'une requête en utilisant un objet de la classe Connection 2. Ajout des différentes requêtes st.addbatch( "INSERT INTO ages VALUES ('Pierre',45)" ); st.addbatch( "INSERT INTO ages VALUES ('Anne',45)" ); st.addbatch( "UPDATE ages SET age=15 WHERE nom='paul'" ); 3. Exécution des requêtes (dans l'ordre dans lequel elles ont été ajoutées) int[] res = st.executebatch(); Rq : possibilité d'insérer le lot dans une transaction! 0. cx.setautocommit(false);! 4. cx.commit(); 24 Lionel Seinturier

Méta-base Méta-base La plupart des programmes sont écrits pour des schémas de tables connus But de la méta-base : découvrir à l'exécution le schéma des tables Avantage : le programme peut manipuler n'importe quel schéma 1. Récupération des enregistrements d'une table ResultSet rs = st.executequery( "SELECT * FROM ages" ); 2. Récupération d'un objet de la classe ResultSetMetaData décrivant le ResultSet ResultSetMetaData rsmd = rs.getmetadata(); 3. Interrogation du ResultSetMetaData pour découvrir le schéma de la table ages int columncount = rsmd.getcolumncount(); String collabel = rsmd.getcolumnlabel(i); String coltype = rsmd.getcolumntypename(i); // # de colonnes // nom de la colonne i // type de la colonne i La méta-base contient aussi des informations sur les tables contenues dans la base 1. Récupération d'un objet de la classe DatabaseMetaData décrivant la base DatabaseMetaData dbmd = cx.getmetadata(); 2. Récupération des tables (utilisateur) de la base ResultSet tables = dbmd.gettables(null,null,null,{"table"}); 3. Récupération des noms des tables (itération sur le ResultSet) while ( tables.next() ) { String tablename = tables.getstring("table_name"); } Rq : nombreuses autres possibilités d'interrogation du DatabaseMetaData 25 Lionel Seinturier 26 Lionel Seinturier Trou de sécurité (bien connu) Déclaration de sources de données ODBC Attaque "SQL injection" à partir de formulaires Web CREATE TABLE notes ( netudiant text, note float ); Formulaire traité JSP (idem PHP, ASP, ) String num = request.getparameter("netudiant"); String requete = "SELECT * FROM notes WHERE netudiant='"+num+"'"; ResultSet rs = st.executequery(requete); Utilisation avec un driver de classe I (passerelle -ODBC) ODBC : standard Microsoft d'accès à une source de données ex. source de données = fichier.mdb créé avec Access Panneau de configuration rubrique ODBC (32 bits) Saisie '; SELECT * FROM notes WHERE ''=' requete = SELECT * FROM notes WHERE netudiant=''; SELECT * FROM notes WHERE ''=''! toutes les notes!! clic 27 Lionel Seinturier 28 Lionel Seinturier

Déclaration de sources de données ODBC Liste des pilotes ODBC disponibles Double-clic sur "MS Access" Déclaration de sources de données ODBC Création d'une nouvelle source Sélectionner (le fichier.mdb) double clic clic 29 Lionel Seinturier 30 Lionel Seinturier Déclaration de sources de données ODBC Saisir un nom pour la source de données Déclaration de sources de données ODBC Source de données enregistrée clic 31 Lionel Seinturier 32 Lionel Seinturier

Récupération de valeurs auto-générées 3.0 (JDK 1.4) récupération de valeurs auto-générées curseurs & transactions ResultSet multiples gestion pool de connexions pool de PreparedStatement points de reprise dans les transactions 4.0 (JDK 1.5) colonne auto incrémentée à chaque ajout de tuple valeur unique générée automatiquement type auto_increment (MySQL), serial (PostGreSQL), CREATE TABLE users ( id INT AUTO_INCREMENT, nom VARCHAR(30) ) String req = "INSERT INTO users (nom) VALUES ('Bob')"; st.executestatement( req, Statement.RETURN_GENERATED_KEYS ); ResultSet rs = st.getgeneratedkeys(); rs.next(); 1 int key = rs.getint(1); // éventuellement +sieurs 0 1 Robert Bob mode déconnecté RowSet 33 Lionel Seinturier 34 Lionel Seinturier Curseurs & transactions curseur ouvert pendant transaction peut-être conservé après la fin de la transaction createstatement(), preparestatement(), preparecall() param. suppl. ResultSet.HOLD_CURSORS_OVER_COMMIT ResultSet multiples procédure stockée retournant +sieurs résultats consultation en // des différents résultats (en séquence < 3.0) ResultSet rs1 = cst.executequery(); ResultSet rs1 = cst.getmoreresults(statement.keep_current_result); Gestion pool de connexion optimiser/réguler les cx vers les SGBD pool gère et partage les cx de +sieurs appli Nouveautés 3.0 : standardisation propriétés initialpoolsize minpoolsize maxpoolsize maxidletime # secondes propertycycle # secondes entre 2 exec. politique de gestion du pool maxstatement # max de Statement ouvert pour 1 cx du pool Pool de PreparedStatement 35 Lionel Seinturier 36 Lionel Seinturier

Points de reprise dans les transactions points de sauvegarde intermédiaires dans une transaction plus sûr retour à un point à la demande avant fin transaction cx.setautocommit(false); Savepoint sp1 = cx.setsavepoint(); Savepoint sp2 = cx.setsavepoint(); cx.rollback(sp1); 37 Lionel Seinturier Mode déconnecté RowSet par défaut c/s connecté vers SGBD + 1 seule copie des données (SGBD) + mises à jour simples connecté vs non connecté n messages petite taille vs 1 message grande taille rés eau rés eau Déconnecté pouvoir consulter/modifier les données off line économiser les ressources réseaux (connexions moins longues) travailler sur des données en mémoire plutôt que directement sur un SGBD SELECT SELECT 38 Lionel Seinturier Mode déconnecté RowSet CachedRowSet : manipulation de données en mémoire JdbcRowSet : 1 rowset Java Bean utilisé avec comp. graph. JTable, JTree, JList, WebRowSet : 1 rowset associé à un fichier XML java.sql Mode déconnecté RowSet CachedRowSet ResultSet rs =... CachedRowSet crs = new CachedRowSet(); crs.populate(rs); cx.close(); // manipulation de crs javax.sql javax.sql.rowset crs.acceptchanges(); RowSet crs.populate(rs); com.sun.rowset 39 Lionel Seinturier 40 Lionel Seinturier