Fmin103 0910 tpjdbc

Karim Amane
Karim AmaneCampus Crusade for Christ
TP Programmation Java / JDBC / Oracle
1. Connectivit´e avec une base de donn´ees Oracle au travers de l’interface
JDBC
L’interface de programmation (API) JDBC (Java DataBase Connectivity) est une librairie Java d’acc`es aux SGBDs
relationnels (Oracle mais aussi Postgresql, MySql, Informix, Access ...). L’id´ee g´en´erale est de faire abstraction des SGBDs
et de fournir un acc`es homog`ene aux donn´ees quel que soit le SGBD cible. Les applications Java (applications bas´ees sur une
architecture J2EE par exemple) vont donc b´en´eficier de facilit´es pour tout ce qui concerne l’exploitation (consultation et mise
`a jour des donn´ees, ´evolution des sch´emas de donn´ees . . . ) de bases de donn´ees pouvant ˆetre h´eberg´ees sur diff´erents serveurs
de donn´ees ainsi que de facilit´es pour tout ce qui concerne la gestion des transactions (essentiel dans un environnement
concurrent).
Pour plus de d´etails, JDBC est une API de J2SE (Java 2 Standard Edition) et donc par extension de J2EE (Java 2 Enterprise
Edition), et comprend :
– un module central d´efinissant les notions de connexion `a une base de donn´ees pour diff´erentes op´erations de consultation,
de mise `a jour ou de possibles ´evolutions du sch´ema.
– une extension ajoutant les notions de sources de donn´ees abstraites accessibles via JNDI (Java Naming and
Directory Interface) et potentiellement mutualisables (pooling) (d´efinitions de transactions globales)
Nous nous concentrons pour ce premier TP sur l’utilisation du module central.
L’interface JDBC est compos´ee de plusieurs classes d’acc`es et d’interfaces organis´ees dans diff´erents paquetages dont un
paquetage de base nomm´e java.sql . Pour travailler avec un SGBD, il faut disposer de classes qui implantent les interfaces de
JDBC, un tel ensemble de classes est d´esign´e sous le nom de driver ou pilote. Plusieurs pilotes sont disponibles (cf. Figure
1). Nous n’aborderons ici que le pilote de type 4 ´ecrit enti`erement en Java.
Fig. 1 – Diagramme sch´ematique illustrant les diff´erences entre pilotes
1
Master M1 IFPRU 2009-2010 2
Les pilotes
2. D´etails pratiques
De mani`ere `a pouvoir exploiter le paquetage java.sql (et autres paquetages n´ecessaires), il faudra ajouter le chemin de
l’archive java (ojdbc14 g.jar) correspondante `a votre chemin des classes (CLASSPATH).
Deux cas se pr´esentent :
– Vous souhaitez travailler, avec un ´editeur (xemacs par exemple) pour ´ecrire les sources et avec le jdk disponible (de
pr´ef´erence 1.5 ou 1.6) depuis votre poste de travail.
Obligation de modifier le fichier .bashrc. en ajoutant la commande
export CLASSPATH=/usr/local/oracle/client 1/jdbc/lib/ojdbc14 g.jar :.
– Vous souhaitez travailler avec l’environnement de d´eveloppement int´egr´e Eclipse, vous aurez alors `a r´ef´erencer dans
votre projet l’archive JDBC (ojdbc14 g.jar). Pour cel`a, cr´eer un projet Appli JDBC puis dans l’explorateur Eclipse,
effectuer les op´erations suivantes :
– 1 - clic droit sur le dossier du projet ;
– 2 - s´electionner l’item Properties dans le menu contextuel ;
– 3 - dans la fenˆetre de configuration des propri´et´es s´electionner l’item Java Build Path
– 4 - s´election de l’onglet Libraries
– 5 - en utilisant le bouton Add External Jars, int´egrer le fichier jar ojdbc14 g.jar (en parcourant l’arborescence de
syst`eme de fichiers)
Vous travaillerez sur la base de donn´ees master (serveur venus) avec des comptes (internes) Oracle de user1 `a user50
(avec le mot de passe de user1 `a user50) pour des raisons de s´ecurit´e.
2.1 Description des principales classes et interfaces d´efinies dans le package java.sql
Nous commen¸cons par exploiter les classes et interfaces du paquetage java.sql.
Un diagramme de classes UML donne une vision d’ensemble de ces classes (cf. figure 2)
– DriverManager g`ere la liste des drivers (ou pilotes), le choix et le chargement d’un des drivers ainsi que la cr´eation
des connexions. Sa m´ethode la plus notable est la m´ethode getConnection(url, user, password) qui retourne une
r´ef´erence d’objet de type Connection.
– Connection repr´esente une connexion avec le SGBD (canal de communication TCP vers une BD avec un format
proche d’une URL) et offre des services pour la manipulation d’ordre SQL au travers de Statement, Prepared-
Statement et CallableStatement. Les ordres SQL rel`event soit du LDD (CREATE, DROP, ALTER, . . . ), soit
du LMD (SELECT, INSERT, UPDATE, DELETE). Une connexion g`ere aussi les transactions (m´ethodes commit(),
rollback(), setAutoCommit(boolean), setIsolationLevel(int) ... Par d´efaut, le mode activ´e est le mode commit auto-
matique.
Exemple de format d’une connexion au travers du pilote jdbc oracle de type 4 au serveur venus et `a la base de
donn´ees master :
jdbc :oracle :thin :@venus :1521 :master
– oracle :thin est un driver est le sous-protocole – @venus :1521 :master d´esigne la base master situ´ee sur la machine
venus (le serveur ´ecoute sur le port 1521)
– Statement Statement admet notamment trois m´ethodes executeQuery() pour ce qui concerne les requˆetes de consul-
tation (SELECT), executeUpdate() pour ce qui concerne les requˆetes de mise `a jour ou les ordres de LDD et execute()
(plus rarement utilis´ee).
– PreparedStatement correspond `a une instruction param´etr´ee, et en ce sens, contient un ordre SQL pr´ecompil´e et
des param`etres d’entr´ee (qui ne seront valu´es que peu avant l’ex´ecution au travers de m´ethodes setXXX (setInt(1,5),
setString(2,”Martin”) par exemple) et qui sont repr´esent´es dans la requˆete par des points d’interrogation. L’ex´ecution
se fait de mani`ere identique `a celle des Statements mais les m´ethodes executeQuery() ou executeUpdate() sont alors
d´epourvues d’arguments.
– CallableStatement pour usage de proc´edures stock´ees dans le SGBD.
– ResultSet L’application de la m´ethode executeQuery() sur un objet Statement (requˆete) retourne un objet de la
classe ResultSet (r´esultats) qu’il convient ensuite d’exploiter pour la restitution des r´esultats de la requˆete. ResultSet
g`ere l’acc`es aux tuples d’un r´esultat en offrant des services de navigation et d’extraction des donn´ees dans ce r´esultat
(repr´esent´ee par une table).
L’acc`es aux colonnes se fait soit par le nom de colonne, soit par l’index (ordre la colonne dans la requˆete) au travers
de 2 m´ethodes g´en´eriques (peuvent servir tous les types de donn´ees SQL) : getString() qui renvoie un String et
Master M1 IFPRU 2009-2010 3
getObject() qui renvoie un Object.
String n = rset.getString("nomPers");
String v = rset.getString(1);
Object o = rset.getObject(1);
Il existe aussi d’autres m´ethodes de type getXXX ou XXX repr´esente le type de l’objet retourn´e (getInt, getBoolean,
getFloat, . . . ). Pour chacune de ces m´ethodes, le driver doit effectuer une conversion entre le type SQL et le type
Java appropri´e
cf voir http ://java.sun.com/docs/books/tutorial/jdbc/basics/
Il est `a noter qu’un statement concerne un seul ordre SQL `a la fois. Si l’on veut r´eutiliser ce statement pour un autre
ordre SQL, il faut s’assurer d’avoir fini d’exploiter la premi`ere requˆete.
La m´ethode getRow() permet de connaˆıtre le nombre de tuples satisfaisant la requˆete. Attention, il faut se placer
`a la fin du curseur (ou ResultSet) pour avoir le nombre de tuples (un exemple est donn´e). Plusieurs cat´egories de
ResultSet sont disponibles selon le sens de parcours et la possibilit´e de modifier ou non les valeurs pr´esentes dans le
ResultSet. Avec forward-only, il n’est pas possible de disposer de fonctionnalit´es de positionnement dans le curseur.
Le updatable permet soit de modifier, soit de supprimer, soit d’ins´erer des tuples dans le ResultSet.
1. forward-only/read-only
2. forward-only/updatable
3. scroll-sensitive/read-only
4. scroll-sensitive/updatable
5. scroll-insensitive/read-only
6. scroll-insensitive/updatable
Diff´erentes signatures de la m´ethode createStatement permettent de d´efinir le ResulSet appropri´e. La plus simple
de ces signatures (public Statement createStatement()) est sans argument et la m´ethode executeQuery associ´ee va
retourn´e un ResultSet non d´efilable, non modifiable et compatible avec les acc`es concurrents en lecture seule. La
signature avec deux arguments createStatement(int,int) permet pour le premier argument, de g´erer la possibilit´e de
parcourir et de modifier le ResultSet et pour le deuxi`eme argument, de g´erer les acc`es concurrents en lecture/´ecriture.
– ResultSetMetadata permet d’exploiter les informations sur la structure d’un objet ResultSet, par exemple le
nombre de colonnes renvoy´ees par le ResultSet, le type de chacune de ces colonnes, le nom de la table associ´ee `a
chacune de ces colonnes . . . .
– getColumnCount() : nombre de colonnes
– getColumnName(int col) : nom d’une colonne
– getColumnType(int col) : type d’une colonne
– getTableName(int col) : nom de la table `a laquelle appartient la colonne
Fig. 2 – Diagramme (non exhaustif) de classes/interfaces du paquetage java.sql
Master M1 IFPRU 2009-2010 4
3. Etapes du travail avec une base de donn´ees et JDBC
Les ´etapes du travail se font en g´en´eral toujours sur le mˆeme sch´ema.
– Ouvrir une connexion (Connection)
Pour ouvrir une connexion `a un SGBD, on demande cette connexion `a la classe gestionnaire de drivers
String url=
"jdbc:oracle:thin:@venus:1521:master";
Connection c =
DriverManager.getConnection(url,"user","mdp");
– Cr´eer des instructions SQL (Statement, PreparedStatement, CallableStatement)
– Lancer l’ex´ecution de ces instructions :
– interroger la base (executeQuery())
– modifier la base (executeUpdate())
– tout autre ordre SQL (execute())
– Fermer la connexion (close())
Un petit exemple ...
La cr´eation est effectu´ee par la m´ethode createStatement.
Statement st = c.createStatement();
ResultSet rest = st.executeQuery("SELECT Nom FROM JOUEUR");
// rest est un curseur , il r´ef´erence la zone des n-uplets r´eponses
while (rest.next())
System.out.println (rest.getString(1));
st.close();
4. Exercices
Pour vous aider `a r´ealiser le TP, nous vous fournissons quelques exemples de classes Java qui ont ´et´e test´ees sur un
sch´ema de bases de donn´ees comportant les sch´emas EMP(Nom,Num, Fonction, N Sup, Embauche, Salaire,Comm,
N dept), DEPT (N dept,Nom, Lieu, Budget)
CREATE TABLE EMP CREATE TABLE DEPT
(NOM VARCHAR2(10), (N_DEPT NUMBER(3),
NUM NUMBER(5) NOT NULL, NOM VARCHAR2(14),
FONCTION VARCHAR2(15), LIEU VARCHAR2(13),
N_SUP NUMBER(5), BUDGET FLOAT);
EMBAUCHE DATE,
SALAIRE NUMBER(7,2),
COMM NUMBER(7,2),
N_DEPT NUMBER(3));
4.1 Exercice 1 : Consultation et manipulation des curseurs
Etudiez l’exemple EmpDescription (donn´e en fin de ce document) qui consulte le contenu de la table EMP afin de
r´epondre aux deux questions suivantes
– A partir de l’exemple EmpDescription construire la classe JoueurDescription qui consulte le contenu de la table
Joueur.
– Dans un deuxi`eme temps construire la classe JoueurSchema qui permet de consulter la description du sch´ema de la
table Joueur `a partir de la table du m´eta-sch´ema appropri´ee (user tab columns). Vous vous assurerez de renvoyer
le nombre de tuples (nombre d’attributs) retourn´e par la requˆete en d´efinissant un curseur (ResultSet) permettant
le parcours avant/arri`ere dans les tuples et en vous positionnant sur le dernier tuple.
4.2 Exercice 2 : Se positionner et modifier un objet ResultSet
Les objets ResultSet (curseurs) peuvent ˆetre parcourus dans les deux sens et peuvent ´egalement servir d’appui `a
la mise `a jour dans une table (suppression, modification, insertion de tuples). Ces propri´et´es de curseurs sont `a
renseigner d`es la cr´eation du statement :
Master M1 IFPRU 2009-2010 5
Statement stmt = c.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
Le premier argument de la m´ethode createStatement indique `a la fois que l’objet ResultSet pourra ˆetre parcouru
de diverses mani`eres (scroll) et que ce mˆeme objet ResultSet ne refl`etera pas les changements effectu´es par d’autres
utilisateurs dans le courant de la session (insensitive).
Vous ´ecrirez une classe nomm´ee InsertionJoueur qui exploite un ResultSet afin d’ins´erer de nouveaux tuples dans
la table Joueur. Pour cela, consulter l’exemple (InsertionTuples) qui permet notamment de se positionner en fin de
curseur et de compter le nombre de tuples contenus dans la table EMP, d’afficher ces tuples puis de rajouter un tuple
dans la table via les m´ethodes moveToInsertRow(), updateXXX(), insertRow().
4.3 Exercice 3 : Manipulation de requˆetes param´etr´ees au travers de l’interface Pre-
paredStatement
Cette interface se concentre sur l’exploitation des ordres qui vont se r´ev´eler r´ep´etitifs et que le concepteur aura tout
int´erˆet `a envisager comme ´etant param´etr´es. Les diff´erences avec Statement porte sur :
– l’instruction SQL va ˆetre pr´e-compil´ee de mani`ere `a am´eliorer les performances puisque cette instruction doit ˆetre
appel´ee de nombreuses fois.
– les instructions SQL des instances de PreparedStatement contiennent un ou plusieurs param`etres d’entr´ee, non
sp´ecifi´es lors de la cr´eation de l’instruction. Ces param`etres sont repr´esent´es par des points d’interrogation( ?). Ces
param`etres doivent ˆetre valu´es avant l’ex´ecution.
Nous utilisons la classe utilitaire nomm´ee Scanner pour faciliter les saisies clavier (paquetage java.util). Un exemple
(DepRepParamSaisieClavier) vous est donn´e, qui propose de modifier la localisation du d´epartement et le budget sur
la base du num´ero de d´epartement renseign´e pass´e en argument par l’usager.
Vous exploiterez plusieurs requˆetes param´etr´ees :
– Une requˆete de consultation sur la condition de s´election portant sur la nationalit´e (France, USA, etc) qui renvoie
le nom, le pr´enom, l’age de tous les joueurs s´electionn´es.
– Une requˆete de mise `a jour (UPDATE) qui effectue une augmentation du Chiffres d’Affaire (CA) de la relation
Sponsor (qui peut ˆetre quelconque et donc param´etr´ee) sur la base d’un nom de Sponsor pass´e en param`etre.
Jusqu’`a maintenant, vous ´etiez en mode autocommit, d´esactivez ce mode auto-commit (setAutoCommit(false) et
ne validez la transaction qu’apr`es demande de validation par l’usager (m´ethodes commit() et rollback()), testez les
effets sur la base de donn´ees en vous connectant par ailleurs via une session sqlplus.
5. Exemples de codes
5.1 Exemple 1
N’oubliez pas de fermer proprement les connexions. Utilisez les m´ecanismes de gestion des exceptions `a cet effet.
Dans le cas contraire, une exception de type SLQException pourrait nuire `a une fermeture correcte de la connexion.
-----------------------------------------------------------------------------
import java.sql.*;
public class EmpDescription {
public static void main(String[] args)
throws SQLException
{
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
}
catch (ClassNotFoundException e)
{System.err.println("Erreur de chargement du driver "+e);}
Connection c = null;
ResultSet rset = null;
Statement stmt = null;
try {
String url = "jdbc:oracle:thin:@venus:1521:master";
c =
DriverManager.getConnection (url, "mast1","mast1");
Master M1 IFPRU 2009-2010 6
stmt = c.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
rset = stmt.executeQuery ("select num , nom "
+ " from EMP");
ResultSetMetaData rsetSchema = rset.getMetaData();
int nbCols = rsetSchema.getColumnCount();
for (int i=1; i<=nbCols;i++)
{
System.out.print(rsetSchema.getColumnName(i)+ " | ");
}
System.out.println();
System.out.println("-------------------------------");
while (rset.next ())
{
for (int i=1; i<=nbCols;i++)
{
System.out.print(rset.getObject(i)+ " | ");;
}
System.out.println();
}
if (!rset.isAfterLast())
rset.afterLast(); rset.previous();
System.out.println("------------------------------");
System.out.println("nbre de tuples dans la table "+rset.getRow());
System.out.println("------------------------------");
}
catch (Exception e) {
System.err.println("Erreur SQL "+e);
}
finally { rset.close();
stmt.close();
c.close();
}
}
}
-----------------------------------------------------------------------------
5.2 Exemple 2
-----------------------------------------------------------------------------
import java.sql.*;
public class InsertionTuples {
public static void main(String[] args)
throws SQLException
{
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
}
catch (ClassNotFoundException e)
{System.err.println("Erreur de chargement du driver "+e);}
Connection c = null;
Statement stmt = null;
ResultSet rset =null;
try {
String url = "jdbc:oracle:thin:@venus:1521:master";
c =
Master M1 IFPRU 2009-2010 7
DriverManager.getConnection (url, "mast1","mast1");
// par defaut mode autocommit ici on le desactive
c.setAutoCommit(false);
// curseur pouvant se parcourir et se modifier
stmt = c.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
rset = stmt.executeQuery ("select num, nom ,"
+ " fonction, salaire from emp");
ResultSetMetaData rsetSchema = rset.getMetaData();
if (!rset.isAfterLast())
rset.afterLast();
rset.previous ();
System.out.println("nbre de tuples :" + rset.getRow());
int nbCols = rsetSchema.getColumnCount();
for (int i=1; i<=nbCols;i++)
{
System.out.print(rsetSchema.getColumnName(i)+ " | ");
}
System.out.println();
System.out.println("_____________________");
if (!rset.isAfterLast())
rset.afterLast();
while (rset.previous ())
{
for (int i=1; i<=nbCols;i++)
{
System.out.print(rset.getObject(i)+ " | ");
}
System.out.println();
}
rset.moveToInsertRow();
rset.updateInt(1,37);
rset.updateString(2,"Voltaire");
rset.updateString(3,"drh");
rset.updateFloat(4,2000);
rset.insertRow();
c.commit();
// testez aussi avec rollback
}
catch (Exception e) {
System.err.println("Erreur SQL "+e);
}
finally {
rset.close();
stmt.close();
c.close();
}
}
}
-----------------------------------------------------------------------------
5.3 Exemple 3
-----------------------------------------------------------------------------
import java.sql.*;
import java.util.Scanner;
public class DepReqParamSaisieClavier {
public static void main(String[] args)
throws SQLException
{
Master M1 IFPRU 2009-2010 8
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
}
catch (ClassNotFoundException e)
{System.err.println("Erreur de chargement du driver "+e);}
Connection c = null;
PreparedStatement pstmt = null;
Scanner saisie = null;
try {
String url = "jdbc:oracle:thin:@venus:1521:master";
c =
DriverManager.getConnection (url, "mast1","mast1");
// par defaut mode autocommit ici on le desactive
c.setAutoCommit(false);
// curseur parametre pouvant etre parcouru et modifie
System.out.println("Entrez un numero de departement");
saisie = new Scanner(System.in);
int dep = saisie.nextInt();
System.out.println("Entrez une localisation");
String local = saisie.next();
System.out.println("Entrez un montant de budget");
double budg = saisie.nextDouble();
String sql = "update dept set lieu=?, budget=? where n_Dept=?";
pstmt = c.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
pstmt.setString(1,local);
pstmt.setDouble(2,budg);
pstmt.setInt(3,dep);
int etat = pstmt.executeUpdate ();
System.out.println("nbre de tuples modifies "+etat);
c.commit();
// testez sans commit
}
catch (Exception e) {
System.err.println("Erreur SQL "+e);
}
finally {
pstmt.close();
c.close();
}
}
}
-----------------------------------------------------------------------------

