Le protocole JDBC (Java DataBase Connectivity)

Post on 20-May-2022

24 views 0 download

Transcript of Le protocole JDBC (Java DataBase Connectivity)

IS 2ASysteme d’Information a Objets

Le protocole JDBC(Java DataBase Connectivity)

Olivier Caron

Polytech LilleAvenue Paul Langevin Cite ScientifiqueUniversite de Lille59655 Villeneuve d’Ascq cedex

http://ocaron.polytech-lille.netOlivier.Caron@polytech-lille.fr

Olivier Caron 9 juillet 2021 1/36

IS 2ASysteme d’Information a Objets

L’ancetre ODBC

Programme ODBCselect * from personne

ODBC ODBC ODBC

Oracle Postgres Excel

Olivier Caron 9 juillet 2021 2/36

IS 2ASysteme d’Information a Objets

JDBC

• Langage Java (multi-plateforme :-)

• Interface de programmation (API)1

• Adopte et implemente par presque tous les constructeurs

• Passerelle ODBC-JDBC

1Un fichier First.java contenant les exemples JDBC du cours est disponible surmes pages webs

Olivier Caron 9 juillet 2021 3/36

IS 2ASysteme d’Information a Objets

JDBC

• Langage Java (multi-plateforme :-)

• Interface de programmation (API)1

• Adopte et implemente par presque tous les constructeurs

• Passerelle ODBC-JDBC

1Un fichier First.java contenant les exemples JDBC du cours est disponible surmes pages webs

Olivier Caron 9 juillet 2021 3/36

IS 2ASysteme d’Information a Objets

JDBC

• Langage Java (multi-plateforme :-)

• Interface de programmation (API)1

• Adopte et implemente par presque tous les constructeurs

• Passerelle ODBC-JDBC

1Un fichier First.java contenant les exemples JDBC du cours est disponible surmes pages webs

Olivier Caron 9 juillet 2021 3/36

IS 2ASysteme d’Information a Objets

JDBC

• Langage Java (multi-plateforme :-)

• Interface de programmation (API)1

• Adopte et implemente par presque tous les constructeurs

• Passerelle ODBC-JDBC

1Un fichier First.java contenant les exemples JDBC du cours est disponible surmes pages webs

Olivier Caron 9 juillet 2021 3/36

IS 2ASysteme d’Information a Objets

Des utilisations possibles des protocoles

Programme JDBCselect * from personne

ODBC JDBC ODBC

Oracle Postgres Excel

ODBC JDBC

JDBC-ODBC

...Access Access

Olivier Caron 9 juillet 2021 4/36

IS 2ASysteme d’Information a Objets

Structuration d’un programme JDBC

Votre code JavaProgramme Java

JDBC APIjava.sql.* et/ou javax.sql.*

Driver Cible

JDBC API

/usr/share/java/postgresql-jdbc4.jar Ou /usr/share/java/postgresql.jar

Base de données

Compilation, execution d’un programme Java-JDBC :javac progs/First.java

java -cp /usr/share/java/postgresql.jar:. progs.First

Olivier Caron 9 juillet 2021 5/36

IS 2ASysteme d’Information a Objets

Deroulement d’un programme JDBC

• Deroulement classique :

1 Connexion a une base2 Execution de requetes et recuperation des donnees3 Deconnexion

• Plein d’autres variantes (ex : acces multi-bases)

Olivier Caron 9 juillet 2021 6/36

IS 2ASysteme d’Information a Objets

Deroulement d’un programme JDBC

• Deroulement classique :1 Connexion a une base

2 Execution de requetes et recuperation des donnees3 Deconnexion

• Plein d’autres variantes (ex : acces multi-bases)

Olivier Caron 9 juillet 2021 6/36

IS 2ASysteme d’Information a Objets

Deroulement d’un programme JDBC

• Deroulement classique :1 Connexion a une base2 Execution de requetes et recuperation des donnees

3 Deconnexion

• Plein d’autres variantes (ex : acces multi-bases)

Olivier Caron 9 juillet 2021 6/36

IS 2ASysteme d’Information a Objets

Deroulement d’un programme JDBC

• Deroulement classique :1 Connexion a une base2 Execution de requetes et recuperation des donnees3 Deconnexion

• Plein d’autres variantes (ex : acces multi-bases)

Olivier Caron 9 juillet 2021 6/36

IS 2ASysteme d’Information a Objets

Deroulement d’un programme JDBC

• Deroulement classique :1 Connexion a une base2 Execution de requetes et recuperation des donnees3 Deconnexion

• Plein d’autres variantes (ex : acces multi-bases)

Olivier Caron 9 juillet 2021 6/36

IS 2ASysteme d’Information a Objets

Etablissement d’une connexion

• Pour se connecter a une base, il faut fournir les elements suivants :

1 L’adresse du serveur de base de donnees (son nom de machine)2 Le type du serveur de base de donnees (postgresql, mysql, oracle,. . . )3 Le nom de la base4 Les nom et mot de passe de l’utilisateur reference du serveur

• Les elements 1 a 3 seront fournis via une URL de la forme :jdbc:typeServeur://adresseServeur/nomBaseDonnees

Exemple :jdbc:postgresql://serveur-etu.polytech-lille.fr/videoclub

• Ces donnees seront idealement externalisees du code source Javadans un fichier de proprietes.

Olivier Caron 9 juillet 2021 7/36

IS 2ASysteme d’Information a Objets

Etablissement d’une connexion

• Pour se connecter a une base, il faut fournir les elements suivants :1 L’adresse du serveur de base de donnees (son nom de machine)

2 Le type du serveur de base de donnees (postgresql, mysql, oracle,. . . )3 Le nom de la base4 Les nom et mot de passe de l’utilisateur reference du serveur

