17. Interaction avec un SGBDR

Documents pareils
Java DataBaseConnectivity

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

Accès aux bases de données

Programmation d application Bases de données avec Java

OpenPaaS Le réseau social d'entreprise

TP Programmation Java / JDBC / Oracle

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

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

Java - MySQL. Code: java-mysql

JDBC le langage Java XVI-1 JMF

Java et les bases de données

1. Langage de programmation Java

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

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

CREATION WEB DYNAMIQUE

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)

INSTALLATION DE L APPLICATION DU CONTEXTE ITASTE

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

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

PHP. PHP et bases de données

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

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)

Programmer en JAVA. par Tama

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

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

1. Base de données SQLite

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

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

I4 : Bases de Données

SQL Historique

JDBC JDBC. Java DataBase Connectivity

as Architecture des Systèmes d Information

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

Construire une base de donnée pour bibliothèque

PHP 4 PARTIE : BASE DE DONNEES

I. MySQL : Serveur et SGBD

PDO : PHP Data Object 1/13

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

Olivier Mondet

Application web de gestion de comptes en banques

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

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

Les BASES de DONNEES dans WampServer

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é

Dialogue avec la base de données

Logiciel de gestion de caisse et d ardoises

Optimisations des SGBDR. Étude de cas : MySQL

Création et Gestion des tables

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

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

Java Database Connectivity (JDBC) - Langage SQL

Tous les autres noms de produits ou appellations sont des marques déposées ou des noms commerciaux appartenant à leurs propriétaires respectifs.

Bases de données relationnelles

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

Les bases de données

Création d une application JEE

Langage SQL : créer et interroger une base

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

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

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

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

FileMaker 10. Guide ODBC et JDBC

Paradox 9. Guide de l utilisateur jpdox Web Utilities

Stockage du fichier dans une table mysql:

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

Chapitre 10. Les interfaces Comparable et Comparator 1

P r ob lé m a t iq u e d e la g é n é r icit é. Pr in cip e d e la g é n é r icit é e n Ja v a ( 1 /3 )

Pratique et administration des systèmes

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

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

Historisation des données

Compétences Business Objects

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

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

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

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

Partie I : Créer la base de données. Année universitaire 2008/2009 Master 1 SIIO Projet Introduction au Décisionnel, Oracle

Tutoriel d installation de Hibernate avec Eclipse

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

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

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

BASES DE DONNEES TP POSTGRESQL

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Bases de données Oracle Virtual Private Database (VPD) pour la gestion des utilisateurs d applications

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

Présentation Windows Azure Hadoop Big Data - BI

TP Contraintes - Triggers

Programme Compte bancaire (code)

LES ACCES ODBC AVEC LE SYSTEME SAS

Encryptions, compression et partitionnement des données

Java Licence Professionnelle CISII,

Package Java.util Classe générique

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

TP Bases de données réparties

Transcription:

17. Interaction avec un SGBDR 17.1. Introduction Les programmes Java disposent d'un pont logiciel pour s'interfacer avec un SGBDR, représenté par une API nommé JDBC ( Java Database Connectivity ). Par l'intermédiaire de JDBC, vous pouvez programmer des créations de tables, des insertions et modifications de valeurs et aussi des requêtes, le tout dans un contexte de transactions avec gestion d'exceptions. 17.2. Pilotes JDBC L'API JDBC se trouve dans java.sql et les pilotes doivent implémenter l'interface java.sql.driver. Il existe quatre types de pilotes jdbc : Type 1 : Pont jdbc-odbc (livré en standard, idéal comme premier driver sous Windows) Type 2 : API native + un peu de java. Type 3 : Comme type 2 mais avec un protocole réseau tout en java. Type 4 : Protocole natif 100% java. Les éditeurs de SGBDR proposent leurs propres pilotes JDBC. Figure 29. Exemple de pilotes L'interaction à un système de gestion de base de données réquiert en général au moins quatre étapes : 1. Chargement du pilote 2. Etablissement de la connexion 3. Exécution d'une requête 4. Exploitation des résultats Les étapes 1 et 2 le sont pour un ensemble d'opérations (étapes 3 et 4). Nous présentons ci-dessous chacune de ces étapes.

I - Chargement du pilote dans la JVM ( Java Virtual Machine ) On charge généralement le pilote par son nom. Ci-dessous, un exemple de programme chargeant un des deux pilotes définis sous forme de chaînes de caractères. final String driverpostgresql = "jdbc.postgresql.driver"; // driver PostgreSql final String driverodbc = "sun.jdbc.odbc.jdbcodbcdriver"; // driver odbc inclus dans le jdk // (pratique sous Windows pour SQL Server, Access...) final String driverhsql = "org.hsqldb.jdbcdriver"; // driver Hypersonic SQL final String drivermysql = "com.mysql.jdbc.driver"; // MySql String driver = driverhsql; Class.forName(driver).newInstance(); // Autochargement du driver II - Etablissement de la connexion Une fois le driver chargé en mémoire, nous pouvons obtenir une connexion via la méthode de classe getconnection() de la classe DriverManager Connection con = DriverManager.getConnection(URL, "user", "passwd"); // URL : url de connexion de la forme jdbc:sous-protocole:sous-nom // sous-protocole:identification du pilote // sous-nom : informations nécessaires au pilote // pour la connexion (chemin, port, nom) // "passwd" : Mot de passe // "user" : Nom de l'utilisateur référencé par la base Exemple //final String driver = "org.hsqldb.jdbcdriver"; // final String url = "jdbc:hsqldb:/home/kpu/hsql/refuge/refuge"; final String driver = "com.mysql.jdbc.driver"; final String url = "jdbc:mysql://localhost/refuge"; final String user="sa"; final String password="; Connection con = null; try { Class.forName(driver).newInstance(); con = DriverManager.getConnection(url, user, password);...

III - Exécution d'une requête SQL L'exécution d'une requête SQL s'effectue via un objet de la classe java.sql.statement. C'est l'objet Connection qui nous fournira une référence d'objet Statement (à ne pas instancier directement ). Exemple : Statement stat = con.createstatement(); L'accès aux données peut être densible ou non aux accès concurrents et la navigation dans le modèle peut être possible ou non (forward only). Statement stat = con.createstatement(); Statement stmt = con.createstatement(resultset.type_scroll_sensitive, ResultSet.CONCUR_READ_ONLY); // autre exemple, une source de onnée insensible aux changements concurrents Statement stmt = con.createstatement(resultset.type_scroll_insensitive, ResultSet.CONCUR_READ_ONLY); plus d'info ici On distingue deux types de requêtes : requête d'interrogation et de mise à jour. Requête d'interrogation avec l'ordre SELECT Nous utiliserons la méthode de Statement executequery( ) qui retourne un objet java.sql.resultset. ResultSet rs = stat.executequery("select * FROM ANIMAL"); Requête de mise à jour avec les ordres UPDATE, INSERT, DELETE On utilisera la méthode executeupdate( ) de Statement. Cet exemple supprime de la table ENTREPRISES toutes les entreprises de Seine et Marne. stat.executeupdate( "DELETE FROM ENTREPRISES WHERE CODEPOST LIKE '77%'"); IV - Exploitation des résultats 17.6.1. Requête d'interrogation avec l'ordre SELECT Le retour d'un ordre executequery(...) est un objet de type ResultSet, une collection de lignes constituées de 1 à n attributs (colonnes). Pour accéder à la première ligne du résultat, il est nécessaire d'appeler la méthode next(), pour passer à la ligne suivante, il suffit d'appeler de nouveau cette méthode, etc. ResultSet rs = stat.executequery("select * FROM ANIMAL"); // Pour accéder à chacun des tuples du résultat de la requête : while (rs.next()) { String nom = rs.getstring("nom"); java.sql.date date_nais = rs.getdate("date_nais"); int id = rs.getint(1); } Remarque 1 : L'appel à la méthode next() de l'objet Statement est obligatoire avant tout appel aux méthodes permettant d'accéder à une valeur d'un attribut de la ligne courante. Remarque 2 : Il y a deux façons d'accéder à une valeur d'un attribut (colonne) : 1/ soit par le nom de la colonne, comme par exemple les deux premiers appels de l'exemple. 2/ soit par position, qui commence à la position 1 (et non 0 comme avec les collections), comme le montre le troisième appel.