Recomendados

Jdbc por
JdbcJdbc
Jdbcmohamed el haddad
68 visualizações24 slides
JDBC: Gestion des bases de données en Java por
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 Youness Boukouchi
2.7K visualizações44 slides
Marzouk une introduction à jdbc por
Marzouk une introduction à jdbcMarzouk une introduction à jdbc
Marzouk une introduction à jdbcabderrahim marzouk
63 visualizações27 slides
Accès aux bases de données via jdbc por
Accès aux bases de données via jdbcAccès aux bases de données via jdbc
Accès aux bases de données via jdbcRachid Lajouad
931 visualizações10 slides
JAVA, JDBC et liaison base de données por
JAVA, JDBC et liaison base de donnéesJAVA, JDBC et liaison base de données
JAVA, JDBC et liaison base de donnéesJean David Olekhnovitch
9.2K visualizações51 slides
Jdbc por
JdbcJdbc
JdbcNizar Turki
467 visualizações15 slides

Mais conteúdo relacionado

Mais procurados

Chapitre 1 introduction generale por
Chapitre 1   introduction generaleChapitre 1   introduction generale
Chapitre 1 introduction generaleAmir Souissi
447 visualizações8 slides
Jdbc par4 por
Jdbc par4Jdbc par4
Jdbc par4Karim Amane
298 visualizações7 slides
Présentation nouveauté java7 por
Présentation nouveauté java7Présentation nouveauté java7
Présentation nouveauté java7Cynapsys It Hotspot
1.1K visualizações40 slides
Support Java Avancé Troisième Partie por
Support Java Avancé Troisième PartieSupport Java Avancé Troisième Partie
Support Java Avancé Troisième PartieENSET, Université Hassan II Casablanca
26.4K visualizações200 slides
Les nouveautés de java 7 et les promesses por
Les nouveautés de java 7  et les promessesLes nouveautés de java 7  et les promesses
Les nouveautés de java 7 et les promessesEric Toguem
2.8K visualizações34 slides
Support programmation orientée objet c# .net version f8 por
Support programmation orientée objet c#  .net version f8Support programmation orientée objet c#  .net version f8
Support programmation orientée objet c# .net version f8ENSET, Université Hassan II Casablanca
42.3K visualizações198 slides

Mais procurados(16)

Chapitre 1 introduction generale por Amir Souissi
Chapitre 1   introduction generaleChapitre 1   introduction generale
Chapitre 1 introduction generale
Amir Souissi447 visualizações
Jdbc par4 por Karim Amane
Jdbc par4Jdbc par4
Jdbc par4
Karim Amane298 visualizações
Présentation nouveauté java7 por Cynapsys It Hotspot
Présentation nouveauté java7Présentation nouveauté java7
Présentation nouveauté java7
Cynapsys It Hotspot1.1K visualizações
Les nouveautés de java 7 et les promesses por Eric Toguem
Les nouveautés de java 7  et les promessesLes nouveautés de java 7  et les promesses
Les nouveautés de java 7 et les promesses
Eric Toguem2.8K visualizações
Chapitre 2 classe et objet por Amir Souissi
Chapitre 2   classe et objetChapitre 2   classe et objet
Chapitre 2 classe et objet
Amir Souissi976 visualizações
R2DOCX : R + WORD por Cdiscount
R2DOCX : R + WORDR2DOCX : R + WORD
R2DOCX : R + WORD
Cdiscount5.4K visualizações
Hibernate por Maher Megadmini
HibernateHibernate
Hibernate
Maher Megadmini4.4K visualizações
Springioc por Salim Hamidi
SpringiocSpringioc
Springioc
Salim Hamidi708 visualizações
575 por Aly OMARA
575575
575
Aly OMARA301 visualizações
Formation JPA Java persistence API por Thibault Cuvillier
Formation JPA Java persistence APIFormation JPA Java persistence API
Formation JPA Java persistence API
Thibault Cuvillier2.9K visualizações
Hibernate por Ghazouani Mahdi
HibernateHibernate
Hibernate
Ghazouani Mahdi4.6K visualizações
JNDI Java Naming Derectory Interfaces por benouini rachid
JNDI Java Naming Derectory InterfacesJNDI Java Naming Derectory Interfaces
JNDI Java Naming Derectory Interfaces
benouini rachid1.6K visualizações
Introduction à JPA (Java Persistence API ) por Daniel Rene FOUOMENE PEWO
Introduction à JPA  (Java Persistence API )Introduction à JPA  (Java Persistence API )
Introduction à JPA (Java Persistence API )
Daniel Rene FOUOMENE PEWO3.4K visualizações

Destaque

Introduction jdbc por
Introduction  jdbcIntroduction  jdbc
Introduction jdbcKarim Amane
558 visualizações20 slides
Cours Génie Logiciel - Introduction por
Cours Génie Logiciel - IntroductionCours Génie Logiciel - Introduction
Cours Génie Logiciel - IntroductionMohammed Amine Mostefai
17.3K visualizações36 slides
Génie Logiciels : Introduction aux architectures por
Génie Logiciels : Introduction aux architecturesGénie Logiciels : Introduction aux architectures
Génie Logiciels : Introduction aux architecturesMohammed Amine Mostefai
26.3K visualizações99 slides
Enterprise Java Beans - EJB por
Enterprise Java Beans - EJBEnterprise Java Beans - EJB
Enterprise Java Beans - EJBPeter R. Egli
12.3K visualizações22 slides
Cours Génie Logiciel - Cours 2 - Cycles de vie por
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
54.4K visualizações114 slides
Architectures orientés services (SOA) por
Architectures orientés services (SOA)Architectures orientés services (SOA)
Architectures orientés services (SOA)Heithem Abbes
8.7K visualizações57 slides

Destaque(20)

Introduction jdbc por Karim Amane
Introduction  jdbcIntroduction  jdbc
Introduction jdbc
Karim Amane558 visualizações
Cours Génie Logiciel - Introduction por Mohammed Amine Mostefai
Cours Génie Logiciel - IntroductionCours Génie Logiciel - Introduction
Cours Génie Logiciel - Introduction
Mohammed Amine Mostefai17.3K visualizações
Génie Logiciels : Introduction aux architectures por Mohammed Amine Mostefai
Génie Logiciels : Introduction aux architecturesGénie Logiciels : Introduction aux architectures
Génie Logiciels : Introduction aux architectures
Mohammed Amine Mostefai26.3K visualizações
Enterprise Java Beans - EJB por Peter R. Egli
Enterprise Java Beans - EJBEnterprise Java Beans - EJB
Enterprise Java Beans - EJB
Peter R. Egli12.3K visualizações
Cours Génie Logiciel - Cours 2 - Cycles de vie por Mohammed Amine Mostefai
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
Mohammed Amine Mostefai54.4K visualizações
Architectures orientés services (SOA) por Heithem Abbes
Architectures orientés services (SOA)Architectures orientés services (SOA)
Architectures orientés services (SOA)
Heithem Abbes8.7K visualizações
Entreprise Java Beans (EJB) por Heithem Abbes
Entreprise Java Beans (EJB)Entreprise Java Beans (EJB)
Entreprise Java Beans (EJB)
Heithem Abbes5.8K visualizações
Introduction aux architectures des SI por Heithem Abbes
Introduction aux architectures des SI Introduction aux architectures des SI
Introduction aux architectures des SI
Heithem Abbes5.6K visualizações
Architectures n-tiers por Heithem Abbes
Architectures n-tiersArchitectures n-tiers
Architectures n-tiers
Heithem Abbes32.3K visualizações
Architectures 3-tiers (Web) por Heithem Abbes
Architectures 3-tiers (Web)Architectures 3-tiers (Web)
Architectures 3-tiers (Web)
Heithem Abbes12.6K visualizações
Introduction au génie logiciel 1.2 por Stéphane Salmons
Introduction au génie logiciel 1.2Introduction au génie logiciel 1.2
Introduction au génie logiciel 1.2
Stéphane Salmons5.8K visualizações
Cycle de vie d’un logiciel por Mehdi Abed
Cycle de vie d’un logicielCycle de vie d’un logiciel
Cycle de vie d’un logiciel
Mehdi Abed2.2K visualizações
Cómo enviar mensajes por juanjoreverte
Cómo enviar mensajesCómo enviar mensajes
Cómo enviar mensajes
juanjoreverte419 visualizações
Châteaux de la loire. Sara Martínez 1º Av B por asola
Châteaux de la loire. Sara Martínez 1º Av BChâteaux de la loire. Sara Martínez 1º Av B
Châteaux de la loire. Sara Martínez 1º Av B
asola1.1K visualizações
Médias 2012 ULg por ULg - UCLMons
Médias 2012  ULgMédias 2012  ULg
Médias 2012 ULg
ULg - UCLMons497 visualizações
Portraits por Katelyn Masters
PortraitsPortraits
Portraits
Katelyn Masters230 visualizações
Inscription des Pèlerins - JMJ Rio2013 por jmj_pt
Inscription des Pèlerins - JMJ Rio2013Inscription des Pèlerins - JMJ Rio2013
Inscription des Pèlerins - JMJ Rio2013
jmj_pt7K visualizações
RSLN #3 - La fureur verte por RSLN mag
RSLN #3 - La fureur verteRSLN #3 - La fureur verte
RSLN #3 - La fureur verte
RSLN mag2.7K visualizações
Guía en la redacción al estilo APA, 6ta edición por Ps Avila Ψ
Guía en la redacción al estilo APA, 6ta ediciónGuía en la redacción al estilo APA, 6ta edición
Guía en la redacción al estilo APA, 6ta edición
Ps Avila Ψ696 visualizações