• Les elements 1 a 3 seront fournis via une URL de la forme :jdbc:typeServeur://adresseServeur/nomBaseDonnees

Exemple :jdbc:postgresql://serveur-etu.polytech-lille.fr/videoclub

• Ces donnees seront idealement externalisees du code source Javadans un fichier de proprietes.

Olivier Caron 9 juillet 2021 7/36

IS 2ASysteme d’Information a Objets

Etablissement d’une connexion

• Pour se connecter a une base, il faut fournir les elements suivants :1 L’adresse du serveur de base de donnees (son nom de machine)2 Le type du serveur de base de donnees (postgresql, mysql, oracle,. . . )

3 Le nom de la base4 Les nom et mot de passe de l’utilisateur reference du serveur

• Les elements 1 a 3 seront fournis via une URL de la forme :jdbc:typeServeur://adresseServeur/nomBaseDonnees

Exemple :jdbc:postgresql://serveur-etu.polytech-lille.fr/videoclub

• Ces donnees seront idealement externalisees du code source Javadans un fichier de proprietes.

Olivier Caron 9 juillet 2021 7/36

IS 2ASysteme d’Information a Objets

Etablissement d’une connexion

• Pour se connecter a une base, il faut fournir les elements suivants :1 L’adresse du serveur de base de donnees (son nom de machine)2 Le type du serveur de base de donnees (postgresql, mysql, oracle,. . . )3 Le nom de la base

4 Les nom et mot de passe de l’utilisateur reference du serveur

• Les elements 1 a 3 seront fournis via une URL de la forme :jdbc:typeServeur://adresseServeur/nomBaseDonnees

Exemple :jdbc:postgresql://serveur-etu.polytech-lille.fr/videoclub

• Ces donnees seront idealement externalisees du code source Javadans un fichier de proprietes.

Olivier Caron 9 juillet 2021 7/36

IS 2ASysteme d’Information a Objets

Etablissement d’une connexion

• Pour se connecter a une base, il faut fournir les elements suivants :1 L’adresse du serveur de base de donnees (son nom de machine)2 Le type du serveur de base de donnees (postgresql, mysql, oracle,. . . )3 Le nom de la base4 Les nom et mot de passe de l’utilisateur reference du serveur

• Les elements 1 a 3 seront fournis via une URL de la forme :jdbc:typeServeur://adresseServeur/nomBaseDonnees

Exemple :jdbc:postgresql://serveur-etu.polytech-lille.fr/videoclub

• Ces donnees seront idealement externalisees du code source Javadans un fichier de proprietes.

Olivier Caron 9 juillet 2021 7/36

IS 2ASysteme d’Information a Objets

Etablissement d’une connexion

• Pour se connecter a une base, il faut fournir les elements suivants :1 L’adresse du serveur de base de donnees (son nom de machine)2 Le type du serveur de base de donnees (postgresql, mysql, oracle,. . . )3 Le nom de la base4 Les nom et mot de passe de l’utilisateur reference du serveur

• Les elements 1 a 3 seront fournis via une URL de la forme :jdbc:typeServeur://adresseServeur/nomBaseDonnees

Exemple :jdbc:postgresql://serveur-etu.polytech-lille.fr/videoclub

• Ces donnees seront idealement externalisees du code source Javadans un fichier de proprietes.

Olivier Caron 9 juillet 2021 7/36

IS 2ASysteme d’Information a Objets

Etablissement d’une connexion

• Pour se connecter a une base, il faut fournir les elements suivants :1 L’adresse du serveur de base de donnees (son nom de machine)2 Le type du serveur de base de donnees (postgresql, mysql, oracle,. . . )3 Le nom de la base4 Les nom et mot de passe de l’utilisateur reference du serveur

• Les elements 1 a 3 seront fournis via une URL de la forme :jdbc:typeServeur://adresseServeur/nomBaseDonnees

Exemple :jdbc:postgresql://serveur-etu.polytech-lille.fr/videoclub

• Ces donnees seront idealement externalisees du code source Javadans un fichier de proprietes.

Olivier Caron 9 juillet 2021 7/36

IS 2ASysteme d’Information a Objets

Fichier de proprietes

• Un fichier de proprietes permet d’avoir un code evolutif sansrecompilation

• Soit le fichier de proprietes de nom ”database.properties” :

jdbc . serverType=pos tg resq ljdbc . serverHost=serveur −etu . poly tech − l i l l e . f rjdbc .dbName= t e s tjdbc . user=adminjdbc . password=secre t

Olivier Caron 9 juillet 2021 8/36

IS 2ASysteme d’Information a Objets

Exemple d’une connexion JDBC (1/2)

package progs ;

import java . sq l . * ;import java . i o . * ;import java . u t i l . P rope r t i es ;import javax . sq l . * ;import javax . sq l . rowset . * ;

