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



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

Java DataBaseConnectivity

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

JDBC le langage Java XVI-1 JMF

Programmation d application Bases de données avec Java

TP Programmation Java / JDBC / Oracle

Accès aux bases de données

JDBC JDBC. Java DataBase Connectivity

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

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)

Java et les bases de données

Java Database Connectivity (JDBC) - Langage SQL

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

1. Langage de programmation Java

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

CREATION WEB DYNAMIQUE

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

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

Paradox 9. Guide de l utilisateur jpdox Web Utilities

Dialogue avec la base de données

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

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

Java - MySQL. Code: java-mysql

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

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

Application web de gestion de comptes en banques

Développement d applications avec les bases de données

Programme Compte bancaire (code)

Panorama des Bases de Données

Package Java.util Classe générique

PHP. PHP et bases de données

[BASE DE DONNEES MULTIMEDIA]

Les bases de données

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

Gestion distribuée (par sockets) de banque en Java

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

Premiers Pas en Programmation Objet : les Classes et les Objets

TP3 : Manipulation et implantation de systèmes de fichiers 1

TD/TP PAC - Programmation n 3

A QUOI SERVENT LES BASES DE DONNÉES?

TD3: tableaux avancées, première classe et chaînes

Programmer en JAVA. par Tama

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

Alfstore workflow framework Spécification technique

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

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

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

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

TD/TP PAC - Programmation n 3

Cours 1: Java et les objets

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

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

Création d une application JEE

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

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

PROJET 1 : BASE DE DONNÉES REPARTIES

Programmation avec des objets : Cours 7. Menu du jour

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

Auto-évaluation Programmation en Java

Corrigé des exercices sur les références

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

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

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Solutions du chapitre 4

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

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Programmation en Java IUT GEII (MC-II1) 1

FileMaker 13. Guide de référence SQL

Programmation par les Objets en Java

Mapping Objet Relationnel (ORM) Partie 1 : Principes & Fonctionnement en lecture SQL Généré Optimisations

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

Construire une base de donnée pour bibliothèque

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

Logiciel de gestion de caisse et d ardoises

TP, première séquence d exercices.

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)

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

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

TP Contraintes - Triggers

PROGRAMMATION PAR OBJETS

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

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Olivier Mondet

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

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é

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

Travaux Pratiques : Lucène - Gestion d un index plein texte

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

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

Implémentation des SGBD

Connexion à une base de données. Connexion à une base de données. Connexion à une base de données Développement d'une application

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

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

Architecture Orientée Service, JSON et API REST

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

Les bases de l optimisation SQL avec DB2 for i

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

Transcription:

Cours Bases de données 2ème année IUT Cours 7 : JDBC : ou comment lier ORACLE avec Java 2ème partie Anne Vilnat http://www.limsi.fr/individu/anne/cours

Plan 1 Interfaces Java de l API JDBC Connexion Statement ResultSet ResultSetMetadata 2 Requêtes pré-compilées

Les classes et interfaces du package java.sql Connexion createstatement preparestatement preparecall Statement sous classe PreparedStatement sous classe CallableStatement executequery executequery Entrées de PS Data Types Entrées/Sorties de CS executequery getxxx getmoreresults/getresultset ResultSet

Principales interfaces Java de l API JDBC Généralités Interfaces donc méthodes définies comme public abstract. Susceptibles de lever des exceptions SQLException. Les interfaces Principales interfaces : Connection Statement ResultSet ResultSetMetaData

Connexion Les transactions Par défaut, autocommit on. Pour gérer les transactions : void setautocommit (boolean autocommit) throws SQLException; void commit ( ) throws SQLException; void rollback ( ) throws SQLException; boolean getautocommit ( ) throws SQLException; Pour clore : void close ( ) throws SQLException; boolean isclosed ( ) throws SQLException; Pour transcoder les chaînes de caractères : String nativesql (String sql) throws SQLException;

Définition du Statement Statement Définit les objets qui permettent d exécuter les requêtes statiques SQL et de retourner le résultat produit. Donne le type et les propriétés du ResultSet qui lui sera associé Un seul ResultSet est actif à la fois. Si plusieurs, il faut plusieurs Statement