Similar a Fmin103 0910 tpjdbc

JAVA Chapitre1 por
JAVA Chapitre1 JAVA Chapitre1
JAVA Chapitre1 Mohamed Ferchichi
851 visualizações9 slides
tp-spring.pdf por
tp-spring.pdftp-spring.pdf
tp-spring.pdfseydou4devops
35 visualizações12 slides
tp-spring.pdf por
tp-spring.pdftp-spring.pdf
tp-spring.pdfbadrfathallah2
2 visualizações12 slides
Java Database Connectivity por
Java Database ConnectivityJava Database Connectivity
Java Database ConnectivityKorteby Farouk
1.4K visualizações42 slides
Oracle : Foctionnement por
Oracle : FoctionnementOracle : Foctionnement
Oracle : FoctionnementMohammed Jaafar
831 visualizações32 slides
3-android.pdf por
3-android.pdf3-android.pdf
3-android.pdfFethiBenYahia1
36 visualizações47 slides

Similar a Fmin103 0910 tpjdbc(20)

JAVA Chapitre1 por Mohamed Ferchichi
JAVA Chapitre1 JAVA Chapitre1
JAVA Chapitre1
Mohamed Ferchichi851 visualizações
tp-spring.pdf por seydou4devops
tp-spring.pdftp-spring.pdf
tp-spring.pdf
seydou4devops35 visualizações
tp-spring.pdf por badrfathallah2
tp-spring.pdftp-spring.pdf
tp-spring.pdf
badrfathallah22 visualizações
Java Database Connectivity por Korteby Farouk
Java Database ConnectivityJava Database Connectivity
Java Database Connectivity
Korteby Farouk1.4K visualizações
Oracle : Foctionnement por Mohammed Jaafar
Oracle : FoctionnementOracle : Foctionnement
Oracle : Foctionnement
Mohammed Jaafar831 visualizações
3-android.pdf por FethiBenYahia1
3-android.pdf3-android.pdf
3-android.pdf
FethiBenYahia136 visualizações
LP_Admin_base_données.ppt por Idriss22
LP_Admin_base_données.pptLP_Admin_base_données.ppt
LP_Admin_base_données.ppt
Idriss222 visualizações
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro por Olivier Mallassi
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -introNosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
Olivier Mallassi5K visualizações
Améliorations dans Java depuis la version 5 por Mamadou Oury Ba
Améliorations dans Java depuis la version 5Améliorations dans Java depuis la version 5
Améliorations dans Java depuis la version 5
Mamadou Oury Ba344 visualizações
Cours partie1 elgarrai zineb por Zineb ELGARRAI
Cours partie1 elgarrai zinebCours partie1 elgarrai zineb
Cours partie1 elgarrai zineb
Zineb ELGARRAI1.1K visualizações
Sql azure performance et montee en charge (1) por Aymeric Weinbach
Sql azure   performance et montee en charge (1)Sql azure   performance et montee en charge (1)
Sql azure performance et montee en charge (1)
Aymeric Weinbach774 visualizações
Sql por krymo
SqlSql
Sql
krymo1.7K visualizações
La persistance des données : ORM et hibernate por Youness Boukouchi
La persistance des données : ORM et hibernateLa persistance des données : ORM et hibernate
La persistance des données : ORM et hibernate
Youness Boukouchi1.9K visualizações
EJB.pdf por ssuser192642
EJB.pdfEJB.pdf
EJB.pdf
ssuser1926429 visualizações
Introduction à Hibernate p.1 por ATHMAN HAJ-HAMOU
Introduction à Hibernate p.1Introduction à Hibernate p.1
Introduction à Hibernate p.1
ATHMAN HAJ-HAMOU1K visualizações
Php1 por Kadar Abdillahi
Php1Php1
Php1
Kadar Abdillahi814 visualizações
Play SQL at PostgreSQL Lyon User Group por aragot1
Play SQL at PostgreSQL Lyon User GroupPlay SQL at PostgreSQL Lyon User Group
Play SQL at PostgreSQL Lyon User Group
aragot1750 visualizações
Seance_1_cours_introduction_java_Copie.pptx por RihabBENLAMINE
Seance_1_cours_introduction_java_Copie.pptxSeance_1_cours_introduction_java_Copie.pptx
Seance_1_cours_introduction_java_Copie.pptx
RihabBENLAMINE5 visualizações
L’environnement de programmation fonctionnelle DrRacket por Stéphane Legrand
L’environnement de programmation fonctionnelle DrRacketL’environnement de programmation fonctionnelle DrRacket
L’environnement de programmation fonctionnelle DrRacket
Stéphane Legrand2K visualizações

Mais de Karim Amane

Moyen de-recherche-d-emploi por
Moyen de-recherche-d-emploiMoyen de-recherche-d-emploi
Moyen de-recherche-d-emploiKarim Amane
732 visualizações57 slides
Exercices complexes corriges por
Exercices complexes corrigesExercices complexes corriges
Exercices complexes corrigesKarim Amane
14.8K visualizações70 slides
Moivre por
MoivreMoivre
MoivreKarim Amane
355 visualizações2 slides
Fic00001 por
Fic00001Fic00001
Fic00001Karim Amane
446 visualizações12 slides
Chap nombres complexes por
Chap nombres complexesChap nombres complexes
Chap nombres complexesKarim Amane
3.3K visualizações14 slides
الباحثون السوريون انتبه ! الجراثيم تتكاثر في فمك الآن por
الباحثون السوريون   انتبه ! الجراثيم تتكاثر في فمك الآنالباحثون السوريون   انتبه ! الجراثيم تتكاثر في فمك الآن
الباحثون السوريون انتبه ! الجراثيم تتكاثر في فمك الآنKarim Amane
454 visualizações6 slides

Mais de Karim Amane(11)

Moyen de-recherche-d-emploi por Karim Amane
Moyen de-recherche-d-emploiMoyen de-recherche-d-emploi
Moyen de-recherche-d-emploi
Karim Amane732 visualizações
Exercices complexes corriges por Karim Amane
Exercices complexes corrigesExercices complexes corriges
Exercices complexes corriges
Karim Amane14.8K visualizações
Moivre por Karim Amane
MoivreMoivre
Moivre
Karim Amane355 visualizações
Fic00001 por Karim Amane
Fic00001Fic00001
Fic00001
Karim Amane446 visualizações
Chap nombres complexes por Karim Amane
Chap nombres complexesChap nombres complexes
Chap nombres complexes
Karim Amane3.3K visualizações
الباحثون السوريون انتبه ! الجراثيم تتكاثر في فمك الآن por Karim Amane
الباحثون السوريون   انتبه ! الجراثيم تتكاثر في فمك الآنالباحثون السوريون   انتبه ! الجراثيم تتكاثر في فمك الآن
الباحثون السوريون انتبه ! الجراثيم تتكاثر في فمك الآن
Karim Amane454 visualizações
Hdr merlo v4 por Karim Amane
Hdr merlo v4Hdr merlo v4
Hdr merlo v4
Karim Amane1.4K visualizações
Opencourrier por Karim Amane
OpencourrierOpencourrier
Opencourrier
Karim Amane1.4K visualizações
Lp web tp3_idse por Karim Amane
Lp web tp3_idseLp web tp3_idse
Lp web tp3_idse
Karim Amane847 visualizações
Hdr merlo v2 por Karim Amane
Hdr merlo v2Hdr merlo v2
Hdr merlo v2
Karim Amane505 visualizações
Exercicescorrigesdivers por Karim Amane
ExercicescorrigesdiversExercicescorrigesdivers
Exercicescorrigesdivers
Karim Amane385 visualizações

Fmin103 0910 tpjdbc

  • 1. TP Programmation Java / JDBC / Oracle 1. Connectivit´e avec une base de donn´ees Oracle au travers de l’interface JDBC L’interface de programmation (API) JDBC (Java DataBase Connectivity) est une librairie Java d’acc`es aux SGBDs relationnels (Oracle mais aussi Postgresql, MySql, Informix, Access ...). L’id´ee g´en´erale est de faire abstraction des SGBDs et de fournir un acc`es homog`ene aux donn´ees quel que soit le SGBD cible. Les applications Java (applications bas´ees sur une architecture J2EE par exemple) vont donc b´en´eficier de facilit´es pour tout ce qui concerne l’exploitation (consultation et mise `a jour des donn´ees, ´evolution des sch´emas de donn´ees . . . ) de bases de donn´ees pouvant ˆetre h´eberg´ees sur diff´erents serveurs de donn´ees ainsi que de facilit´es pour tout ce qui concerne la gestion des transactions (essentiel dans un environnement concurrent). Pour plus de d´etails, JDBC est une API de J2SE (Java 2 Standard Edition) et donc par extension de J2EE (Java 2 Enterprise Edition), et comprend : – un module central d´efinissant les notions de connexion `a une base de donn´ees pour diff´erentes op´erations de consultation, de mise `a jour ou de possibles ´evolutions du sch´ema. – une extension ajoutant les notions de sources de donn´ees abstraites accessibles via JNDI (Java Naming and Directory Interface) et potentiellement mutualisables (pooling) (d´efinitions de transactions globales) Nous nous concentrons pour ce premier TP sur l’utilisation du module central. L’interface JDBC est compos´ee de plusieurs classes d’acc`es et d’interfaces organis´ees dans diff´erents paquetages dont un paquetage de base nomm´e java.sql . Pour travailler avec un SGBD, il faut disposer de classes qui implantent les interfaces de JDBC, un tel ensemble de classes est d´esign´e sous le nom de driver ou pilote. Plusieurs pilotes sont disponibles (cf. Figure 1). Nous n’aborderons ici que le pilote de type 4 ´ecrit enti`erement en Java. Fig. 1 – Diagramme sch´ematique illustrant les diff´erences entre pilotes 1
  • 2. Master M1 IFPRU 2009-2010 2 Les pilotes 2. D´etails pratiques De mani`ere `a pouvoir exploiter le paquetage java.sql (et autres paquetages n´ecessaires), il faudra ajouter le chemin de l’archive java (ojdbc14 g.jar) correspondante `a votre chemin des classes (CLASSPATH). Deux cas se pr´esentent : – Vous souhaitez travailler, avec un ´editeur (xemacs par exemple) pour ´ecrire les sources et avec le jdk disponible (de pr´ef´erence 1.5 ou 1.6) depuis votre poste de travail. Obligation de modifier le fichier .bashrc. en ajoutant la commande export CLASSPATH=/usr/local/oracle/client 1/jdbc/lib/ojdbc14 g.jar :. – Vous souhaitez travailler avec l’environnement de d´eveloppement int´egr´e Eclipse, vous aurez alors `a r´ef´erencer dans votre projet l’archive JDBC (ojdbc14 g.jar). Pour cel`a, cr´eer un projet Appli JDBC puis dans l’explorateur Eclipse, effectuer les op´erations suivantes : – 1 - clic droit sur le dossier du projet ; – 2 - s´electionner l’item Properties dans le menu contextuel ; – 3 - dans la fenˆetre de configuration des propri´et´es s´electionner l’item Java Build Path – 4 - s´election de l’onglet Libraries – 5 - en utilisant le bouton Add External Jars, int´egrer le fichier jar ojdbc14 g.jar (en parcourant l’arborescence de syst`eme de fichiers) Vous travaillerez sur la base de donn´ees master (serveur venus) avec des comptes (internes) Oracle de user1 `a user50 (avec le mot de passe de user1 `a user50) pour des raisons de s´ecurit´e. 2.1 Description des principales classes et interfaces d´efinies dans le package java.sql Nous commen¸cons par exploiter les classes et interfaces du paquetage java.sql. Un diagramme de classes UML donne une vision d’ensemble de ces classes (cf. figure 2) – DriverManager g`ere la liste des drivers (ou pilotes), le choix et le chargement d’un des drivers ainsi que la cr´eation des connexions. Sa m´ethode la plus notable est la m´ethode getConnection(url, user, password) qui retourne une r´ef´erence d’objet de type Connection. – Connection repr´esente une connexion avec le SGBD (canal de communication TCP vers une BD avec un format proche d’une URL) et offre des services pour la manipulation d’ordre SQL au travers de Statement, Prepared- Statement et CallableStatement. Les ordres SQL rel`event soit du LDD (CREATE, DROP, ALTER, . . . ), soit du LMD (SELECT, INSERT, UPDATE, DELETE). Une connexion g`ere aussi les transactions (m´ethodes commit(), rollback(), setAutoCommit(boolean), setIsolationLevel(int) ... Par d´efaut, le mode activ´e est le mode commit auto- matique. Exemple de format d’une connexion au travers du pilote jdbc oracle de type 4 au serveur venus et `a la base de donn´ees master : jdbc :oracle :thin :@venus :1521 :master – oracle :thin est un driver est le sous-protocole – @venus :1521 :master d´esigne la base master situ´ee sur la machine venus (le serveur ´ecoute sur le port 1521) – Statement Statement admet notamment trois m´ethodes executeQuery() pour ce qui concerne les requˆetes de consul- tation (SELECT), executeUpdate() pour ce qui concerne les requˆetes de mise `a jour ou les ordres de LDD et execute() (plus rarement utilis´ee). – PreparedStatement correspond `a une instruction param´etr´ee, et en ce sens, contient un ordre SQL pr´ecompil´e et des param`etres d’entr´ee (qui ne seront valu´es que peu avant l’ex´ecution au travers de m´ethodes setXXX (setInt(1,5), setString(2,”Martin”) par exemple) et qui sont repr´esent´es dans la requˆete par des points d’interrogation. L’ex´ecution se fait de mani`ere identique `a celle des Statements mais les m´ethodes executeQuery() ou executeUpdate() sont alors d´epourvues d’arguments. – CallableStatement pour usage de proc´edures stock´ees dans le SGBD. – ResultSet L’application de la m´ethode executeQuery() sur un objet Statement (requˆete) retourne un objet de la classe ResultSet (r´esultats) qu’il convient ensuite d’exploiter pour la restitution des r´esultats de la requˆete. ResultSet g`ere l’acc`es aux tuples d’un r´esultat en offrant des services de navigation et d’extraction des donn´ees dans ce r´esultat (repr´esent´ee par une table). L’acc`es aux colonnes se fait soit par le nom de colonne, soit par l’index (ordre la colonne dans la requˆete) au travers de 2 m´ethodes g´en´eriques (peuvent servir tous les types de donn´ees SQL) : getString() qui renvoie un String et
  • 3. Master M1 IFPRU 2009-2010 3 getObject() qui renvoie un Object. String n = rset.getString("nomPers"); String v = rset.getString(1); Object o = rset.getObject(1); Il existe aussi d’autres m´ethodes de type getXXX ou XXX repr´esente le type de l’objet retourn´e (getInt, getBoolean, getFloat, . . . ). Pour chacune de ces m´ethodes, le driver doit effectuer une conversion entre le type SQL et le type Java appropri´e cf voir http ://java.sun.com/docs/books/tutorial/jdbc/basics/ Il est `a noter qu’un statement concerne un seul ordre SQL `a la fois. Si l’on veut r´eutiliser ce statement pour un autre ordre SQL, il faut s’assurer d’avoir fini d’exploiter la premi`ere requˆete. La m´ethode getRow() permet de connaˆıtre le nombre de tuples satisfaisant la requˆete. Attention, il faut se placer `a la fin du curseur (ou ResultSet) pour avoir le nombre de tuples (un exemple est donn´e). Plusieurs cat´egories de ResultSet sont disponibles selon le sens de parcours et la possibilit´e de modifier ou non les valeurs pr´esentes dans le ResultSet. Avec forward-only, il n’est pas possible de disposer de fonctionnalit´es de positionnement dans le curseur. Le updatable permet soit de modifier, soit de supprimer, soit d’ins´erer des tuples dans le ResultSet. 1. forward-only/read-only 2. forward-only/updatable 3. scroll-sensitive/read-only 4. scroll-sensitive/updatable 5. scroll-insensitive/read-only 6. scroll-insensitive/updatable Diff´erentes signatures de la m´ethode createStatement permettent de d´efinir le ResulSet appropri´e. La plus simple de ces signatures (public Statement createStatement()) est sans argument et la m´ethode executeQuery associ´ee va retourn´e un ResultSet non d´efilable, non modifiable et compatible avec les acc`es concurrents en lecture seule. La signature avec deux arguments createStatement(int,int) permet pour le premier argument, de g´erer la possibilit´e de parcourir et de modifier le ResultSet et pour le deuxi`eme argument, de g´erer les acc`es concurrents en lecture/´ecriture. – ResultSetMetadata permet d’exploiter les informations sur la structure d’un objet ResultSet, par exemple le nombre de colonnes renvoy´ees par le ResultSet, le type de chacune de ces colonnes, le nom de la table associ´ee `a chacune de ces colonnes . . . . – getColumnCount() : nombre de colonnes – getColumnName(int col) : nom d’une colonne – getColumnType(int col) : type d’une colonne – getTableName(int col) : nom de la table `a laquelle appartient la colonne Fig. 2 – Diagramme (non exhaustif) de classes/interfaces du paquetage java.sql
  • 4. Master M1 IFPRU 2009-2010 4 3. Etapes du travail avec une base de donn´ees et JDBC Les ´etapes du travail se font en g´en´eral toujours sur le mˆeme sch´ema. – Ouvrir une connexion (Connection) Pour ouvrir une connexion `a un SGBD, on demande cette connexion `a la classe gestionnaire de drivers String url= "jdbc:oracle:thin:@venus:1521:master"; Connection c = DriverManager.getConnection(url,"user","mdp"); – Cr´eer des instructions SQL (Statement, PreparedStatement, CallableStatement) – Lancer l’ex´ecution de ces instructions : – interroger la base (executeQuery()) – modifier la base (executeUpdate()) – tout autre ordre SQL (execute()) – Fermer la connexion (close()) Un petit exemple ... La cr´eation est effectu´ee par la m´ethode createStatement. Statement st = c.createStatement(); ResultSet rest = st.executeQuery("SELECT Nom FROM JOUEUR"); // rest est un curseur , il r´ef´erence la zone des n-uplets r´eponses while (rest.next()) System.out.println (rest.getString(1)); st.close(); 4. Exercices Pour vous aider `a r´ealiser le TP, nous vous fournissons quelques exemples de classes Java qui ont ´et´e test´ees sur un sch´ema de bases de donn´ees comportant les sch´emas EMP(Nom,Num, Fonction, N Sup, Embauche, Salaire,Comm, N dept), DEPT (N dept,Nom, Lieu, Budget) CREATE TABLE EMP CREATE TABLE DEPT (NOM VARCHAR2(10), (N_DEPT NUMBER(3), NUM NUMBER(5) NOT NULL, NOM VARCHAR2(14), FONCTION VARCHAR2(15), LIEU VARCHAR2(13), N_SUP NUMBER(5), BUDGET FLOAT); EMBAUCHE DATE, SALAIRE NUMBER(7,2), COMM NUMBER(7,2), N_DEPT NUMBER(3)); 4.1 Exercice 1 : Consultation et manipulation des curseurs Etudiez l’exemple EmpDescription (donn´e en fin de ce document) qui consulte le contenu de la table EMP afin de r´epondre aux deux questions suivantes – A partir de l’exemple EmpDescription construire la classe JoueurDescription qui consulte le contenu de la table Joueur. – Dans un deuxi`eme temps construire la classe JoueurSchema qui permet de consulter la description du sch´ema de la table Joueur `a partir de la table du m´eta-sch´ema appropri´ee (user tab columns). Vous vous assurerez de renvoyer le nombre de tuples (nombre d’attributs) retourn´e par la requˆete en d´efinissant un curseur (ResultSet) permettant le parcours avant/arri`ere dans les tuples et en vous positionnant sur le dernier tuple. 4.2 Exercice 2 : Se positionner et modifier un objet ResultSet Les objets ResultSet (curseurs) peuvent ˆetre parcourus dans les deux sens et peuvent ´egalement servir d’appui `a la mise `a jour dans une table (suppression, modification, insertion de tuples). Ces propri´et´es de curseurs sont `a renseigner d`es la cr´eation du statement :
  • 5. Master M1 IFPRU 2009-2010 5 Statement stmt = c.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); Le premier argument de la m´ethode createStatement indique `a la fois que l’objet ResultSet pourra ˆetre parcouru de diverses mani`eres (scroll) et que ce mˆeme objet ResultSet ne refl`etera pas les changements effectu´es par d’autres utilisateurs dans le courant de la session (insensitive). Vous ´ecrirez une classe nomm´ee InsertionJoueur qui exploite un ResultSet afin d’ins´erer de nouveaux tuples dans la table Joueur. Pour cela, consulter l’exemple (InsertionTuples) qui permet notamment de se positionner en fin de curseur et de compter le nombre de tuples contenus dans la table EMP, d’afficher ces tuples puis de rajouter un tuple dans la table via les m´ethodes moveToInsertRow(), updateXXX(), insertRow(). 4.3 Exercice 3 : Manipulation de requˆetes param´etr´ees au travers de l’interface Pre- paredStatement Cette interface se concentre sur l’exploitation des ordres qui vont se r´ev´eler r´ep´etitifs et que le concepteur aura tout int´erˆet `a envisager comme ´etant param´etr´es. Les diff´erences avec Statement porte sur : – l’instruction SQL va ˆetre pr´e-compil´ee de mani`ere `a am´eliorer les performances puisque cette instruction doit ˆetre appel´ee de nombreuses fois. – les instructions SQL des instances de PreparedStatement contiennent un ou plusieurs param`etres d’entr´ee, non sp´ecifi´es lors de la cr´eation de l’instruction. Ces param`etres sont repr´esent´es par des points d’interrogation( ?). Ces param`etres doivent ˆetre valu´es avant l’ex´ecution. Nous utilisons la classe utilitaire nomm´ee Scanner pour faciliter les saisies clavier (paquetage java.util). Un exemple (DepRepParamSaisieClavier) vous est donn´e, qui propose de modifier la localisation du d´epartement et le budget sur la base du num´ero de d´epartement renseign´e pass´e en argument par l’usager. Vous exploiterez plusieurs requˆetes param´etr´ees : – Une requˆete de consultation sur la condition de s´election portant sur la nationalit´e (France, USA, etc) qui renvoie le nom, le pr´enom, l’age de tous les joueurs s´electionn´es. – Une requˆete de mise `a jour (UPDATE) qui effectue une augmentation du Chiffres d’Affaire (CA) de la relation Sponsor (qui peut ˆetre quelconque et donc param´etr´ee) sur la base d’un nom de Sponsor pass´e en param`etre. Jusqu’`a maintenant, vous ´etiez en mode autocommit, d´esactivez ce mode auto-commit (setAutoCommit(false) et ne validez la transaction qu’apr`es demande de validation par l’usager (m´ethodes commit() et rollback()), testez les effets sur la base de donn´ees en vous connectant par ailleurs via une session sqlplus. 5. Exemples de codes 5.1 Exemple 1 N’oubliez pas de fermer proprement les connexions. Utilisez les m´ecanismes de gestion des exceptions `a cet effet. Dans le cas contraire, une exception de type SLQException pourrait nuire `a une fermeture correcte de la connexion. ----------------------------------------------------------------------------- import java.sql.*; public class EmpDescription { public static void main(String[] args) throws SQLException { try { Class.forName("oracle.jdbc.driver.OracleDriver"); } catch (ClassNotFoundException e) {System.err.println("Erreur de chargement du driver "+e);} Connection c = null; ResultSet rset = null; Statement stmt = null; try { String url = "jdbc:oracle:thin:@venus:1521:master"; c = DriverManager.getConnection (url, "mast1","mast1");
  • 6. Master M1 IFPRU 2009-2010 6 stmt = c.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); rset = stmt.executeQuery ("select num , nom " + " from EMP"); ResultSetMetaData rsetSchema = rset.getMetaData(); int nbCols = rsetSchema.getColumnCount(); for (int i=1; i<=nbCols;i++) { System.out.print(rsetSchema.getColumnName(i)+ " | "); } System.out.println(); System.out.println("-------------------------------"); while (rset.next ()) { for (int i=1; i<=nbCols;i++) { System.out.print(rset.getObject(i)+ " | ");; } System.out.println(); } if (!rset.isAfterLast()) rset.afterLast(); rset.previous(); System.out.println("------------------------------"); System.out.println("nbre de tuples dans la table "+rset.getRow()); System.out.println("------------------------------"); } catch (Exception e) { System.err.println("Erreur SQL "+e); } finally { rset.close(); stmt.close(); c.close(); } } } ----------------------------------------------------------------------------- 5.2 Exemple 2 ----------------------------------------------------------------------------- import java.sql.*; public class InsertionTuples { public static void main(String[] args) throws SQLException { try { Class.forName("oracle.jdbc.driver.OracleDriver"); } catch (ClassNotFoundException e) {System.err.println("Erreur de chargement du driver "+e);} Connection c = null; Statement stmt = null; ResultSet rset =null; try { String url = "jdbc:oracle:thin:@venus:1521:master"; c =
  • 7. Master M1 IFPRU 2009-2010 7 DriverManager.getConnection (url, "mast1","mast1"); // par defaut mode autocommit ici on le desactive c.setAutoCommit(false); // curseur pouvant se parcourir et se modifier stmt = c.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); rset = stmt.executeQuery ("select num, nom ," + " fonction, salaire from emp"); ResultSetMetaData rsetSchema = rset.getMetaData(); if (!rset.isAfterLast()) rset.afterLast(); rset.previous (); System.out.println("nbre de tuples :" + rset.getRow()); int nbCols = rsetSchema.getColumnCount(); for (int i=1; i<=nbCols;i++) { System.out.print(rsetSchema.getColumnName(i)+ " | "); } System.out.println(); System.out.println("_____________________"); if (!rset.isAfterLast()) rset.afterLast(); while (rset.previous ()) { for (int i=1; i<=nbCols;i++) { System.out.print(rset.getObject(i)+ " | "); } System.out.println(); } rset.moveToInsertRow(); rset.updateInt(1,37); rset.updateString(2,"Voltaire"); rset.updateString(3,"drh"); rset.updateFloat(4,2000); rset.insertRow(); c.commit(); // testez aussi avec rollback } catch (Exception e) { System.err.println("Erreur SQL "+e); } finally { rset.close(); stmt.close(); c.close(); } } } ----------------------------------------------------------------------------- 5.3 Exemple 3 ----------------------------------------------------------------------------- import java.sql.*; import java.util.Scanner; public class DepReqParamSaisieClavier { public static void main(String[] args) throws SQLException {
  • 8. Master M1 IFPRU 2009-2010 8 try { Class.forName("oracle.jdbc.driver.OracleDriver"); } catch (ClassNotFoundException e) {System.err.println("Erreur de chargement du driver "+e);} Connection c = null; PreparedStatement pstmt = null; Scanner saisie = null; try { String url = "jdbc:oracle:thin:@venus:1521:master"; c = DriverManager.getConnection (url, "mast1","mast1"); // par defaut mode autocommit ici on le desactive c.setAutoCommit(false); // curseur parametre pouvant etre parcouru et modifie System.out.println("Entrez un numero de departement"); saisie = new Scanner(System.in); int dep = saisie.nextInt(); System.out.println("Entrez une localisation"); String local = saisie.next(); System.out.println("Entrez un montant de budget"); double budg = saisie.nextDouble(); String sql = "update dept set lieu=?, budget=? where n_Dept=?"; pstmt = c.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); pstmt.setString(1,local); pstmt.setDouble(2,budg); pstmt.setInt(3,dep); int etat = pstmt.executeUpdate (); System.out.println("nbre de tuples modifies "+etat); c.commit(); // testez sans commit } catch (Exception e) { System.err.println("Erreur SQL "+e); } finally { pstmt.close(); c.close(); } } } -----------------------------------------------------------------------------