public class F i r s t {public s t a t i c void main ( S t r i n g args [ ] ) {

t ry {Proper t i es props= new Proper t i es ( ) ;F i le InputSt ream i n =new Fi le InputSt ream ( ” database . p r o p e r t i e s ” ) ;props . load ( i n ) ;S t r i n g u r l = ” jdbc : ” +props . getProper ty ( ” jdbc . serverType ” ) + ” : / / ” +

props . ge tProper ty ( ” jdbc . serverHost ” )+ ” / ” +props . ge tProper ty ( ” jdbc .dbName” ) ;

Olivier Caron 9 juillet 2021 9/36

IS 2ASysteme d’Information a Objets

Exemple d’une connexion JDBC (2/2)

1 S t r i n g user=props . ge tProper ty ( ” jdbc . user ” ) ;2 S t r i n g password=props . ge tProper ty ( ” jdbc . password ” ) ;34 Connection db = DriverManager . getConnect ion ( u r l , user , password ) ;5 System . out . p r i n t l n ( ” Connexion e t a b l i e ” ) ;6 . . .7 } catch ( Fi leNotFoundExcept ion e1 ) {8 System . e r r . p r i n t l n ( ” F i c h i e r de p r o p r i e t es non t rouv e ” ) ;9 } catch ( IOExcept ion e2 ) {

10 System . e r r . p r i n t l n ( ” Er reur l e c t u r e f i c h i e r p r o p r i e t e ” ) ;11 } catch ( SQLException e3 ) {12 System . e r r . p r i n t l n ( ” Er reur SQL” ) ;13 e3 . p r in tS tackTrace ( ) ;14 }15 }

Olivier Caron 9 juillet 2021 10/36

IS 2ASysteme d’Information a Objets

L’interface PreparedStatement

• Le programme precedent a permis d’obtenir une variable db de typeConnection (ligne 4, diapositive precedente).

• Un objet de type PreparedStatement est necessaire pourdefinir des requetes SQL, fournir des parametres puis executer etrecevoir eventuellement des donnees issues de l’execution de cesrequetes.

• Les donnees issues de requetes select sont stockees dans desobjets de type ResultSet.

• La fermeture d’un PreparedStatement engendre la fermetureautomatique de tous les ResultSet associes.

Olivier Caron 9 juillet 2021 11/36

IS 2ASysteme d’Information a Objets

L’interface PreparedStatement

• Le programme precedent a permis d’obtenir une variable db de typeConnection (ligne 4, diapositive precedente).

• Un objet de type PreparedStatement est necessaire pourdefinir des requetes SQL, fournir des parametres puis executer etrecevoir eventuellement des donnees issues de l’execution de cesrequetes.

• Les donnees issues de requetes select sont stockees dans desobjets de type ResultSet.

• La fermeture d’un PreparedStatement engendre la fermetureautomatique de tous les ResultSet associes.

Olivier Caron 9 juillet 2021 11/36

IS 2ASysteme d’Information a Objets

L’interface PreparedStatement

• Le programme precedent a permis d’obtenir une variable db de typeConnection (ligne 4, diapositive precedente).

• Un objet de type PreparedStatement est necessaire pourdefinir des requetes SQL, fournir des parametres puis executer etrecevoir eventuellement des donnees issues de l’execution de cesrequetes.

• Les donnees issues de requetes select sont stockees dans desobjets de type ResultSet.

• La fermeture d’un PreparedStatement engendre la fermetureautomatique de tous les ResultSet associes.

Olivier Caron 9 juillet 2021 11/36

IS 2ASysteme d’Information a Objets

L’interface PreparedStatement

• Le programme precedent a permis d’obtenir une variable db de typeConnection (ligne 4, diapositive precedente).

• Un objet de type PreparedStatement est necessaire pourdefinir des requetes SQL, fournir des parametres puis executer etrecevoir eventuellement des donnees issues de l’execution de cesrequetes.

• Les donnees issues de requetes select sont stockees dans desobjets de type ResultSet.

• La fermeture d’un PreparedStatement engendre la fermetureautomatique de tous les ResultSet associes.

Olivier Caron 9 juillet 2021 11/36

IS 2ASysteme d’Information a Objets

PreparedStatement : requetes de modification

• Toutes les methodes doivent prendre en compte SQLException

• La methode prepareStatement permet d’obtenir un objet detype PreparedStatement a partir d’un objet de typeConnection (ligne 3)

• La methode int executeUpdate(StringrequeteSQL) execute toute requete SQL (hors select) etretourne le nombre de lignes concernes par la commande (parfois 0pour certaines commandes).

1 S t r i n g SQLRequestCreate= ” create tab l e t e s t e r ” +2 ” (num i n t e g e r pr imary key , ch t e x t ) ” ;3 stmt = db . prepareStatement ( SQLRequestCreate ) ;4 stmt . executeUpdate ( ) ; / / ce t t e exe cu t i on re tourne 05 stmt . c lose ( ) ;

Olivier Caron 9 juillet 2021 12/36

IS 2ASysteme d’Information a Objets

PreparedStatement : passage de parametres

• L’expression de la requete SQL permet de specifier des parametres(caractere ’ ?’ - cf ligne 1)

• Les methodes setType(int numParam, Type valeur)permettent de fixer les valeurs.Le premier parametre a le numero 1,. . . (lignes 3 et 6)

• Permet d’executer efficacement un flot de requetes similaires

1 S t r i n g SQLRequestInsert= ” i n s e r t i n t o t e s t e r values (? ,? ) ” ;2 stmt = db . prepareStatement ( SQLRequestInsert ) ;3 stmt . s e t I n t (1 ,1 ) ; stmt . s e t S t r i n g (2 , ” durant ” ) ;4 i n t rowsAf fected = stmt . executeUpdate ( ) ;5 System . out . p r i n t l n ( rowsAf fected+ ” l i g n e ins e r ee ” ) ;6 stmt . s e t I n t (1 ,2 ) ; stmt . s e t S t r i n g (2 , ” dubois ” ) ;7 rowsAf fected= stmt . executeUpdate ( ) ;8 System . out . p r i n t l n ( rowsAf fected+ ” l i g n e ins e r ee ” ) ;9 stmt . c lose ( ) ;

Olivier Caron 9 juillet 2021 13/36

IS 2ASysteme d’Information a Objets

Consultation de la base

• Le processus de consultation (et meme de modification) est lesuivant :

1 Creation d’un objet de type PreparedStatement. Selon lesparametres fournis lors de cette etape, les possibilites de lecture desdonnees recues ainsi que d’ecriture different.

2 Execution d’une requete SQL de type Select, donnees stockeesdans un objet de type ResultSet.

3 Consultation/modification des donnees d’un ResultSet

Olivier Caron 9 juillet 2021 14/36

IS 2ASysteme d’Information a Objets

Consultation de la base

• Le processus de consultation (et meme de modification) est lesuivant :

1 Creation d’un objet de type PreparedStatement. Selon lesparametres fournis lors de cette etape, les possibilites de lecture desdonnees recues ainsi que d’ecriture different.

2 Execution d’une requete SQL de type Select, donnees stockeesdans un objet de type ResultSet.

3 Consultation/modification des donnees d’un ResultSet

Olivier Caron 9 juillet 2021 14/36

IS 2ASysteme d’Information a Objets

Consultation de la base

• Le processus de consultation (et meme de modification) est lesuivant :

1 Creation d’un objet de type PreparedStatement. Selon lesparametres fournis lors de cette etape, les possibilites de lecture desdonnees recues ainsi que d’ecriture different.

2 Execution d’une requete SQL de type Select, donnees stockeesdans un objet de type ResultSet.

3 Consultation/modification des donnees d’un ResultSet

Olivier Caron 9 juillet 2021 14/36

IS 2ASysteme d’Information a Objets

Consultation de la base

• Le processus de consultation (et meme de modification) est lesuivant :

1 Creation d’un objet de type PreparedStatement. Selon lesparametres fournis lors de cette etape, les possibilites de lecture desdonnees recues ainsi que d’ecriture different.

2 Execution d’une requete SQL de type Select, donnees stockeesdans un objet de type ResultSet.

3 Consultation/modification des donnees d’un ResultSet

Olivier Caron 9 juillet 2021 14/36

IS 2ASysteme d’Information a Objets

Parametrage de PreparedStatement (1/2)

• La methode generale de creation d’un PreparedStatementest :PreparedStatement prepareStatement(String sql,

int resultSetType, int resultSetConcurrency)

• Les valeurs possibles de resultSetType :

• ResultSet.Type FORWARD ONLY (par defaut) la lecture desdonnees issues de la requete ne pourra se faire que de la premiereligne vers la derniere. Les donnees sont celles de l’etat de la base aumoment de l’execution de la requete (pas de rafraıchissementpossible).

• ResultSet.Type SCROLL INSENSITIVE la lecture peut sefaire en avant et/ou arriere. Pas de rafraıchissement possible desdonnees.

• ResultSet.Type SCROLL SENSITIVE la lecture peut sefaire en avant et/ou arriere. Rafraıchissement possible des donnees.

Olivier Caron 9 juillet 2021 15/36

IS 2ASysteme d’Information a Objets

Parametrage de PreparedStatement (1/2)

• La methode generale de creation d’un PreparedStatementest :PreparedStatement prepareStatement(String sql,

int resultSetType, int resultSetConcurrency)• Les valeurs possibles de resultSetType :

• ResultSet.Type FORWARD ONLY (par defaut) la lecture desdonnees issues de la requete ne pourra se faire que de la premiereligne vers la derniere. Les donnees sont celles de l’etat de la base aumoment de l’execution de la requete (pas de rafraıchissementpossible).

• ResultSet.Type SCROLL INSENSITIVE la lecture peut sefaire en avant et/ou arriere. Pas de rafraıchissement possible desdonnees.

• ResultSet.Type SCROLL SENSITIVE la lecture peut sefaire en avant et/ou arriere. Rafraıchissement possible des donnees.

Olivier Caron 9 juillet 2021 15/36

IS 2ASysteme d’Information a Objets

Parametrage de PreparedStatement (1/2)

• La methode generale de creation d’un PreparedStatementest :PreparedStatement prepareStatement(String sql,

int resultSetType, int resultSetConcurrency)• Les valeurs possibles de resultSetType :

• ResultSet.Type FORWARD ONLY (par defaut) la lecture desdonnees issues de la requete ne pourra se faire que de la premiereligne vers la derniere. Les donnees sont celles de l’etat de la base aumoment de l’execution de la requete (pas de rafraıchissementpossible).

• ResultSet.Type SCROLL INSENSITIVE la lecture peut sefaire en avant et/ou arriere. Pas de rafraıchissement possible desdonnees.

• ResultSet.Type SCROLL SENSITIVE la lecture peut sefaire en avant et/ou arriere. Rafraıchissement possible des donnees.

Olivier Caron 9 juillet 2021 15/36

IS 2ASysteme d’Information a Objets

Parametrage de PreparedStatement (1/2)

• La methode generale de creation d’un PreparedStatementest :PreparedStatement prepareStatement(String sql,

int resultSetType, int resultSetConcurrency)• Les valeurs possibles de resultSetType :

• ResultSet.Type FORWARD ONLY (par defaut) la lecture desdonnees issues de la requete ne pourra se faire que de la premiereligne vers la derniere. Les donnees sont celles de l’etat de la base aumoment de l’execution de la requete (pas de rafraıchissementpossible).

• ResultSet.Type SCROLL INSENSITIVE la lecture peut sefaire en avant et/ou arriere. Pas de rafraıchissement possible desdonnees.

• ResultSet.Type SCROLL SENSITIVE la lecture peut sefaire en avant et/ou arriere. Rafraıchissement possible des donnees.

Olivier Caron 9 juillet 2021 15/36

IS 2ASysteme d’Information a Objets

Parametrage de PreparedStatement (1/2)

• La methode generale de creation d’un PreparedStatementest :PreparedStatement prepareStatement(String sql,

int resultSetType, int resultSetConcurrency)• Les valeurs possibles de resultSetType :

• ResultSet.Type FORWARD ONLY (par defaut) la lecture desdonnees issues de la requete ne pourra se faire que de la premiereligne vers la derniere. Les donnees sont celles de l’etat de la base aumoment de l’execution de la requete (pas de rafraıchissementpossible).

• ResultSet.Type SCROLL INSENSITIVE la lecture peut sefaire en avant et/ou arriere. Pas de rafraıchissement possible desdonnees.

• ResultSet.Type SCROLL SENSITIVE la lecture peut sefaire en avant et/ou arriere. Rafraıchissement possible des donnees.

Olivier Caron 9 juillet 2021 15/36

IS 2ASysteme d’Information a Objets

Parametrage de PreparedStatement (2/2)

• Les valeurs possibles de resultSetConcurrency :

• ResultSet.CONCUR READ ONLY (par defaut) les donnees duResultSet ne sont pas modifiables

• ResultSet.CONCUR UPDATABLE les donnees duResultSet sont modifiables et synchronisables avec la base.

• La methode stmt = db.prepareStatement(sql) est un raccourcipour :stmt = db.prepareStatement(sql, ResultSet.TYPE FORWARD ONLY,

ResultSet.CONCUR READ ONLY)

Olivier Caron 9 juillet 2021 16/36

IS 2ASysteme d’Information a Objets

Parametrage de PreparedStatement (2/2)

• Les valeurs possibles de resultSetConcurrency :• ResultSet.CONCUR READ ONLY (par defaut) les donnees duResultSet ne sont pas modifiables

• ResultSet.CONCUR UPDATABLE les donnees duResultSet sont modifiables et synchronisables avec la base.

• La methode stmt = db.prepareStatement(sql) est un raccourcipour :stmt = db.prepareStatement(sql, ResultSet.TYPE FORWARD ONLY,

ResultSet.CONCUR READ ONLY)

Olivier Caron 9 juillet 2021 16/36

IS 2ASysteme d’Information a Objets

Parametrage de PreparedStatement (2/2)

• Les valeurs possibles de resultSetConcurrency :• ResultSet.CONCUR READ ONLY (par defaut) les donnees duResultSet ne sont pas modifiables

• ResultSet.CONCUR UPDATABLE les donnees duResultSet sont modifiables et synchronisables avec la base.

• La methode stmt = db.prepareStatement(sql) est un raccourcipour :stmt = db.prepareStatement(sql, ResultSet.TYPE FORWARD ONLY,

ResultSet.CONCUR READ ONLY)

Olivier Caron 9 juillet 2021 16/36

IS 2ASysteme d’Information a Objets

Parametrage de PreparedStatement (2/2)

• Les valeurs possibles de resultSetConcurrency :• ResultSet.CONCUR READ ONLY (par defaut) les donnees duResultSet ne sont pas modifiables

• ResultSet.CONCUR UPDATABLE les donnees duResultSet sont modifiables et synchronisables avec la base.

• La methode stmt = db.prepareStatement(sql) est un raccourcipour :stmt = db.prepareStatement(sql, ResultSet.TYPE FORWARD ONLY,

ResultSet.CONCUR READ ONLY)

Olivier Caron 9 juillet 2021 16/36

IS 2ASysteme d’Information a Objets

Execution d’une requete select

• Utilisation de la methode executeQuery de la classePreparedStatement.

S t r i n g SQLrequestSelect = ” s e l e c t num, ch from t e s t e r ” ;stmt = db . prepareStatement ( SQLrequestSelect ,

Resul tSet . TYPE SCROLL SENSITIVE ,Resul tSet .CONCUR UPDATABLE) ;

Resul tSet rs=stmt . executeQuery ( ) ;

Olivier Caron 9 juillet 2021 17/36

IS 2ASysteme d’Information a Objets

L’objet de type ResultSet

BD

Rs:ResultSet

num ch

1 dupont

2 durant

cursor

Ligne 1

Ligne 2

updateRow

refreshRow

SynchronisationJava <-> BD

• Gestion d’un curseur pour parcourir les lignes resultats de la requete.

• Apres initialisation de l’objet, le curseur se trouve avant la premiereligne

Olivier Caron 9 juillet 2021 18/36

IS 2ASysteme d’Information a Objets

L’objet de type ResultSet

BD

Rs:ResultSet

num ch

1 dupont

2 durant

cursor

Ligne 1

Ligne 2

updateRow

refreshRow

SynchronisationJava <-> BD

• Gestion d’un curseur pour parcourir les lignes resultats de la requete.

• Apres initialisation de l’objet, le curseur se trouve avant la premiereligne

Olivier Caron 9 juillet 2021 18/36

IS 2ASysteme d’Information a Objets

ResultSet : gestion du curseur (1/2)

• Plusieurs methodes booleennes pour deplacer le curseur.

• En mode ResultSet.TYPE FORWARD ONLY, seule la methodenext() est possible

• Ces methodes retournent false si operation impossible (ex : fin detable), la premiere ligne est la ligne 1.

methode actionnext() deplacement vers la ligne suivanteprevious() deplacement vers la ligne precedente

absolute(i) i > 0, aller a la ieme ligne

absolute(-i) i > 0, aller a la ieme ligne en partant de la derniererelative(i) i > 0, descendre de i lignesrelative(-i) i > 0, remonter de i lignes

Olivier Caron 9 juillet 2021 19/36

IS 2ASysteme d’Information a Objets

ResultSet : gestion du curseur (1/2)

• Plusieurs methodes booleennes pour deplacer le curseur.

• En mode ResultSet.TYPE FORWARD ONLY, seule la methodenext() est possible

• Ces methodes retournent false si operation impossible (ex : fin detable), la premiere ligne est la ligne 1.

methode actionnext() deplacement vers la ligne suivanteprevious() deplacement vers la ligne precedente

absolute(i) i > 0, aller a la ieme ligne

absolute(-i) i > 0, aller a la ieme ligne en partant de la derniererelative(i) i > 0, descendre de i lignesrelative(-i) i > 0, remonter de i lignes

Olivier Caron 9 juillet 2021 19/36

IS 2ASysteme d’Information a Objets

ResultSet : gestion du curseur (1/2)

• Plusieurs methodes booleennes pour deplacer le curseur.

• En mode ResultSet.TYPE FORWARD ONLY, seule la methodenext() est possible

• Ces methodes retournent false si operation impossible (ex : fin detable), la premiere ligne est la ligne 1.

methode actionnext() deplacement vers la ligne suivanteprevious() deplacement vers la ligne precedente

absolute(i) i > 0, aller a la ieme ligne

absolute(-i) i > 0, aller a la ieme ligne en partant de la derniererelative(i) i > 0, descendre de i lignesrelative(-i) i > 0, remonter de i lignes

Olivier Caron 9 juillet 2021 19/36

IS 2ASysteme d’Information a Objets

ResultSet : gestion du curseur (2/2)

methode actionafterlast() aller en fin de la table (apres la derniere ligne)beforeFirst() aller en debut de table (avant la premiere ligne)last() aller a la derniere lignefirst() aller a la premiere ligne

Les methodes booleennes suivantes ne deplacent pas le curseur maistestent sa position :

methode actionisLast() vrai si curseur en derniere ligneisFirst() vrai si curseur en premiere ligneisAfterLast() vrai si curseur est apres la derniere ligneisBeforeFirst() vrai si curseur est avant la premiere ligne

Olivier Caron 9 juillet 2021 20/36

IS 2ASysteme d’Information a Objets

ResultSet : lecture des lignes

• Plusieurs methodes pour lire les donnees de la ligne courante (cellepointee par le curseur)

• Deux modes : n◦ de colonne (indicee a partir de 1) ou nom de colonnemethode actionDate getDate(int i) retourne l’objet Date de la colonne iDate getDate(String col) retourne l’objet Date de la colonne colint getInt(int i) retourne un entier de la colonne iint getInt(String col) retourne un entier de la colonne colString getString(int i) retourne l’objet String de la colonne iString getString(String col) retourne l’objet String de la colonne col. . . . . .

Olivier Caron 9 juillet 2021 21/36

IS 2ASysteme d’Information a Objets

ResultSet : lecture des lignes

• Plusieurs methodes pour lire les donnees de la ligne courante (cellepointee par le curseur)

• Deux modes : n◦ de colonne (indicee a partir de 1) ou nom de colonnemethode actionDate getDate(int i) retourne l’objet Date de la colonne iDate getDate(String col) retourne l’objet Date de la colonne colint getInt(int i) retourne un entier de la colonne iint getInt(String col) retourne un entier de la colonne colString getString(int i) retourne l’objet String de la colonne iString getString(String col) retourne l’objet String de la colonne col. . . . . .

Olivier Caron 9 juillet 2021 21/36

IS 2ASysteme d’Information a Objets

Exemple de consultation

i n t l ineNumber = 1;rs . b e f o r e F i r s t ( ) ;while ( rs . next ( ) ) {

i n t num = rs . g e t I n t ( ”num” ) ;S t r i n g ch = rs . g e t S t r i n g ( ” ch ” ) ;System . out . p r i n t l n ( ” l i g n e ” + lineNumber + ” : ”

+ num + ” , ” + ch ) ;l ineNumber ++;

}

• next() est obligatoire meme pour lire une seule ligne (ex : count)

Olivier Caron 9 juillet 2021 22/36

IS 2ASysteme d’Information a Objets

ResultSet : modification de lignes

• Des nouvelles methodes pour ResultSet :void updateType(String nomColonne, typenouvelleValeur)void updateRow() , void refreshRow()void cancelRowUpdates()

• Un exemple :

rs . f i r s t ( ) ; / / r e t o u r premie re l i g n ers . refreshRow ( ) ; / / synchron isa t ion BD −> Javars . updateSt r ing ( ” ch ” , ” dupont ” ) ;rs . updateRow ( ) ; / / synchron isa t ion Java −> BDrs . updateSt r ing ( ” ch ” , ” Caron ” ) ;rs . cancelRowUpdates ( ) ; / / pr ecedente l i g n e i n v a l i d ee

Olivier Caron 9 juillet 2021 23/36

IS 2ASysteme d’Information a Objets

ResultSet : insertion de lignes

• Des nouvelles methodes pour ResultSet :void moveToInsertRow()void moveToCurrentRow()void insertRow()

• Un exemple :

/ / phase d ’ i n s e r t i o nrs . moveToInsertRow ( ) ;rs . update In t ( ”num” ,3 ) ;rs . updateSt r ing ( ” ch ” , ” ga rc ia ” ) ;rs . insertRow ( ) ; / / synchron isa t ion Java −> BDrs . moveToCurrentRow ( ) ; / / r e t o u r au curseur avant i n s e r t i o n

Olivier Caron 9 juillet 2021 24/36

IS 2ASysteme d’Information a Objets

PreparedStatement vs Statement

• PreparedStatement est une specialisation de Statement

• PreparedStatement est plus performant, notamment lorsquela requete est executee plusieurs fois

• PreparedStatement est plus securise, controle des valeurs deparametres

• un exemple de Statement :

Statement stmt = db . createStatement ( ) ;stmt . executeUpdate ( ” c reate tab l e t e s t e r ” +

” (num i n t e g e r pr imary key , ch t e x t ) ” ) ;i n t nb= stmt . executeUpdate ( ” i n s e r t i n t o t e s t e r values ” +

” ( 1 , ’ dupont ’ ) , ( 2 , ’ durant ’ ) ” ) ;System . out . p r i n t l n ( nb+ ” l i g n e s ins e r ees ” ) ;

Olivier Caron 9 juillet 2021 25/36

IS 2ASysteme d’Information a Objets

Fermeture de la connexion

• Fermer le dialogue SQL

• Fermer la session avec la base

stmt . c lose ( ) ;db . c lose ( ) ;

Olivier Caron 9 juillet 2021 26/36

IS 2ASysteme d’Information a Objets

Les objets RowSet : extension de ResultSet

• JDBC 4 : fusion de Connection, PreparedStatement etResultSet

• Integre mecanisme d’observation des donnees modifiees.

Olivier Caron 9 juillet 2021 27/36

IS 2ASysteme d’Information a Objets

Les objets RowSet : extension de ResultSet

• JDBC 4 : fusion de Connection, PreparedStatement etResultSet

• Integre mecanisme d’observation des donnees modifiees.

Olivier Caron 9 juillet 2021 27/36

IS 2ASysteme d’Information a Objets

Exemple RowSet

JdbcRowSet j r s = RowSetProvider . newFactory ( ) . createJdbcRowSet ( ) ;j r s . setType ( Resul tSet . TYPE SCROLL SENSITIVE) ;j r s . s e t U r l ( u r l ) ;j r s . setUsername ( user ) ;j r s . setPassword ( password ) ;j r s . setCommand ( ”SELECT * FROM t e s t e r WHERE ch= ? ” ) ;j r s . s e t S t r i n g (1 , ” ga rc ia ” ) ;j r s . execute ( ) ;

Olivier Caron 9 juillet 2021 28/36

IS 2ASysteme d’Information a Objets

Gestion des transactions

• Le mode par defaut est ”auto-commit” : chaque requete SQL formeune transaction

• Initier une transaction, choix du mode d’isolation standard :

db . setAutoCommit ( fa lse ) ;db . s e t T r a n s a c t i o n I s o l a t i o n ( Connection . TRANSACTION SERIALIZABLE) ;

• Valider une transaction :

stmt=db . prepareStatement ( ” de le te from emprunter where numl=? ” ) ;stmt . s e t I n t (1 ,2 ) ; stmt . executeUpdate ( ) ;stmt . s e t I n t (1 ,34) ; stmt . executeUpdate ( ) ;stmt . s e t I n t (1 ,27) ; stmt . executeUpdate ( ) ;

db . commit ( ) ;db . setAutoCommit ( true ) ;

Olivier Caron 9 juillet 2021 29/36

IS 2ASysteme d’Information a Objets

Annuler une transaction

• methode rollback()

t ry {db . setAutoCommit ( fa lse ) ; / / debut t r a n s a c t i o ndb . s e t T r a n s a c t i o n I s o l a t i o n ( Connection .TRANSACTION READ COMMITTED) ;stmt=db . prepareStatement ( ” i n s e r t i n t o emprunter values (? ,? ) ” ) ;stmt . s e t I n t (1 , numl ) ; stmt . s e t I n t (2 ,numu) ; stmt . executeUpdate ( ) ;i f ( nbEmprunts >= 3) db . r o l l b a c k ( ) ; / / f i n t ransac t i on , i n s e r t annul eelse db . commit ( ) ; / / f i n t r a n s a c t i o n OKdb . setAutoCommit ( true ) ;} catch ( SQLException e ) {

i f ( db != nul l ) {t ry { db . r o l l b a c k ( ) ; db . setAutoCommit ( true ) ;} catch ( SQLException ex ) {System . e r r . p r i n t l n ( ” on est mal ! ” ) ;

}}

Olivier Caron 9 juillet 2021 30/36

IS 2ASysteme d’Information a Objets

Prise en compte de SQL 3

• SQL 3 : unification de concepts oriente-objet et le monde relationnel

• Des colonnes de type non simple :

• Des tableaux (rs.getArray("nomColonne"))• Des objets (rs.getBlob("nomColonne"))

Olivier Caron 9 juillet 2021 31/36

IS 2ASysteme d’Information a Objets

Prise en compte de SQL 3

• SQL 3 : unification de concepts oriente-objet et le monde relationnel• Des colonnes de type non simple :

• Des tableaux (rs.getArray("nomColonne"))• Des objets (rs.getBlob("nomColonne"))

Olivier Caron 9 juillet 2021 31/36

IS 2ASysteme d’Information a Objets

Prise en compte de SQL 3

• SQL 3 : unification de concepts oriente-objet et le monde relationnel• Des colonnes de type non simple :

• Des tableaux (rs.getArray("nomColonne"))

• Des objets (rs.getBlob("nomColonne"))

Olivier Caron 9 juillet 2021 31/36

IS 2ASysteme d’Information a Objets

Prise en compte de SQL 3

• SQL 3 : unification de concepts oriente-objet et le monde relationnel• Des colonnes de type non simple :

• Des tableaux (rs.getArray("nomColonne"))• Des objets (rs.getBlob("nomColonne"))

Olivier Caron 9 juillet 2021 31/36

IS 2ASysteme d’Information a Objets

Le niveau Meta

Une meta-donnee est une donnee qui decrit une donnee

• Des Exemples :

• Modele Relationnel : table(colonne1 type1, . . . )• Postgres pg database, pg user, pg class,. . .• Java : getClass() , getMethods, getFields(), . . .

• JDBC propose une API pour analyser une base (introspection)

Olivier Caron 9 juillet 2021 32/36

IS 2ASysteme d’Information a Objets

Le niveau Meta

Une meta-donnee est une donnee qui decrit une donnee

• Des Exemples :• Modele Relationnel : table(colonne1 type1, . . . )

• Postgres pg database, pg user, pg class,. . .• Java : getClass() , getMethods, getFields(), . . .

• JDBC propose une API pour analyser une base (introspection)

Olivier Caron 9 juillet 2021 32/36

IS 2ASysteme d’Information a Objets

Le niveau Meta

Une meta-donnee est une donnee qui decrit une donnee

• Des Exemples :• Modele Relationnel : table(colonne1 type1, . . . )• Postgres pg database, pg user, pg class,. . .

• Java : getClass() , getMethods, getFields(), . . .

• JDBC propose une API pour analyser une base (introspection)

Olivier Caron 9 juillet 2021 32/36

IS 2ASysteme d’Information a Objets

Le niveau Meta

Une meta-donnee est une donnee qui decrit une donnee

• Des Exemples :• Modele Relationnel : table(colonne1 type1, . . . )• Postgres pg database, pg user, pg class,. . .• Java : getClass() , getMethods, getFields(), . . .

• JDBC propose une API pour analyser une base (introspection)

Olivier Caron 9 juillet 2021 32/36

IS 2ASysteme d’Information a Objets

Le niveau Meta

Une meta-donnee est une donnee qui decrit une donnee

• Des Exemples :• Modele Relationnel : table(colonne1 type1, . . . )• Postgres pg database, pg user, pg class,. . .• Java : getClass() , getMethods, getFields(), . . .

• JDBC propose une API pour analyser une base (introspection)

Olivier Caron 9 juillet 2021 32/36

IS 2ASysteme d’Information a Objets

JDBC et le niveau Meta

• Analyser dynamiquement la structure d’une table resultatl’interface ResultSetMetaData

int getColumnCount() le nombre de colonnesint getColumnDisplaySize(int column) taille d’affichage d’une colString getColumnLabel(int column) nom suggere d’une colonneString getColumnName(int column) nom de colonneint getColumnType(int column) type (cste) de la colonneString getColumnTypeName(int column) nom du type de la colonne

Olivier Caron 9 juillet 2021 33/36

IS 2ASysteme d’Information a Objets

Un exemple d’analyse dynamique de table

stmt=db . prepareStatement ( uneRequeteSQL ) ;rs = stmt . executeQuery ( ) ;rs . l a s t ( ) ; i n t nbLignes = rs . getRow ( ) ; rs . b e f o r e F i r s t ( ) ;ResultSetMetaData rsmd = rs . getMetaData ( ) ;S t r i n g colName [ ] = new S t r i n g [ rsmd . getColumnCount ( ) ] ;for ( i n t i =0; i<rsmd . getColumnCount ( ) ; i ++) { / / ges t ion des noms de co l

colName [ i ]= rsmd . getColumnLabel ( i +1 ) ;Object r e s u l t a t [ ] [ ] = new Object [ rsmd . getColumnCount ( ) ] [ nbLignes ] ;i n t l i g =0 ;while ( rs . next ( ) ) {

for ( i n t i =0; i<colName . leng th ; i ++)switch ( rsmd . getColumnType ( i +1) ) {

case Types . INTEGER: r e s u l t a t [ i ] [ l i g ]=new I n t ege r ( rs . g e t I n t ( colName [ i ] ) ) ;break ;

case Types .VARCHAR: r e s u l t a t [ i ] [ l i g ]=new S t r i n g ( rs . ge t S t r i n g ( colName [ i ] ) ) ;break ;. . .

}}

Olivier Caron 9 juillet 2021 34/36

IS 2ASysteme d’Information a Objets

Analyse dynamique de la base

• L’interface DatabaseMetaData

• API tres riche (et donc complexe)• Permet de connaıtre les possibilites du SGBD• Portable (de nombreux outils generiques)

• Permet de developper des outils generiques (aka PhpPgAdmin)

Olivier Caron 9 juillet 2021 35/36

IS 2ASysteme d’Information a Objets

Analyse dynamique de la base

• L’interface DatabaseMetaData• API tres riche (et donc complexe)

• Permet de connaıtre les possibilites du SGBD• Portable (de nombreux outils generiques)

• Permet de developper des outils generiques (aka PhpPgAdmin)

Olivier Caron 9 juillet 2021 35/36

IS 2ASysteme d’Information a Objets

Analyse dynamique de la base

• L’interface DatabaseMetaData• API tres riche (et donc complexe)• Permet de connaıtre les possibilites du SGBD

• Portable (de nombreux outils generiques)

• Permet de developper des outils generiques (aka PhpPgAdmin)

Olivier Caron 9 juillet 2021 35/36

IS 2ASysteme d’Information a Objets

Analyse dynamique de la base

• L’interface DatabaseMetaData• API tres riche (et donc complexe)• Permet de connaıtre les possibilites du SGBD• Portable (de nombreux outils generiques)

• Permet de developper des outils generiques (aka PhpPgAdmin)

Olivier Caron 9 juillet 2021 35/36

IS 2ASysteme d’Information a Objets

Analyse dynamique de la base

• L’interface DatabaseMetaData• API tres riche (et donc complexe)• Permet de connaıtre les possibilites du SGBD• Portable (de nombreux outils generiques)

• Permet de developper des outils generiques (aka PhpPgAdmin)

Olivier Caron 9 juillet 2021 35/36

IS 2ASysteme d’Information a Objets

Conclusion

• API tres riche, une petite partie de JDBC est presentee dans cecours.

• Une API unique quelque soit le SGBD

• En constante evolution : gestion de ”row sets”, gestion de blobs,support de SQL XML, programmation par annotations Java, . . . ,

Olivier Caron 9 juillet 2021 36/36

IS 2ASysteme d’Information a Objets

Conclusion

• API tres riche, une petite partie de JDBC est presentee dans cecours.

• Une API unique quelque soit le SGBD

• En constante evolution : gestion de ”row sets”, gestion de blobs,support de SQL XML, programmation par annotations Java, . . . ,

Olivier Caron 9 juillet 2021 36/36

IS 2ASysteme d’Information a Objets

Conclusion

• API tres riche, une petite partie de JDBC est presentee dans cecours.

• Une API unique quelque soit le SGBD

• En constante evolution : gestion de ”row sets”, gestion de blobs,support de SQL XML, programmation par annotations Java, . . . ,

Olivier Caron 9 juillet 2021 36/36