Créer un Statement Les instructions Pour créer différents Statement qui donneront des ResultSet ayant des propriétés différentes : Statement createstatement ( ) throws SQLException; Statement createstatement (int rstype, int rsconcurrency) throws SQLException; Statement createstatement (int rstype, int rsconcurrency, int rsholdability) throws SQLException; permet de définir le type du ResultSet (rstype), sa navigabilité le fait qu il permette ou non des mises à jour (rsconcurrency) son comportement lors d un commit (rsholdability)

Principales méthodes sur un Statement Méthodes Principales méthodes : Pour créer un ResultSet contenant les résultats d une requête : ResultSet executequery (String sql) throws SQLException; void close ( ) throws SQLException; int executeupdate (String sql) throws SQLException; boolean execute (String sql) throws SQLException;

Les ResultSet : quelles possibilités? Différents types de ResultSet Navigabilité : TYPE FORWARD ONLY (défaut) : navigation en avant uniquement; TYPE SCROLL INSENSITIVE : dans tous les sens, et où on veut, mais pas d accès aux modifications sur la source de données depuis l ouverture du ResultSet; TYPE SCROLL SENSITIVE : navigation + accès aux modifications;

Les ResultSet : quelles possibilités? Différents types de ResultSet (suite) Mise à jour : CONCUR READ ONLY (défaut) : pas de modification CONCUR UPDATABLE : modifications possibles Comportement à la validation : HOLD CURSORS OVER COMMIT : reste ouvert lors d une validation (COMMIT ou ROLLBACK) CLOSE CURSORS AT COMMIT (défaut) : fermé après chaque validation.

Exemple de ResultSet Pour pouvoir : Exemple parcourir le résultat de la requête dans n importe quel sens, sans avoir accès à d éventuelles modifications dans les données sur la base, sans pouvoir modifier les éléments au travers du ResultSet, et fermer le ResultSet si un commit a lieu : Statement stm = co.createstatement(resultset.type SCROLL INSENSITIVE, ResultSet.CONCUR READ ONLY, ResultSet.CLOSE CURSOR AT COMMIT); ResultSet rs=stm.executequery( SELECT * FROM Film );

Exemple de ResultSet Code Java stm SELECT * FROM Film Film rs BD

Mouvements dans un ResultSet (1) Les méthodes Lors de la création : pointe avant la première ligne. Si de type TYPE FORWARD ONLY, que : sinon : next() :passe à la ligne suivante. retourne true si elle existe, false sinon (après la dernière ligne). previous() : ligne précédente first() : sur la première ligne, retourne true si elle existe, false sinon (resultset vide) last() : sur la dernière; beforefirst() : avant la première (comme à l ouverture) afterlast () : après la dernière

Mouvements dans un ResultSet (2) Les méthodes (suite) relative(int rows) : rows lignes après la position courante, revient en arrière si rows est négatif; absolute(int row) : se place à la row-ième ligne. Si row est égal à 1 : sur la première, si row est négatif, sur la dernière. (si 0, sur la première aussi) Exemple Statement stm = co.createstatement(resultset.type SCROLL INSENSITIVE); ResultSet rs=stm.executequery( SELECT * FROM Film ); rs.absolute(3); // positionne sur la 3ème ligne; rs.relative(5); // positionne sur la 8ème ligne

Exemple de navigation dans un ResultSet Code Java stm SELECT * FROM Film Film rs BD

Modifications d un ResultSet : mise à jour d une ligne Définition Si ouvert en mode CONCUR UPDATABLE, permet la mise à jour de la base par le biais du ResultSet (sinon on le fera par execute ou executeupdate) Mise à jour d une ligne En 2 étapes : mise à jour de la nouvelle valeur de la colonne : updatexxx changements affectés à la ligne concernée (alors seulement la base sera mise à jour) : updaterow()

Modifications d un ResultSet : Exemple de mise à jour Exemple Statement stm = co.createstatement(resultset.type FORWARD ONLY, ResultSet.CONCUR UPDATABLE); SELECT Titre FROM Film WHERE NumFilm=123 ); rs.next(); // positionne sur la 1ère ligne; rs.updatestring( Titre, Charlie et la chocolaterie ); //modifie l attribut Titre rs.updaterow(); // effectue la modification de la ligne

Mise à jour avec un ResultSet Exemple Statement stm = co.createstatement(resultset.type FORWARD ONLY, ResultSet.CONCUR UPDATABLE); ResultSet rs=stm.executequery( SELECT Titre FROM Film WHERE NumFilm=123 ); rs.next(); Code Java stm SELECT Titre FROM Film WHERE NumFilm=123 Film Charlie et la friterie rs BD

Mise à jour avec un ResultSet Exemple Statement stm = co.createstatement(resultset.type FORWARD ONLY, ResultSet.CONCUR UPDATABLE); ResultSet rs=stm.executequery( SELECT Titre FROM Film WHERE NumFilm=123 ); rs.next(); rs.updatestring( Titre, Charlie et la chocolaterie ); Code Java stm SELECT Titre FROM Film WHERE NumFilm=123 Film rs.updatestring(...) Charlie et la chocolaterie rs BD

Mise à jour avec un ResultSet Exemple Statement stm = co.createstatement(resultset.type FORWARD ONLY, ResultSet.CONCUR UPDATABLE); ResultSet rs=stm.executequery( SELECT Titre FROM Film WHERE NumFilm=123 ); rs.next(); rs.updatestring( Titre, Charlie et la chocolaterie ); rs.updaterow(); Code Java stm SELECT Titre FROM Film WHERE NumFilm=123 Film rs.updatestring(...) Charlie et la chocolaterie rs rs.updaterow() BD

Modifications d un ResultSet : suppression d une ligne Suppression d une ligne Si ouvert en mode CONCUR UPDATABLE, permet la suppression de la ligne dans la base : deleterow(). Se place ensuite avant la première ligne valide suivant celle qui vient d être supprimée. Son indice devient invalide. test de l existence d une ligne par rowdeleted Exemple Statement stm = co.createstatement(resultset.type SCROLL INSENSITIVE,); ResultSet.CONCUR UPDATABLE); ResultSet rs=stm.executequery( SELECT * FROM Film ); rs.absolute(4); // positionne sur la 4ème ligne; rs.deleterow(); //supprime la ligne bool =rs.rowdeleted(); // bool vaut vrai

Modifications d un ResultSet : insertion d une ligne Définition Si ouvert en mode CONCUR UPDATABLE, permet l insertion de nouvelles lignes Insertion d une ligne En 3 étapes : se positionner sur la ligne d insertion : movetoinsertrow(): initialiser les valeurs des champs de la ligne à insérer : updatexxx, insérer la ligne : insertrow()

Modifications d un ResultSet : Exemple d insertion Exemple Statement stm = co.createstatement(resultset.type SCROLL INSENSITIVE,); ResultSet.CONCUR UPDATABLE); ResultSet rs=stm.executequery( SELECT Prenom, Nom, NumIndividu FROM Individu ); rs.movetoinsertrow(); // positionne sur une ligne d insertion; rs.updatestring(1, Pedro );//crée le prénom rs.updatestring(2, Almodovar );//crée le nom rs.updatelong(3, 278866500);//crée le num... rs.insertrow(); // insère la ligne rs.movetocurrentrow(); // revient à l ancienne position

Modifications d un ResultSet : Exemple d insertion Exemple Statement stm = co.createstatement(resultset.type SCROLL INSENSITIVE, ResultSet.CONCUR UPDATABLE); ResultSet rs=stm.executequery( SELECT Prenom, Nom, NumIndividu FROM Individu ); rs.movetoinsertrow(); Code Java stm SELECT Prenom,Nom,NumIndividu FROM Individu Individu Penelope CRUZ 124 rs BD

Modifications d un ResultSet : Exemple d insertion Exemple Statement stm = co.createstatement(resultset.type SCROLL INSENSITIVE, ResultSet.CONCUR UPDATABLE); ResultSet rs=stm.executequery( SELECT Prenom, Nom, NumIndividu FROM Individu ); rs.movetoinsertrow(); rs.updatestring(1, Pedro ); rs.updatestring(2, Almodovar ); rs.updatelong(3, 278866500); rs.insertrow(); rs.movetocurrentrow(); Code Java stm SELECT Prenom,Nom,NumIndividu FROM Individu Individu Penelope CRUZ 124 Pedro ALMODOVAR 278866 rs BD

