Application BdD et JDBC
1/28
Application BdD et JDBC
Anne-C´ecile Caron
Licence MIAGE - Bases de Donn´ees
2016-2017
Application BdD et JDBC
Introduction
2/28
Application base de donn´ees
Pour le d´eveloppeur :
IQuel est l’environnement ?
Itype de client (mode client serveur, intranet, ...)
Ilangage utilis´e
Icontraintes techniques (machines, OS, logiciels ...)
IDans tout les cas, une seule probl´ematique
Iint´egrer du SQL dans un langage de haut niveau
Ierer des probl`emes de BD + IHM + r´eseau + ...
IQuelques alternatives :
ISolution propri´etaire, li´ee `a un ´editeur.
ISQL int´egr´e ou comment int´egrer du SQL dans un langage connu.
(norme SQL2)
Iutilisation d’API
Application BdD et JDBC
Introduction
3/28
JDBC
IAPI Java = paquetages java.sql (”core”) et javax.sql
(”option”)
IAdopt´e par presque tous les constructeurs
IPlusieurs types de Pilotes en fonction des di´e r e n t s t y p e s d e
communication entre le SGBD et le programme java.
INaissance en 1997, Version 4.0 en 2006 (suivie par Oracle 11g),
Version 4.1 pour java 7 depuis 2011, Version 4.2 pour java 8.
Application BdD et JDBC
Introduction
4/28
Ce qui est vu ou non dans ce cours
INous verrons comment se connecter `a une base, poser des requˆetes,
traiter le r´esultat.
INous ne verrons pas les classes li´ees `a une utilisation dans un
environnement J2EE
INous 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
ICharger le pilote (Driver)
IEtablir la connexion avec la base de donn´ees
ICr´eer une zone de description de requˆete (Statement)
Iex´ecuter la requˆete
Itraiter les donn´ees retourn´ees (ResultSet)
Ifermer les di´erents espaces utilis´es
Application BdD et JDBC
Drivers et Connexion
6/28
Chargement du driver
IDisposer d’un driver propri´etaire
ICharger le driver :
DriverManager.registerDriver(unObjetDriver);
DriverManager.registerDriver(
new oracle.jdbc.driver.OracleDriver()
);
IAvec JDBC 4.0, utilisation de Java SE Service Provider : `a la connexion `a
la base, DriverManager charge tous les drivers JDBC4.0 qui sont pesents
dans le CLASSPATH.
Application BdD et JDBC
Drivers et Connexion
7/28
Obtenir une connexion
IUtilisation d’une m´ethode static de DriverManager
Connection connect
= DriverManager.getConnection(urlBase,
unNomLogin, unPassword);
IIl faut d´efinir dans l’url :
Ile protocole et sous-protocole
Il’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" ;
IConnexion r´eseau conforme internet
IPour le mod`ele 3-tiers, utiliser plutˆot DataSource comme
alternative `a DriverManager
Application BdD et JDBC
Ex´ecution d’une requˆete
8/28
L’interface Statement
Ipermet de d´efinir les requˆetes SQL `a envoyer `a la base connect´ee
Statement stmt = connect.createStatement();
IPermet d’ex´ecuter deux types de requˆetes :
ILes requˆetes de modification de la base
ILes requˆetes de consultation de la base
IToutes 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
Iint executeUpdate(String requeteSQL)
IValable aussi pour toutes les commandes SQL DDL.
Ipar 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’)") ;
Iretourne le nombre de lignes cr´ees, modifi´ees,. . .
Application BdD et JDBC
Ex´ecution d’une requˆete
10 / 28
Consultation de la base
IResultSet executeQuery(String requeteSQL)
IExemple :
ResultSet rs1 = stmt.executeQuery(
"select * from tester") ;
ResultSet rs2 = stmt.executeQuery(
"select * from tester where num =" + i ) ;
IL’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 :
Iboolean next() retourne true s’il reste un n-uplet `a lire. Le
premier appel `a next() permet de lire la premi`ere ligne.
IType getType(int i) retourne l’objet de type Typ e de la colonne
en position i
IType getType(String s) retourne l’objet de type Typ e 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
Requˆetes pr´epar´ees 12 / 28
Pr´eparation des requˆetes
IPlus rapide lorsqu’une mˆeme requˆete est ex´ecut´ee plusieurs fois,
mˆeme avec des param`etres di´erents.
ILe SGBD a une version pr´ecompil´ee de la requˆete.
IJDBC permet de :
IPr´eparer une requˆete (avec param`etres)
IPasser les param`etres eectifs `a une requˆete param´etr´ee.
Application BdD et JDBC
Ex´ecution d’une requˆete
Requˆetes pr´epar´ees 13 / 28
L’interface PreparedStatement
ICr´eation d’une requˆete pr´epar´ee :
PreparedStatement cmdSQL =
connect.prepareStatement("select *
from personne where nom=? and age > ?" );
IParam´etrer la reqete :
cmdSQL.setString(1, "dupont") ;
cmdSQL.setInt(2,17) ;
IEx´ecution de la requˆete :
ResultSet rs = cmdSQL.executeQuery() ;
Application BdD et JDBC
Ex´ecution d’une requˆete
Modules stock´es 14 / 28
Proc´edures stock´ees
IJDBC 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 (?,?)}" ) ;
ILes param`etres en entr´ee sont g´er´es comme une requˆete pr´epar´ee
cs1.setString(1,"aa");
cs2.setInt(2,refCompte);
IInvocation 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
Ex´ecution d’une requˆete
Modules stock´es 15 / 28
Fermeture des ressources
On peut
Ifermer un ResultSet : lib`ere les ressources utilis´ees par ce ResultSet.
Ifermer 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)
Ifermer 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 16 / 28
Batch
IDepuis JDBC 3.0, on peut envoyer une liste d’instructions `a
ex´ecuter.
ICette fonctionnalit´e n’est pas requise, il peut donc y avoir des
pilotes qui ne l’impl´ementent pas.
ICe sont forc´ement des instructions qui ne renvoient pas un
ResultSet : instructions DML update, delete, insert, ou instruction
DDL.
IUn Statement dispose de m´ethodes pour g´erer cette liste de
commandes :
Ivoid addBatch(String sql) Ajoute dans la liste la requˆete pass´ee
en param`etre.
Ivoid clearBatch() Vide la liste des instructions.
Iint[] 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 17 / 28
tableau r´esultat
ILe tableau renvoy´e par executeBatch contient en ieme position :
1. Un nombre 0:nombredelignesaect´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 aect´ees.
3. EXECUTE_FAILED : l’instruction ne s’est pas bien ex´ecut´ee. Le
tableau est r´ecup´er´e via l’exception.
ISi ´echec d’une instruction : BatchUpdateException
Ile pilote peut continuer ou arrˆeter de traiter les commandes restantes.
Ion r´ecup`ere le tableau des r´esultats par la m´ethode
BatchUpdateException.getUpdateCounts.
Isi 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).
IAvec 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 18 / 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
Encore des ResultSet
19 / 28
Un peu plus sur les ResultSet
IPar d´efaut, un ResultSet poss`ede un sens unique de parcours
(TYPE_FORWARD_ONLY)
On peut changer ce sens de parcours
IPar d´efaut, un ResultSet est en lecture seule
On peut aussi cr´eer des ResultSet modifiables.
IOn peut param´etrer son comportement par rapport aux autres
Application BdD et JDBC
Encore des ResultSet
20 / 28
Trois types de ResultSet
ITYPE_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,
ICelles obtenues `a l’´ex´ecution de la commande SQL
Iou Celles obtenues au moment de la lecture par la m´ethode next
ITYPE_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.
ITYPE_SCROLL_SENSITIVE Deux sens de parcours et sensible aux
changements r´ealis´ees par ailleurs.
1 / 7 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !