SlideShare una empresa de Scribd logo
1 de 7
Descargar para leer sin conexión
Application BdD et JDBC
1 / 28
Application BdD et JDBC
Anne-C´ecile Caron
Licence MIAGE - Bases de Donn´ees
2013-2014
Application BdD et JDBC
Introduction
2 / 28
Application base de donn´ees
Pour le d´eveloppeur :
I Quel est l’environnement ?
I type de client (mode client serveur, intranet, ...)
I langage utilis´e
I contraintes techniques (machines, OS, logiciels ...)
I Dans tout les cas, une seule probl´ematique
I int´egrer du SQL dans un langage de haut niveau
I g´erer des probl`emes de BD + IHM + r´eseau + ...
I Quelques alternatives :
I Solution propri´etaire, li´ee `a un ´editeur.
I SQL int´egr´e ou comment int´egrer du SQL dans un langage connu.
(norme SQL2)
I utilisation d’API
Application BdD et JDBC
Introduction
3 / 28
JDBC
I API Java = paquetages java.sql (”core”) et javax.sql
(”option”)
I Adopt´e par presque tous les constructeurs
I Plusieurs types de Pilotes en fonction des di↵´erents types de
communication entre le SGBD et le programme java.
I Naissance en 1997, Version 4.0 finalis´ee en novembre 2006, suivie
par Oracle 11g.
Application BdD et JDBC
Introduction
4 / 28
Ce qui est vu ou non dans ce cours
I Nous verrons comment se connecter `a une base, poser des requˆetes,
traiter le r´esultat.
I Nous ne verrons pas les classes li´ees `a une utilisation dans un
environnement J2EE
I Nous ne verrons pas les sp´ecificit´es de la gestion des transactions : le
mode par d´efaut implique une validation (commit) de chaque
instruction envoy´ee au SGBD. On parle de mode auto-commit.
attendre le master pour approfondir le sujet ...
Application BdD et JDBC
Introduction
5 / 28
Utilisation de JDBC : les ´etapes
I Charger le pilote (Driver)
I Etablir la connexion avec la base de donn´ees
I Cr´eer une zone de description de requˆete (Statement)
I ex´ecuter la requˆete
I traiter les donn´ees retourn´ees (ResultSet)
I fermer les di↵´erents espaces utilis´es
Application BdD et JDBC
Drivers et Connexion
6 / 28
Chargement du driver
I Disposer d’un driver propri´etaire
I Charger le driver :
DriverManager.registerDriver(unObjetDriver);
DriverManager.registerDriver(
new oracle.jdbc.driver.OracleDriver()
);
I Avec JDBC 4.0, utilisation de Java SE Service Provider : `a la connexion `a
la base, DriverManager charge tous les drivers JDBC4.0 qui sont pr´esents
dans le CLASSPATH.
Application BdD et JDBC
Drivers et Connexion
7 / 28
Obtenir une connexion
I Utilisation d’une m´ethode static de DriverManager
Connection connect
= DriverManager.getConnection(urlBase,
unNomLogin, unPassword);
I Il faut d´efinir dans l’url :
I le protocole et sous-protocole
I l’adresse du SGBD et le nom de la base
String urlBase
= "jdbc:oracle:thin:@oracle.fil.univ-lille1.fr:1521:filora" ;
String urlBase
= "jdbc:postgresql://maMachine/maBase" ;
I Connexion r´eseau conforme internet
Application BdD et JDBC
Ex´ecution d’une requˆete
8 / 28
L’interface Statement
I permet de d´efinir les requˆetes SQL `a envoyer `a la base connect´ee
Statement stmt = connect.createStatement();
I Permet d’ex´ecuter deux types de requˆetes :
I Les requˆetes de modification de la base
I Les requˆetes de consultation de la base
I Toutes les m´ethodes doivent prendre en compte l’exception
SQLException
Application BdD et JDBC
Ex´ecution d’une requˆete
9 / 28
Modification de la base
I int executeUpdate(String requeteSQL)
I Valable aussi pour toutes les commandes SQL DDL.
I par exemple :
stmt.executeUpdate("create table tester" +
"(num integer, ch text)") ;
stmt.executeUpdate("insert into tester " +
"values (1,’dupont’)") ;
stmt.executeUpdate("insert into tester "+
"values (2,’durant’)") ;
I retourne le nombre de lignes cr´e´ees, modifi´ees,. . .
Application BdD et JDBC
Ex´ecution d’une requˆete
10 / 28
Consultation de la base
I ResultSet executeQuery(String requeteSQL)
I Exemple :
ResultSet rs1 = stmt.executeQuery(
"select * from tester") ;
ResultSet rs2 = stmt.executeQuery(
"select * from tester where num =" + i ) ;
I L’objet r´esultat de type ResultSet peut ˆetre parcouru ligne par
ligne.
Application BdD et JDBC
Ex´ecution d’une requˆete
11 / 28
R´ecup´eration des donn´ees
La classe ResultSet dispose des m´ethodes suivantes :
I boolean next() retourne true s’il reste un n-uplet `a lire. Le
premier appel `a next() permet de lire la premi`ere ligne.
I Type getType(int i) retourne l’objet de type Type de la colonne
en position i
I Type getType(String s) retourne l’objet de type Type de la
colonne de nom s
int i = 0;
while (rs.next()) {
int num = rs.getInt("num");
String ch = rs.getString("ch");
System.out.println("ligne " + i + ": "
+ num + ", " + ch);
i++;
}
Application BdD et JDBC
Ex´ecution d’une requˆete
12 / 28
Fermeture des ressources
On peut
I fermer un ResultSet : lib`ere les ressources utilis´ees par ce ResultSet.
I fermer un Statement : lib`ere les ressources utilis´es par le Statement,
et invalide le ResultSet issu de ce Statement (il faut attendre le
passage du garbage collector pour r´ecup´erer les ressources utilis´ees
par le ResultSet)
I fermer la connexion : la fermeture de la connexion entraˆıne la
fermeture des Statements associ´es.
rs.close();
stmt.close() ;
connect.close() ;
Application BdD et JDBC
Ex´ecution d’une requˆete
Batch
13 / 28
Batch
I Depuis JDBC 3.0, on peut envoyer une liste d’instructions `a
ex´ecuter.
I Cette fonctionnalit´e n’est pas requise, il peut donc y avoir des
pilotes qui ne l’impl´ementent pas.
I Ce sont forc´ement des instructions qui ne renvoient pas un
ResultSet : instructions DML update, delete, insert, ou instruction
DDL.
I Un Statement dispose de m´ethodes pour g´erer cette liste de
commandes :
I void addBatch(String sql) Ajoute dans la liste la requˆete pass´ee
en param`etre.
I void clearBatch() Vide la liste des instructions.
I int[] executeBatch() Ex´ecute les instructions de la liste. Le
tableau d’entiers renvoy´e contient les r´esultats d’ex´ecutions des
commandes.
Application BdD et JDBC
Ex´ecution d’une requˆete
Batch
14 / 28
tableau r´esultat
I Le tableau renvoy´e par executeBatch contient en ieme
position :
1. Un nombre 0 : nombre de lignes a↵ect´ees par l’ex´ecution de la ieme
instruction, qui s’est correctement ex´ecut´ee.
2. SUCCESS_NO_INFO : l’instruction s’est bien ex´ecut´ee mais on n’a pas
d’information sur le nombre de lignes a↵ect´ees.
3. EXECUTE_FAILED : l’instruction ne s’est pas bien ex´ecut´ee. Le
tableau est r´ecup´er´e via l’exception.
I Si ´echec d’une instruction : BatchUpdateException
I le pilote peut continuer ou arrˆeter de traiter les commandes restantes.
I on r´ecup`ere le tableau des r´esultats par la m´ethode
BatchUpdateException.getUpdateCounts.
I si le pilote continue : ce tableau contient autant d’´el´ements qu’il y a
de commandes dans la liste batch (et donc au moins un
EXECUTE_FAILED).
I Avec Oracle, le traitement s’arrˆete `a la premi`ere erreur, et le tableau
contient donc les compteurs pour toutes les instructions qui se sont
correctement ex´ecut´ees.
Application BdD et JDBC
Ex´ecution d’une requˆete
Batch
15 / 28
Batch : exemple
// s de type Statement, initialis´e par un createStatement
int[] results ;
// on commence par ajouter des instructions dans le batch
try {
s.addBatch("create table T(a number, b varchar(10))");
s.addBatch("insert into T values (1,’toto’)");
s.addBatch("delete from T where a=3");
} catch (SQLException e) { ... }
try {
results = s.executeBatch();
for (int i=0 ; i<results.length ; i++){
System.out.println(results[i]);
}// si tout se passe bien, affiche 0, 1, 0
} catch (BatchUpdateException e) { // une instruction pose pb
results = e.getUpdateCounts() ;
for (int i=0 ; i<results.length ; i++){
System.out.println(results[i]);
}// pour les instructions qui pr´ec`edent celle qui pose pb
} catch (SQLException ee){ ... }
Application BdD et JDBC
Ex´ecution d’une requˆete
Requˆetes pr´epar´ees
16 / 28
Pr´eparation des requˆetes
I Plus rapide lorsqu’une mˆeme requˆete est ex´ecut´ee plusieurs fois,
mˆeme avec des param`etres di↵´erents.
I Le SGBD a une version pr´ecompil´ee de la requˆete.
I JDBC permet de :
I Pr´eparer une requˆete (avec param`etres)
I Passer les param`etres e↵ectifs `a une requˆete param´etr´ee.
Application BdD et JDBC
Ex´ecution d’une requˆete
Requˆetes pr´epar´ees
17 / 28
L’interface PreparedStatement
I Cr´eation d’une requˆete pr´epar´ee :
PreparedStatement cmdSQL =
connect.prepareStatement("select *
from personne where nom=? and age > ?" );
I Param´etrer la requˆete :
cmdSQL.setString(1, "dupont") ;
cmdSQL.setInt(2,17) ;
I Ex´ecution de la requˆete :
ResultSet rs = cmdSQL.executeQuery() ;
Application BdD et JDBC
Ex´ecution d’une requˆete
Modules stock´es
18 / 28
Proc´edures stock´ees
I JDBC propose une interface CallableStatement qui permet
d’appeler des proc´edures ou fonctions stock´ees.
CallableStatement cs1
= connect.prepareCall( "{call ma_procedure (?,?)}" ) ;
CallableStatement cs2
= connect.prepareCall( "{? = call ma_function (?,?)}" ) ;
I Les param`etres en entr´ee sont g´er´es comme une requˆete pr´epar´ee
cs1.setString(1,"aa");
cs2.setInt(2,refCompte);
I Invocation de la proc´edure ou fonction :
cs1.executeUpdate();
cs2.registerOutParameter(1,java.sql.Types.DOUBLE);
cs2.execute();
double d = cs2.getDouble(1);
Application BdD et JDBC
Encore des ResultSet
19 / 28
Un peu plus sur les ResultSet
I Par d´efaut, un ResultSet poss`ede un sens unique de parcours
(TYPE_FORWARD_ONLY)
On peut changer ce sens de parcours
I Par d´efaut, un ResultSet est en lecture seule
On peut aussi cr´eer des ResultSet modifiables.
I On peut param´etrer son comportement par rapport aux autres
Application BdD et JDBC
Encore des ResultSet
20 / 28
Trois types de ResultSet
I TYPE_FORWARD_ONLY : Il n’y a que le sens de parcours en avant, de
la premi`ere ligne `a la derni`ere. Les lignes contenues dans le
ResultSet peuvent ˆetre, selon l’impl´ementation,
I Celles obtenues `a l’´ex´ecution de la commande SQL
I ou Celles obtenues au moment de la lecture par la m´ethode next
I TYPE_SCROLL_INSENSITIVE On peut aller en avant, en arri`ere, et
se rendre `a une position absolue. Le ResultSet n’est pas sensible aux
changements r´ealis´es de fa¸con concurrente sur les donn´ees
sous-jacentes au ResultSet.
I TYPE_SCROLL_SENSITIVE Deux sens de parcours et sensible aux
changements r´ealis´ees par ailleurs.
Application BdD et JDBC
Encore des ResultSet
21 / 28
Op´erations possibles
I CONCUR_READ_ONLY L’objet ResultSet ne peut pas ˆetre modifi´e.
I CONCUR_UPDATABLE L’objet ResultSet peut ˆetre utilis´e pour faire des
mises-`a-jour.
Statement stmt =
connect.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet rs
= stmt.executeQuery("SELECT a, b FROM TABLE2");
// rs will be scrollable,
// will not show changes made by others,
// and will be updatable
Application BdD et JDBC
Encore des ResultSet
22 / 28
D´eplacements (scrolling)
rs.next() ligne suivante
rs.previous() ligne pr´ec´edente
rs.absolute(i) aller `a la i`eme ligne
rs.absolute(-i) aller `a la i`eme ligne en partant de la derni`ere
rs.relative(i) descendre de i lignes
rs.relative(-i) remonter de i lignes
rs.afterLast() aller apr`es la derni`ere ligne
rs.isAfterLast() retourne vrai si apr`es derni`ere ligne
rs.last() aller `a la derni`ere ligne (comme absolute(-1))
rs.beforeFirst() aller avant la premi`ere ligne
rs.isBeforeFirst() retourne vrai si avant premi`ere ligne
rs.first() aller `a la premi`ere ligne (comme absolute(1))
Application BdD et JDBC
Encore des ResultSet
23 / 28
D´eplacements (suite)
I La fonction int getRow() permet de r´ecup´erer le num´ero de la
ligne courante.
I Les fonctions first, last, absolute, relative, next, previous
renvoient un bool´een qui indique si la nouvelle ligne courante est une
”vraie” ligne.
Application BdD et JDBC
Encore des ResultSet
24 / 28
Modification de lignes
I m´ethodes de ResultSet :
void updateType(String nomColonne, type
nouvelleValeur)
void updateRow()
void cancelRowUpdates()
I Un exemple :
srs.updateString("nom","Dupont") ;
srs.updateRow() ; // changement effectu´e en base
srs.updateString("nom","Caron") ;
srs.cancelRowUpdates() ;
//seul le 2nd updateString est invalid´e
Application BdD et JDBC
Encore des ResultSet
25 / 28
Insertion de lignes
Position particuli`ere dans le curseur pour une nouvelle ligne.
I m´ethodes de ResultSet :
void moveToInsertRow()
void moveToCurrentRow()
void insertRow()
I Un exemple :
// phase d’insertion
srs.moveToInsertRow();
srs.updateInt("num",5) ;
srs.updateString("nom", "Zidane");
srs.insertRow(); // insertion dans la base
srs.moveToCurrentRow() ;
// retour `a la position avant phase d’insertion
Application BdD et JDBC
Encore des ResultSet
26 / 28
Suppression et ”refresh”
I m´ethodes pour ResultSet :
void deleteRow()
Supprime la ligne courante.
void refreshRow()
en mode TYPE SCROLL SENSITIVE, permet de prendre en compte
les modifications faites par d’autres sur la ligne courante.
Application BdD et JDBC
M´etadonn´ees
27 / 28
Le niveau Meta
Une meta-donn´ee est une donn´ee qui d´ecrit une donn´ee
I Des Exemples :
I Mod`ele Relationnel : toutes les informations sur le sch´ema sont
stock´ees dans le dictionnaire.
I Java : getClass() , getMethods, getFields(), . . .
I JDBC propose une API pour analyser une base (introspection)
I ResultSetMetaData : Analyser dynamiquement la structure d’une
relation r´esultat
I DatabaseMetaData : API tr`es riche qui permet de connaˆıtre les
caract´eristiques de la base de donn´ees.
I Alternative : les vues du dictionnaire, mais m´ethode non portable
Application BdD et JDBC
M´etadonn´ees
28 / 28
ResultSetMetaData
I ResultSetMetaData rsmd = rs.getMetaData() ;
int getColumnCount() le nombre de colonnes
int getColumnDisplaySize(int column) taille d’a chage d’une col
String getColumnLabel(int column) nom sugg´er´e d’une colonne
String getColumnName(int column) nom de colonne
int getColumnType(int column) type (cste) de la colonne
String getColumnTypeName(int column) nom du type de la colonne

Más contenido relacionado

La actualidad más candente

La actualidad más candente (10)

JDBC: Gestion des bases de données en Java
JDBC: Gestion des bases de données en Java JDBC: Gestion des bases de données en Java
JDBC: Gestion des bases de données en Java
 
Workshop spring session 2 - La persistance au sein des applications Java
Workshop spring   session 2 - La persistance au sein des applications JavaWorkshop spring   session 2 - La persistance au sein des applications Java
Workshop spring session 2 - La persistance au sein des applications Java
 
4 Hibernate
4 Hibernate4 Hibernate
4 Hibernate
 
Introduction à JPA (Java Persistence API )
Introduction à JPA  (Java Persistence API )Introduction à JPA  (Java Persistence API )
Introduction à JPA (Java Persistence API )
 
Cours design pattern m youssfi partie 7 facade bridge flyweight
Cours design pattern m youssfi partie 7 facade bridge flyweightCours design pattern m youssfi partie 7 facade bridge flyweight
Cours design pattern m youssfi partie 7 facade bridge flyweight
 
Simplex rapport final1
Simplex rapport final1Simplex rapport final1
Simplex rapport final1
 
JAVA, JDBC et liaison base de données
JAVA, JDBC et liaison base de donnéesJAVA, JDBC et liaison base de données
JAVA, JDBC et liaison base de données
 
Support programmation orientée aspect mohamed youssfi (aop)
Support programmation orientée aspect mohamed youssfi (aop)Support programmation orientée aspect mohamed youssfi (aop)
Support programmation orientée aspect mohamed youssfi (aop)
 
De Java à .NET
De Java à .NETDe Java à .NET
De Java à .NET
 
Cours design pattern m youssfi partie 6 proxy
Cours design pattern m youssfi partie 6 proxyCours design pattern m youssfi partie 6 proxy
Cours design pattern m youssfi partie 6 proxy
 

Destacado

Introduction jdbc
Introduction  jdbcIntroduction  jdbc
Introduction jdbcKarim Amane
 
Génie Logiciels : Introduction aux architectures
Génie Logiciels : Introduction aux architecturesGénie Logiciels : Introduction aux architectures
Génie Logiciels : Introduction aux architecturesMohammed Amine Mostefai
 
Enterprise Java Beans - EJB
Enterprise Java Beans - EJBEnterprise Java Beans - EJB
Enterprise Java Beans - EJBPeter R. Egli
 
Cours Génie Logiciel - Cours 2 - Cycles de vie
Cours Génie Logiciel - Cours 2 - Cycles de vieCours Génie Logiciel - Cours 2 - Cycles de vie
Cours Génie Logiciel - Cours 2 - Cycles de vieMohammed Amine Mostefai
 
Architectures orientés services (SOA)
Architectures orientés services (SOA)Architectures orientés services (SOA)
Architectures orientés services (SOA)Heithem Abbes
 
Entreprise Java Beans (EJB)
Entreprise Java Beans (EJB)Entreprise Java Beans (EJB)
Entreprise Java Beans (EJB)Heithem Abbes
 
Introduction aux architectures des SI
Introduction aux architectures des SI Introduction aux architectures des SI
Introduction aux architectures des SI Heithem Abbes
 
Architectures n-tiers
Architectures n-tiersArchitectures n-tiers
Architectures n-tiersHeithem Abbes
 
Architectures 3-tiers (Web)
Architectures 3-tiers (Web)Architectures 3-tiers (Web)
Architectures 3-tiers (Web)Heithem Abbes
 
Introduction au génie logiciel 1.2
Introduction au génie logiciel 1.2Introduction au génie logiciel 1.2
Introduction au génie logiciel 1.2Stéphane Salmons
 
Cycle de vie d’un logiciel
Cycle de vie d’un logicielCycle de vie d’un logiciel
Cycle de vie d’un logicielMehdi Abed
 
L1 1-document casd-utilisationsetexigencesapplicablesalenvir
L1 1-document casd-utilisationsetexigencesapplicablesalenvirL1 1-document casd-utilisationsetexigencesapplicablesalenvir
L1 1-document casd-utilisationsetexigencesapplicablesalenvirjcgcecilia
 
Hdsd ccbs osp_hcm_16_05_2011
Hdsd ccbs osp_hcm_16_05_2011Hdsd ccbs osp_hcm_16_05_2011
Hdsd ccbs osp_hcm_16_05_2011Hoang Le
 
Programando en flash
Programando en flashProgramando en flash
Programando en flashLuis Palomino
 
Fête de la lecture swetha
Fête de la lecture  swethaFête de la lecture  swetha
Fête de la lecture swethac_swetha
 
Taller Derechos Humanos para periodistas
Taller Derechos Humanos para periodistasTaller Derechos Humanos para periodistas
Taller Derechos Humanos para periodistasEspacio Público
 

Destacado (20)

Introduction jdbc
Introduction  jdbcIntroduction  jdbc
Introduction jdbc
 
Jdbc
JdbcJdbc
Jdbc
 
Cours Génie Logiciel - Introduction
Cours Génie Logiciel - IntroductionCours Génie Logiciel - Introduction
Cours Génie Logiciel - Introduction
 
Génie Logiciels : Introduction aux architectures
Génie Logiciels : Introduction aux architecturesGénie Logiciels : Introduction aux architectures
Génie Logiciels : Introduction aux architectures
 
Enterprise Java Beans - EJB
Enterprise Java Beans - EJBEnterprise Java Beans - EJB
Enterprise Java Beans - EJB
 
Cours Génie Logiciel - Cours 2 - Cycles de vie
Cours Génie Logiciel - Cours 2 - Cycles de vieCours Génie Logiciel - Cours 2 - Cycles de vie
Cours Génie Logiciel - Cours 2 - Cycles de vie
 
Architectures orientés services (SOA)
Architectures orientés services (SOA)Architectures orientés services (SOA)
Architectures orientés services (SOA)
 
Entreprise Java Beans (EJB)
Entreprise Java Beans (EJB)Entreprise Java Beans (EJB)
Entreprise Java Beans (EJB)
 
Introduction aux architectures des SI
Introduction aux architectures des SI Introduction aux architectures des SI
Introduction aux architectures des SI
 
Architectures n-tiers
Architectures n-tiersArchitectures n-tiers
Architectures n-tiers
 
Architectures 3-tiers (Web)
Architectures 3-tiers (Web)Architectures 3-tiers (Web)
Architectures 3-tiers (Web)
 
Introduction au génie logiciel 1.2
Introduction au génie logiciel 1.2Introduction au génie logiciel 1.2
Introduction au génie logiciel 1.2
 
Cycle de vie d’un logiciel
Cycle de vie d’un logicielCycle de vie d’un logiciel
Cycle de vie d’un logiciel
 
Boi 5f811 Nouveau barème Kilométrique
Boi 5f811 Nouveau barème Kilométrique Boi 5f811 Nouveau barème Kilométrique
Boi 5f811 Nouveau barème Kilométrique
 
L1 1-document casd-utilisationsetexigencesapplicablesalenvir
L1 1-document casd-utilisationsetexigencesapplicablesalenvirL1 1-document casd-utilisationsetexigencesapplicablesalenvir
L1 1-document casd-utilisationsetexigencesapplicablesalenvir
 
Hdsd ccbs osp_hcm_16_05_2011
Hdsd ccbs osp_hcm_16_05_2011Hdsd ccbs osp_hcm_16_05_2011
Hdsd ccbs osp_hcm_16_05_2011
 
Programando en flash
Programando en flashProgramando en flash
Programando en flash
 
Ejemplos de Proyectos
Ejemplos de ProyectosEjemplos de Proyectos
Ejemplos de Proyectos
 
Fête de la lecture swetha
Fête de la lecture  swethaFête de la lecture  swetha
Fête de la lecture swetha
 
Taller Derechos Humanos para periodistas
Taller Derechos Humanos para periodistasTaller Derechos Humanos para periodistas
Taller Derechos Humanos para periodistas
 

Similar a Jdbc par4

Présentaion sur le modéle JDBC JEE .pptx
Présentaion sur le modéle JDBC JEE .pptxPrésentaion sur le modéle JDBC JEE .pptx
Présentaion sur le modéle JDBC JEE .pptxsalmachtioui1
 
Java Database Connectivity
Java Database ConnectivityJava Database Connectivity
Java Database ConnectivityKorteby Farouk
 
Cours PHP PDO intégrale afin de mieux appréhender la nouvelle librairie
Cours PHP PDO intégrale afin de mieux appréhender la nouvelle librairieCours PHP PDO intégrale afin de mieux appréhender la nouvelle librairie
Cours PHP PDO intégrale afin de mieux appréhender la nouvelle librairieafdoumbia
 
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniterAtsé François-Xavier KOBON
 
Environnement de développement de bases de données
Environnement de développement de bases de donnéesEnvironnement de développement de bases de données
Environnement de développement de bases de donnéesISIG
 
Activity
ActivityActivity
Activitydido
 
Java et bases de données : JDBC
Java et bases de données : JDBCJava et bases de données : JDBC
Java et bases de données : JDBCMohammed Jaafar
 
Implémentation de l’algorithme du Simplexe En Java
Implémentation de l’algorithme du Simplexe En JavaImplémentation de l’algorithme du Simplexe En Java
Implémentation de l’algorithme du Simplexe En JavaRached Krim
 
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Normandy JUG
 
ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours
ENIB cours CAI Web - Séance 3 - JSP/Servlet - CoursENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours
ENIB cours CAI Web - Séance 3 - JSP/Servlet - CoursHoracio Gonzalez
 
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...Alexandre Touret
 
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !Paris Salesforce Developer Group
 
Formation JAVA/J2EE
Formation JAVA/J2EEFormation JAVA/J2EE
Formation JAVA/J2EEInes Ouaz
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logiciellecyrilgandon
 
cours-gratuit.com--id-1964.pdf
cours-gratuit.com--id-1964.pdfcours-gratuit.com--id-1964.pdf
cours-gratuit.com--id-1964.pdfRachida19
 

Similar a Jdbc par4 (20)

Support Java Avancé Troisième Partie
Support Java Avancé Troisième PartieSupport Java Avancé Troisième Partie
Support Java Avancé Troisième Partie
 
Présentaion sur le modéle JDBC JEE .pptx
Présentaion sur le modéle JDBC JEE .pptxPrésentaion sur le modéle JDBC JEE .pptx
Présentaion sur le modéle JDBC JEE .pptx
 
Java Database Connectivity
Java Database ConnectivityJava Database Connectivity
Java Database Connectivity
 
Jdbc
JdbcJdbc
Jdbc
 
Cours PHP PDO intégrale afin de mieux appréhender la nouvelle librairie
Cours PHP PDO intégrale afin de mieux appréhender la nouvelle librairieCours PHP PDO intégrale afin de mieux appréhender la nouvelle librairie
Cours PHP PDO intégrale afin de mieux appréhender la nouvelle librairie
 
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
 
Environnement de développement de bases de données
Environnement de développement de bases de donnéesEnvironnement de développement de bases de données
Environnement de développement de bases de données
 
Springioc
SpringiocSpringioc
Springioc
 
Activity
ActivityActivity
Activity
 
Les Servlets et JSP
Les Servlets et JSPLes Servlets et JSP
Les Servlets et JSP
 
Java et bases de données : JDBC
Java et bases de données : JDBCJava et bases de données : JDBC
Java et bases de données : JDBC
 
Implémentation de l’algorithme du Simplexe En Java
Implémentation de l’algorithme du Simplexe En JavaImplémentation de l’algorithme du Simplexe En Java
Implémentation de l’algorithme du Simplexe En Java
 
Mysql
MysqlMysql
Mysql
 
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
 
ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours
ENIB cours CAI Web - Séance 3 - JSP/Servlet - CoursENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours
ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours
 
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...
 
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
 
Formation JAVA/J2EE
Formation JAVA/J2EEFormation JAVA/J2EE
Formation JAVA/J2EE
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logicielle
 
cours-gratuit.com--id-1964.pdf
cours-gratuit.com--id-1964.pdfcours-gratuit.com--id-1964.pdf
cours-gratuit.com--id-1964.pdf
 

Más de Karim Amane

Moyen de-recherche-d-emploi
Moyen de-recherche-d-emploiMoyen de-recherche-d-emploi
Moyen de-recherche-d-emploiKarim Amane
 
Exercices complexes corriges
Exercices complexes corrigesExercices complexes corriges
Exercices complexes corrigesKarim Amane
 
Chap nombres complexes
Chap nombres complexesChap nombres complexes
Chap nombres complexesKarim Amane
 
الباحثون السوريون انتبه ! الجراثيم تتكاثر في فمك الآن
الباحثون السوريون   انتبه ! الجراثيم تتكاثر في فمك الآنالباحثون السوريون   انتبه ! الجراثيم تتكاثر في فمك الآن
الباحثون السوريون انتبه ! الجراثيم تتكاثر في فمك الآنKarim Amane
 
Exercicescorrigesdivers
ExercicescorrigesdiversExercicescorrigesdivers
ExercicescorrigesdiversKarim Amane
 

Más de Karim Amane (11)

Moyen de-recherche-d-emploi
Moyen de-recherche-d-emploiMoyen de-recherche-d-emploi
Moyen de-recherche-d-emploi
 
Exercices complexes corriges
Exercices complexes corrigesExercices complexes corriges
Exercices complexes corriges
 
Moivre
MoivreMoivre
Moivre
 
Fic00001
Fic00001Fic00001
Fic00001
 
Chap nombres complexes
Chap nombres complexesChap nombres complexes
Chap nombres complexes
 
الباحثون السوريون انتبه ! الجراثيم تتكاثر في فمك الآن
الباحثون السوريون   انتبه ! الجراثيم تتكاثر في فمك الآنالباحثون السوريون   انتبه ! الجراثيم تتكاثر في فمك الآن
الباحثون السوريون انتبه ! الجراثيم تتكاثر في فمك الآن
 
Hdr merlo v4
Hdr merlo v4Hdr merlo v4
Hdr merlo v4
 
Opencourrier
OpencourrierOpencourrier
Opencourrier
 
Lp web tp3_idse
Lp web tp3_idseLp web tp3_idse
Lp web tp3_idse
 
Hdr merlo v2
Hdr merlo v2Hdr merlo v2
Hdr merlo v2
 
Exercicescorrigesdivers
ExercicescorrigesdiversExercicescorrigesdivers
Exercicescorrigesdivers
 

Jdbc par4

  • 1. Application BdD et JDBC 1 / 28 Application BdD et JDBC Anne-C´ecile Caron Licence MIAGE - Bases de Donn´ees 2013-2014 Application BdD et JDBC Introduction 2 / 28 Application base de donn´ees Pour le d´eveloppeur : I Quel est l’environnement ? I type de client (mode client serveur, intranet, ...) I langage utilis´e I contraintes techniques (machines, OS, logiciels ...) I Dans tout les cas, une seule probl´ematique I int´egrer du SQL dans un langage de haut niveau I g´erer des probl`emes de BD + IHM + r´eseau + ... I Quelques alternatives : I Solution propri´etaire, li´ee `a un ´editeur. I SQL int´egr´e ou comment int´egrer du SQL dans un langage connu. (norme SQL2) I utilisation d’API Application BdD et JDBC Introduction 3 / 28 JDBC I API Java = paquetages java.sql (”core”) et javax.sql (”option”) I Adopt´e par presque tous les constructeurs I Plusieurs types de Pilotes en fonction des di↵´erents types de communication entre le SGBD et le programme java. I Naissance en 1997, Version 4.0 finalis´ee en novembre 2006, suivie par Oracle 11g. Application BdD et JDBC Introduction 4 / 28 Ce qui est vu ou non dans ce cours I Nous verrons comment se connecter `a une base, poser des requˆetes, traiter le r´esultat. I Nous ne verrons pas les classes li´ees `a une utilisation dans un environnement J2EE I Nous ne verrons pas les sp´ecificit´es de la gestion des transactions : le mode par d´efaut implique une validation (commit) de chaque instruction envoy´ee au SGBD. On parle de mode auto-commit. attendre le master pour approfondir le sujet ...
  • 2. Application BdD et JDBC Introduction 5 / 28 Utilisation de JDBC : les ´etapes I Charger le pilote (Driver) I Etablir la connexion avec la base de donn´ees I Cr´eer une zone de description de requˆete (Statement) I ex´ecuter la requˆete I traiter les donn´ees retourn´ees (ResultSet) I fermer les di↵´erents espaces utilis´es Application BdD et JDBC Drivers et Connexion 6 / 28 Chargement du driver I Disposer d’un driver propri´etaire I Charger le driver : DriverManager.registerDriver(unObjetDriver); DriverManager.registerDriver( new oracle.jdbc.driver.OracleDriver() ); I Avec JDBC 4.0, utilisation de Java SE Service Provider : `a la connexion `a la base, DriverManager charge tous les drivers JDBC4.0 qui sont pr´esents dans le CLASSPATH. Application BdD et JDBC Drivers et Connexion 7 / 28 Obtenir une connexion I Utilisation d’une m´ethode static de DriverManager Connection connect = DriverManager.getConnection(urlBase, unNomLogin, unPassword); I Il faut d´efinir dans l’url : I le protocole et sous-protocole I l’adresse du SGBD et le nom de la base String urlBase = "jdbc:oracle:thin:@oracle.fil.univ-lille1.fr:1521:filora" ; String urlBase = "jdbc:postgresql://maMachine/maBase" ; I Connexion r´eseau conforme internet Application BdD et JDBC Ex´ecution d’une requˆete 8 / 28 L’interface Statement I permet de d´efinir les requˆetes SQL `a envoyer `a la base connect´ee Statement stmt = connect.createStatement(); I Permet d’ex´ecuter deux types de requˆetes : I Les requˆetes de modification de la base I Les requˆetes de consultation de la base I Toutes les m´ethodes doivent prendre en compte l’exception SQLException
  • 3. Application BdD et JDBC Ex´ecution d’une requˆete 9 / 28 Modification de la base I int executeUpdate(String requeteSQL) I Valable aussi pour toutes les commandes SQL DDL. I par exemple : stmt.executeUpdate("create table tester" + "(num integer, ch text)") ; stmt.executeUpdate("insert into tester " + "values (1,’dupont’)") ; stmt.executeUpdate("insert into tester "+ "values (2,’durant’)") ; I retourne le nombre de lignes cr´e´ees, modifi´ees,. . . Application BdD et JDBC Ex´ecution d’une requˆete 10 / 28 Consultation de la base I ResultSet executeQuery(String requeteSQL) I Exemple : ResultSet rs1 = stmt.executeQuery( "select * from tester") ; ResultSet rs2 = stmt.executeQuery( "select * from tester where num =" + i ) ; I L’objet r´esultat de type ResultSet peut ˆetre parcouru ligne par ligne. Application BdD et JDBC Ex´ecution d’une requˆete 11 / 28 R´ecup´eration des donn´ees La classe ResultSet dispose des m´ethodes suivantes : I boolean next() retourne true s’il reste un n-uplet `a lire. Le premier appel `a next() permet de lire la premi`ere ligne. I Type getType(int i) retourne l’objet de type Type de la colonne en position i I Type getType(String s) retourne l’objet de type Type de la colonne de nom s int i = 0; while (rs.next()) { int num = rs.getInt("num"); String ch = rs.getString("ch"); System.out.println("ligne " + i + ": " + num + ", " + ch); i++; } Application BdD et JDBC Ex´ecution d’une requˆete 12 / 28 Fermeture des ressources On peut I fermer un ResultSet : lib`ere les ressources utilis´ees par ce ResultSet. I fermer un Statement : lib`ere les ressources utilis´es par le Statement, et invalide le ResultSet issu de ce Statement (il faut attendre le passage du garbage collector pour r´ecup´erer les ressources utilis´ees par le ResultSet) I fermer la connexion : la fermeture de la connexion entraˆıne la fermeture des Statements associ´es. rs.close(); stmt.close() ; connect.close() ;
  • 4. Application BdD et JDBC Ex´ecution d’une requˆete Batch 13 / 28 Batch I Depuis JDBC 3.0, on peut envoyer une liste d’instructions `a ex´ecuter. I Cette fonctionnalit´e n’est pas requise, il peut donc y avoir des pilotes qui ne l’impl´ementent pas. I Ce sont forc´ement des instructions qui ne renvoient pas un ResultSet : instructions DML update, delete, insert, ou instruction DDL. I Un Statement dispose de m´ethodes pour g´erer cette liste de commandes : I void addBatch(String sql) Ajoute dans la liste la requˆete pass´ee en param`etre. I void clearBatch() Vide la liste des instructions. I int[] executeBatch() Ex´ecute les instructions de la liste. Le tableau d’entiers renvoy´e contient les r´esultats d’ex´ecutions des commandes. Application BdD et JDBC Ex´ecution d’une requˆete Batch 14 / 28 tableau r´esultat I Le tableau renvoy´e par executeBatch contient en ieme position : 1. Un nombre 0 : nombre de lignes a↵ect´ees par l’ex´ecution de la ieme instruction, qui s’est correctement ex´ecut´ee. 2. SUCCESS_NO_INFO : l’instruction s’est bien ex´ecut´ee mais on n’a pas d’information sur le nombre de lignes a↵ect´ees. 3. EXECUTE_FAILED : l’instruction ne s’est pas bien ex´ecut´ee. Le tableau est r´ecup´er´e via l’exception. I Si ´echec d’une instruction : BatchUpdateException I le pilote peut continuer ou arrˆeter de traiter les commandes restantes. I on r´ecup`ere le tableau des r´esultats par la m´ethode BatchUpdateException.getUpdateCounts. I si le pilote continue : ce tableau contient autant d’´el´ements qu’il y a de commandes dans la liste batch (et donc au moins un EXECUTE_FAILED). I Avec Oracle, le traitement s’arrˆete `a la premi`ere erreur, et le tableau contient donc les compteurs pour toutes les instructions qui se sont correctement ex´ecut´ees. Application BdD et JDBC Ex´ecution d’une requˆete Batch 15 / 28 Batch : exemple // s de type Statement, initialis´e par un createStatement int[] results ; // on commence par ajouter des instructions dans le batch try { s.addBatch("create table T(a number, b varchar(10))"); s.addBatch("insert into T values (1,’toto’)"); s.addBatch("delete from T where a=3"); } catch (SQLException e) { ... } try { results = s.executeBatch(); for (int i=0 ; i<results.length ; i++){ System.out.println(results[i]); }// si tout se passe bien, affiche 0, 1, 0 } catch (BatchUpdateException e) { // une instruction pose pb results = e.getUpdateCounts() ; for (int i=0 ; i<results.length ; i++){ System.out.println(results[i]); }// pour les instructions qui pr´ec`edent celle qui pose pb } catch (SQLException ee){ ... } Application BdD et JDBC Ex´ecution d’une requˆete Requˆetes pr´epar´ees 16 / 28 Pr´eparation des requˆetes I Plus rapide lorsqu’une mˆeme requˆete est ex´ecut´ee plusieurs fois, mˆeme avec des param`etres di↵´erents. I Le SGBD a une version pr´ecompil´ee de la requˆete. I JDBC permet de : I Pr´eparer une requˆete (avec param`etres) I Passer les param`etres e↵ectifs `a une requˆete param´etr´ee.
  • 5. Application BdD et JDBC Ex´ecution d’une requˆete Requˆetes pr´epar´ees 17 / 28 L’interface PreparedStatement I Cr´eation d’une requˆete pr´epar´ee : PreparedStatement cmdSQL = connect.prepareStatement("select * from personne where nom=? and age > ?" ); I Param´etrer la requˆete : cmdSQL.setString(1, "dupont") ; cmdSQL.setInt(2,17) ; I Ex´ecution de la requˆete : ResultSet rs = cmdSQL.executeQuery() ; Application BdD et JDBC Ex´ecution d’une requˆete Modules stock´es 18 / 28 Proc´edures stock´ees I JDBC propose une interface CallableStatement qui permet d’appeler des proc´edures ou fonctions stock´ees. CallableStatement cs1 = connect.prepareCall( "{call ma_procedure (?,?)}" ) ; CallableStatement cs2 = connect.prepareCall( "{? = call ma_function (?,?)}" ) ; I Les param`etres en entr´ee sont g´er´es comme une requˆete pr´epar´ee cs1.setString(1,"aa"); cs2.setInt(2,refCompte); I Invocation de la proc´edure ou fonction : cs1.executeUpdate(); cs2.registerOutParameter(1,java.sql.Types.DOUBLE); cs2.execute(); double d = cs2.getDouble(1); Application BdD et JDBC Encore des ResultSet 19 / 28 Un peu plus sur les ResultSet I Par d´efaut, un ResultSet poss`ede un sens unique de parcours (TYPE_FORWARD_ONLY) On peut changer ce sens de parcours I Par d´efaut, un ResultSet est en lecture seule On peut aussi cr´eer des ResultSet modifiables. I On peut param´etrer son comportement par rapport aux autres Application BdD et JDBC Encore des ResultSet 20 / 28 Trois types de ResultSet I TYPE_FORWARD_ONLY : Il n’y a que le sens de parcours en avant, de la premi`ere ligne `a la derni`ere. Les lignes contenues dans le ResultSet peuvent ˆetre, selon l’impl´ementation, I Celles obtenues `a l’´ex´ecution de la commande SQL I ou Celles obtenues au moment de la lecture par la m´ethode next I TYPE_SCROLL_INSENSITIVE On peut aller en avant, en arri`ere, et se rendre `a une position absolue. Le ResultSet n’est pas sensible aux changements r´ealis´es de fa¸con concurrente sur les donn´ees sous-jacentes au ResultSet. I TYPE_SCROLL_SENSITIVE Deux sens de parcours et sensible aux changements r´ealis´ees par ailleurs.
  • 6. Application BdD et JDBC Encore des ResultSet 21 / 28 Op´erations possibles I CONCUR_READ_ONLY L’objet ResultSet ne peut pas ˆetre modifi´e. I CONCUR_UPDATABLE L’objet ResultSet peut ˆetre utilis´e pour faire des mises-`a-jour. Statement stmt = connect.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2"); // rs will be scrollable, // will not show changes made by others, // and will be updatable Application BdD et JDBC Encore des ResultSet 22 / 28 D´eplacements (scrolling) rs.next() ligne suivante rs.previous() ligne pr´ec´edente rs.absolute(i) aller `a la i`eme ligne rs.absolute(-i) aller `a la i`eme ligne en partant de la derni`ere rs.relative(i) descendre de i lignes rs.relative(-i) remonter de i lignes rs.afterLast() aller apr`es la derni`ere ligne rs.isAfterLast() retourne vrai si apr`es derni`ere ligne rs.last() aller `a la derni`ere ligne (comme absolute(-1)) rs.beforeFirst() aller avant la premi`ere ligne rs.isBeforeFirst() retourne vrai si avant premi`ere ligne rs.first() aller `a la premi`ere ligne (comme absolute(1)) Application BdD et JDBC Encore des ResultSet 23 / 28 D´eplacements (suite) I La fonction int getRow() permet de r´ecup´erer le num´ero de la ligne courante. I Les fonctions first, last, absolute, relative, next, previous renvoient un bool´een qui indique si la nouvelle ligne courante est une ”vraie” ligne. Application BdD et JDBC Encore des ResultSet 24 / 28 Modification de lignes I m´ethodes de ResultSet : void updateType(String nomColonne, type nouvelleValeur) void updateRow() void cancelRowUpdates() I Un exemple : srs.updateString("nom","Dupont") ; srs.updateRow() ; // changement effectu´e en base srs.updateString("nom","Caron") ; srs.cancelRowUpdates() ; //seul le 2nd updateString est invalid´e
  • 7. Application BdD et JDBC Encore des ResultSet 25 / 28 Insertion de lignes Position particuli`ere dans le curseur pour une nouvelle ligne. I m´ethodes de ResultSet : void moveToInsertRow() void moveToCurrentRow() void insertRow() I Un exemple : // phase d’insertion srs.moveToInsertRow(); srs.updateInt("num",5) ; srs.updateString("nom", "Zidane"); srs.insertRow(); // insertion dans la base srs.moveToCurrentRow() ; // retour `a la position avant phase d’insertion Application BdD et JDBC Encore des ResultSet 26 / 28 Suppression et ”refresh” I m´ethodes pour ResultSet : void deleteRow() Supprime la ligne courante. void refreshRow() en mode TYPE SCROLL SENSITIVE, permet de prendre en compte les modifications faites par d’autres sur la ligne courante. Application BdD et JDBC M´etadonn´ees 27 / 28 Le niveau Meta Une meta-donn´ee est une donn´ee qui d´ecrit une donn´ee I Des Exemples : I Mod`ele Relationnel : toutes les informations sur le sch´ema sont stock´ees dans le dictionnaire. I Java : getClass() , getMethods, getFields(), . . . I JDBC propose une API pour analyser une base (introspection) I ResultSetMetaData : Analyser dynamiquement la structure d’une relation r´esultat I DatabaseMetaData : API tr`es riche qui permet de connaˆıtre les caract´eristiques de la base de donn´ees. I Alternative : les vues du dictionnaire, mais m´ethode non portable Application BdD et JDBC M´etadonn´ees 28 / 28 ResultSetMetaData I ResultSetMetaData rsmd = rs.getMetaData() ; int getColumnCount() le nombre de colonnes int getColumnDisplaySize(int column) taille d’a chage d’une col String getColumnLabel(int column) nom sugg´er´e d’une colonne String getColumnName(int column) nom de colonne int getColumnType(int column) type (cste) de la colonne String getColumnTypeName(int column) nom du type de la colonne