SlideShare uma empresa Scribd logo
1 de 8
Baixar para ler offline
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();
}
}
}
-----------------------------------------------------------------------------

Mais conteúdo relacionado

Mais procurados (16)

Chapitre 1 introduction generale
Chapitre 1   introduction generaleChapitre 1   introduction generale
Chapitre 1 introduction generale
 
Jdbc par4
Jdbc par4Jdbc par4
Jdbc par4
 
Présentation nouveauté java7
Présentation nouveauté java7Présentation nouveauté java7
Présentation nouveauté java7
 
Support Java Avancé Troisième Partie
Support Java Avancé Troisième PartieSupport Java Avancé Troisième Partie
Support Java Avancé Troisième Partie
 
Les nouveautés de java 7 et les promesses
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
 
Support programmation orientée objet c# .net version f8
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 f8
 
Chapitre 2 classe et objet
Chapitre 2   classe et objetChapitre 2   classe et objet
Chapitre 2 classe et objet
 
R2DOCX : R + WORD
R2DOCX : R + WORDR2DOCX : R + WORD
R2DOCX : R + WORD
 
Hibernate
HibernateHibernate
Hibernate
 
Springioc
SpringiocSpringioc
Springioc
 
575
575575
575
 
Formation JPA Java persistence API
Formation JPA Java persistence APIFormation JPA Java persistence API
Formation JPA Java persistence API
 
Hibernate
HibernateHibernate
Hibernate
 
JNDI Java Naming Derectory Interfaces
JNDI Java Naming Derectory InterfacesJNDI Java Naming Derectory Interfaces
JNDI Java Naming Derectory Interfaces
 
La 2ème partie de la présentation PHP
La 2ème partie de la présentation PHPLa 2ème partie de la présentation PHP
La 2ème partie de la présentation PHP
 
Introduction à JPA (Java Persistence API )
Introduction à JPA  (Java Persistence API )Introduction à JPA  (Java Persistence API )
Introduction à JPA (Java Persistence API )
 

Destaque

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
 
Cómo enviar mensajes
Cómo enviar mensajesCómo enviar mensajes
Cómo enviar mensajesjuanjoreverte
 
Châteaux de la loire. Sara Martínez 1º Av B
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 Basola
 
Inscription des Pèlerins - JMJ Rio2013
Inscription des Pèlerins - JMJ Rio2013Inscription des Pèlerins - JMJ Rio2013
Inscription des Pèlerins - JMJ Rio2013jmj_pt
 
RSLN #3 - La fureur verte
RSLN #3 - La fureur verteRSLN #3 - La fureur verte
RSLN #3 - La fureur verteRSLN mag
 
Guía en la redacción al estilo APA, 6ta edición
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ónPs Avila Ψ
 

Destaque (20)

Introduction jdbc
Introduction  jdbcIntroduction  jdbc
Introduction 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
 
Prog psic laboral 2012
Prog psic laboral 2012Prog psic laboral 2012
Prog psic laboral 2012
 
Cómo enviar mensajes
Cómo enviar mensajesCómo enviar mensajes
Cómo enviar mensajes
 
Châteaux de la loire. Sara Martínez 1º Av B
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
 
Médias 2012 ULg
Médias 2012  ULgMédias 2012  ULg
Médias 2012 ULg
 
Portraits
PortraitsPortraits
Portraits
 
Inscription des Pèlerins - JMJ Rio2013
Inscription des Pèlerins - JMJ Rio2013Inscription des Pèlerins - JMJ Rio2013
Inscription des Pèlerins - JMJ Rio2013
 
RSLN #3 - La fureur verte
RSLN #3 - La fureur verteRSLN #3 - La fureur verte
RSLN #3 - La fureur verte
 
Guía en la redacción al estilo APA, 6ta edición
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
 

Semelhante a Fmin103 0910 tpjdbc

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
 
introductionaudevcomposantdistribuejavaee.pdf
introductionaudevcomposantdistribuejavaee.pdfintroductionaudevcomposantdistribuejavaee.pdf
introductionaudevcomposantdistribuejavaee.pdfHamdaneAbdelAzizHagg
 
LP_Admin_base_données.ppt
LP_Admin_base_données.pptLP_Admin_base_données.ppt
LP_Admin_base_données.pptIdriss22
 
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
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 -introOlivier Mallassi
 
Améliorations dans Java depuis la version 5
Améliorations dans Java depuis la version 5Améliorations dans Java depuis la version 5
Améliorations dans Java depuis la version 5Mamadou Oury Ba
 
Cours partie1 elgarrai zineb
Cours partie1 elgarrai zinebCours partie1 elgarrai zineb
Cours partie1 elgarrai zinebZineb ELGARRAI
 
Sql azure performance et montee en charge (1)
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 Weinbach
 
La persistance des données : ORM et hibernate
La persistance des données : ORM et hibernateLa persistance des données : ORM et hibernate
La persistance des données : ORM et hibernateYouness Boukouchi
 
Introduction à Hibernate p.1
Introduction à Hibernate p.1Introduction à Hibernate p.1
Introduction à Hibernate p.1ATHMAN HAJ-HAMOU
 
Play SQL at PostgreSQL Lyon User Group
Play SQL at PostgreSQL Lyon User GroupPlay SQL at PostgreSQL Lyon User Group
Play SQL at PostgreSQL Lyon User Grouparagot1
 

Semelhante a Fmin103 0910 tpjdbc (20)

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 Chapitre1
JAVA Chapitre1 JAVA Chapitre1
JAVA Chapitre1
 
tp-spring.pdf
tp-spring.pdftp-spring.pdf
tp-spring.pdf
 
tp-spring.pdf
tp-spring.pdftp-spring.pdf
tp-spring.pdf
 
Java Database Connectivity
Java Database ConnectivityJava Database Connectivity
Java Database Connectivity
 
Oracle : Foctionnement
Oracle : FoctionnementOracle : Foctionnement
Oracle : Foctionnement
 
introductionaudevcomposantdistribuejavaee.pdf
introductionaudevcomposantdistribuejavaee.pdfintroductionaudevcomposantdistribuejavaee.pdf
introductionaudevcomposantdistribuejavaee.pdf
 
3-android.pdf
3-android.pdf3-android.pdf
3-android.pdf
 
LP_Admin_base_données.ppt
LP_Admin_base_données.pptLP_Admin_base_données.ppt
LP_Admin_base_données.ppt
 
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
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
 
Améliorations dans Java depuis la version 5
Améliorations dans Java depuis la version 5Améliorations dans Java depuis la version 5
Améliorations dans Java depuis la version 5
 
Cours partie1 elgarrai zineb
Cours partie1 elgarrai zinebCours partie1 elgarrai zineb
Cours partie1 elgarrai zineb
 
Sql azure performance et montee en charge (1)
Sql azure   performance et montee en charge (1)Sql azure   performance et montee en charge (1)
Sql azure performance et montee en charge (1)
 
Sql
SqlSql
Sql
 
La persistance des données : ORM et hibernate
La persistance des données : ORM et hibernateLa persistance des données : ORM et hibernate
La persistance des données : ORM et hibernate
 
EJB.pdf
EJB.pdfEJB.pdf
EJB.pdf
 
Introduction à Hibernate p.1
Introduction à Hibernate p.1Introduction à Hibernate p.1
Introduction à Hibernate p.1
 
Nouveautés Java 9-10-11
Nouveautés Java 9-10-11Nouveautés Java 9-10-11
Nouveautés Java 9-10-11
 
Php1
Php1Php1
Php1
 
Play SQL at PostgreSQL Lyon User Group
Play SQL at PostgreSQL Lyon User GroupPlay SQL at PostgreSQL Lyon User Group
Play SQL at PostgreSQL Lyon User Group
 

Mais 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
 

Mais 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
 

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(); } } } -----------------------------------------------------------------------------