17.6.2. Requête de mise à jour (UPDATE, INSERT, DELETE) La méthode executeupdate( ) de Statement, ne retourne pas un objet java.sql.resultset mais retourne le nombre de lignes impactées par l'instruction. Cet exemple supprime de la table ENTREPRISES toutes les entreprises de Seine et Marne. int count = stat.executeupdate( "DELETE FROM ENTREPRISES WHERE CODEPOST LIKE '77%'"); System.out.println("Il y a eu " + count + " lignes supprimées."); 17.7. Requêtes paramétrées Pour des raisons d'efficacité et de souplesse de construction des requêtes paramétrés (concaténation et placer les valeurs entre quotes ou non), le développeur peut utiliser un objet PreparedStatement pour envoyer des instructions SQL. L'exemple suivant illustre les deux approches (source : tutoriel jdbc) : Code Fragment 1: String updatestring = "UPDATE COFFEES SET SALES = 75 " + "WHERE COF_NAME LIKE 'Colombian'"; stmt.executeupdate(updatestring); Code Fragment 2: PreparedStatement updatesales = con.preparestatement( "UPDATE COFFEES SET SALES =? WHERE COF_NAME LIKE? "); updatesales.setint(1, 75); updatesales.setstring(2, "Colombian"); updatesales.executeupdate(): La deuxième version, bien que plus verbeuse, nous permet de mieux structurer nos instructions et de ne pas gérer la présence ou non de quotes encadrantes. On constatera l'usage de méthodes setxxx selon le type de l'argument SQL attendu, et que l'appel à executeupdate se fait sans argument. De plus, une requête préparée est toujours compilée par avance côté SGBDR, ce qui accélère son traitement, surtout en cas d'appels répétés, dans une boucle par exemple. 17.8. Exemple de programme Le programme ci-dessous utilise une base nommée Refugedb. Cette base de données contient une table nommée ANIMAL; voici un script de création : CREATE TABLE ANIMAL ( id INTEGER PRIMARY KEY, categorie VARCHAR NOT NULL, nom VARCHAR, race VARCHAR, sexe CHAR, date_nais DATE, id_proprio INTEGER, present BIT ) INSERT INTO ANIMAL VALUES (1,'CRM', 'kiki','berger','m','2000-2-21',21,false) INSERT INTO ANIMAL VALUES (2,'CRM','rex','caniche','M','1996-12-2',11,true)

... Lorsque l'on accède à une base de données, une gestion des exceptions s'avère nécessaire car de multiples problèmes peuvent survenir : le pilote ne peut être chargé (introuvable?), connexion refusée, requête SQL mal formée... Voici l'exemple complet. 1 import java.sql.*; 2 3 public class TestAnimal { 4 public void test() { 5 final String driver = "org.hsqldb.jdbcdriver"; 6 final String url = "jdbc:hsqldb:file:/home/kpu/refuge/refugedb"; 7 final String user = "sa"; 8 final String password =""; 9 10 Statement st = null; 11 Connection con = null; 12 ResultSet rs = null; 13 String sql = ""; 14 try { 15 Class.forName(driver).newInstance(); 16 con = DriverManager.getConnection(url, user, password); 17 st = con.createstatement(); 18 sql = "SELECT * FROM ANIMAL"; 19 rs = st.executequery(sql); 20 System.out.println("ID\tTYPE\tNOM\t\tRACE\t"); 21 while (rs.next()) { 22 System.out.print(rs.getInt(1)+"\t"); 23 // ATTENTION, les indices commencent à 1. 24 System.out.print(rs.getString(2)+"\t"); 25 System.out.print(rs.getString("nom")+"\t\t"); 26 System.out.println(rs.getString("race")+"\t"); 27 }//while 28 } 29 catch (ClassNotFoundException e) { 30 System.err.println("Classe non trouvée : " + driver ); 31 } 32 catch (SQLException e) { 33 System.err.println("SQL erreur : "+ sql + " " + e.getmessage()); 34 } 35 catch (Exception e) { 36 System.err.println("Erreur : "+ e); 37 } 38 39 finally { 40 try { if (con!= null) { con.close(); } } 41 catch (Exception e) { System.err.println(e); } 42 } 43 } 44 static public void main(string[] arg) { 45 TestAnimal app = new TestAnimal(); 46 app.test(); 47 } 48 } Quelques commentaires : Ligne 15 : Chargement du pilote Hypersonic SQL. Ligne 16 : Etablissement d'une connexion à la base. Ligne 17 : Création d'un objet Statement en préparation à l'exécution d'une requête SQL. Lignes 18-27 : Selection de toutes les lignes de la table ANIMAL. Affichage de quelques attributs (ID, TYPE, NOM et RACE). La condition de poursuite dans le while permet d'avancer à la prochaine ligne et de tester si la fin n'est pas atteinte (rend false alors). Lignes 29-37 : Une gestion des exceptions. Lignes 39-42 : A ne pas oublier, fermeture de la connexion.