Meta données sur le ResultSet : ResultSetMetadata Interface pour obtenir des information supplémentaires sur la structure d un ResultSet. Pour répondre à : Combien de colonnes le ResultSet contient-il? Les noms de ces colonnes sont-ils sensibles à la casse? Est-il possible de rechercher des données dans la colonne de son choix? Est-il possible d affecter NULL à une colonne donnée? Quel est le nombre maximal de caractères affichables pour une colonne donnée? Quel libellé faut-il attribuer à la colonne choisie lors de l affichage? Quel est le nom de la colonne choisie? De quelle table la colonne choisie provient-elle? Quel type de données la colonne choisie renferme-t-elle?

ResultSetMetadata : Exemple Exemple Connection myconnexion = DriverManager.getConnection(url); Statement stmt = myconnexion.createstatement ( ); ResultSet rs = stmt.executequery ( SELECT a,b,c FROM Table1 ); ResultSetMetaData rsmd = rs.getmetadata ( ); int numberofcolumns = rsmd.getcolumncount ( ); for (int i = 1; i <= numberofcolumns; i++) { int jdbctype = rsmd.getcolumntype (i); String name = rsmd.getcolumntypename (i); System.out.print ( L attribut + i + est du type JDBC + jdbctype); System.out.println ( dont le nom de type JDBC est + name); }

Les requêtes pré-compilées Connexion createstatement preparestatement preparecall Statement sous classe PreparedStatement sous classe CallableStatement executequery executequery Entrées de PS Data Types Entrées/Sorties de CS executequery getxxx getmoreresults/getresultset ResultSet

Requêtes pré-compilées Motivation Si on doit répéter plusieurs fois la même requête en utilisant un objet Statement, à chaque fois le serveur devra interpréter la requête SQL et en particulier créer un plan de requête : particulièrement coûteux. utilisation de l interface PreparedStatement. Le code SQL est transmis à la base une seule fois, dès que la méthode preparestatement(), issue de la classe Connection délivre l objet PreparedStatement correspondant.

Requêtes pré-compilées : PreparedStatement Exemple PreparedStatement psm = myconnexion.preparestatement ( SELECT nom emp FROM employe WHERE prime > 999 AND service = Comptabilite AND salaire > 2499 ); for (int i = 0; i < 10; i++) { ResultSet myresultat = psm.executequery ( ); while (myresultat.next ( )) { // traitement des donnees recupérées... } } Pas forcément très intéressant!...

Requêtes pré-compilées : PreparedStatement (2) Avec des paramètres symbolisés par? et setxxx Exemple PreparedStatement psm = myconnexion.preparestatement ( UPDATE employe SET prime = prime +? WHERE num employe =? AND service =? ); while (suite ( )) { psm.setint (2, saisie numero employe ( )); psm.setint (1, saisie prime ( )); psm.setstring (3, saisie service ( )); int myresultat = psm.executeupdate ( ); } Avec : saisie numero employe, saisie prime, saisie service sont des méthodes, et suite est un booléen.

Les requêtes pré-compilées PreparedStatement psm = myconnexion.preparestatement ( UPDATE employe SET prime = prime +? (1) WHERE num employe =? (2) AND service =? ) ; (3) while (suite ( )) { psm.setint (2, saisie numero employe ( )) ; }...

Les requêtes pré-compilées PreparedStatement psm = myconnexion.preparestatement ( UPDATE employe SET prime = prime +? (1) WHERE num employe =? (2) AND service =? ) ; (3) while (suite ( )) { psm.setint (2, saisie numero employe ( )) ; psm.setint (1, saisie prime ( )); }...

Les requêtes pré-compilées PreparedStatement psm = myconnexion.preparestatement ( UPDATE employe SET prime = prime +? (1) WHERE num employe =? (2) AND service =? ) ; (3) while (suite ( )) { psm.setint (2, saisie numero employe ( )) ; psm.setint (1, saisie prime ( )); psm.setstring (3, saisie service ( )); } int myresultat = psm.executeupdate ( );