Anda di halaman 1dari 34

ROYAUME DU MAROC

Office de la Formation Professionnelle et de la Promotion du Travail

www.cours-ofppt.com

Accder aux bases de donnes avec


JDBC

DIRECTION RECHERCHE ET INGENIERIE DE FORMATION


SECTEUR NTIC

ROYAUME DU MAROC

Office de la Formation Professionnelle et de la Promotion du Travail

DIRECTION RECHERCHE ET INGENIERIE DE FORMATION


SECTEUR NTIC

JDBC

www.cours-ofppt.com
Sommaire

1.

2.

Ce quest JDBC._______________________________________________________________2
1.1.

Introduction._____________________________________________________________________2

1.2.

Technologies._____________________________________________________________________2

La connexion aux bases de donnes._______________________________________________4


2.1.

Etablissement dun lien ODBC vers la base de donnes__________________________________4

2.2.

Chargement de la classe du Driver dsir._____________________________________________7

2.3.

tablissement de la connexion______________________________________________________8

2.4.

Passage d'une requte et exploitation des rsultats______________________________________9

2.4.1.

Requtes directes._____________________________________________________________________9

2.5.

Exploitation des rsultats._________________________________________________________10

2.6.

Les requtes prcompiles (ou paramtres)._________________________________________13

2.7.

Procdures stockes.______________________________________________________________15

2.7.1.
2.7.2.
2.7.3.
2.7.4.
2.7.5.
2.7.6.
2.7.7.

2.8.

Exemple 1 Procdure stocke non paramtre______________________________________________17


Exemple 2 Procdure stocke avec un paramtre en entre____________________________________18
Exemple 3 Procdure stocke avec un paramtre en sortie_____________________________________19
Exemple 4 Procdure stocke avec un paramtre en entre/sortie_______________________________20
Exemple 5 Procdure stocke avec un paramtre en entre et un rsultat_________________________22
Exemple 6 Procdure stocke avec des paramtres et un code de retour__________________________23
Exemple 7 Procdure stocke avec un code de retour et un resultset_____________________________25

Le Contrle d'intgrit de la base de donne._________________________________________26

OFPPT @

Document

Millsime

294242725.doc

juillet 12

Page
1 - 34

JDBC

1.Ce quest JDBC.


1.1.

Introduction.

JDBC est lAPI java pour se connecter des bases de donnes


htrognes. JDBC est conue pour que le dveloppeur puisse se
concentrer au maximum sur son application, et perde le moins
dnergie possible pour traiter des problmes techniques de liens avec
la base de donnes.
JDBC trois rles :
Se connecter une base de donnes avec linterface adquat
( driver ).
Envoyer des requtes SQL.
Exploiter les rsultats des requtes.
ODBC ne pourrait pas tre employ dans java car son interface est en
langage C, ODBC nest pas objet, et son emploi nest pas trs simple.
De plus ODBC ncessite dinstaller un driver ODBC sur la machine
cliente.
Avec JDBC nous avons une solution objet, simple, en pur Java, qui ne
ncessite rien de particulier sur la machine cliente ( condition de
prendre le driver JDBC qui nest pas encore adopt par Bill ).

1.2.

Technologies.

Technologie 2/3 ou client-serveur.

appli

Base
donnes

jdbc

cl
ie

OFPPT @

de

s
e

Document

Millsime

294242725.doc

juillet 12

Page
2 - 34

JDBC

Technologie 3/3 ou serveur dapplication et serveur de base de donnes

prsentation

Client html ou applet

appli

Base de
donnes

jdbc

Serveur dapplication

Serveur de base de
donnes

Lavantage de la technologie 3/3 est de permettre de srier les


problmes. Cela permet encore de dcharger le client et de le banaliser
(explorateur internet), et damliorer les performances globales du
systme (client plus rduit, moins dinformations sur les lignes, ).
JDBC est conforme au standard SQL.
Voici un schma du fonctionnement de java :
Application
JAVA
Gestionnaire de pilote JDBC

Pilote JDBC-net

Pilote de
liaison JDBCODBC

Pilote X

Pilote Y

BDD

Le pilote JDBC ne ncessite pas dinstallation sur la machine cliente, et il


est de plus en plus intgr aux bases de donnes.
Le pilote ODBC lui doit tre install sur les machines clientes.

OFPPT @

Document

Millsime

294242725.doc

juillet 12

Page
3 - 34

JDBC

2. La connexion aux bases de donnes.


La classe DriverManager est le gestionnaire des drivers permettant
lutilisateur laccs aux bases de donnes.

2.1. Etablissement dun lien ODBC vers la base de


donnes
Dans le panneau de configuration de Windows, utilisez licne
outils dadministration puis Data Source ODBC .

Ajoutez votre base cliquant le bouton ajouter.

OFPPT @

Document

Millsime

294242725.doc

juillet 12

Page
4 - 34

JDBC

Choisissez le driver de base de donne, ici SQL Server.

OFPPT @

Document

Millsime

294242725.doc

juillet 12

Page
5 - 34

JDBC

Donnez le nom de votre base (ici cest le petit nom local de la


base) et le nom du serveur.

Donnez la manire de vous identifier auprs de la base.

OFPPT @

Document

Millsime

294242725.doc

juillet 12

Page
6 - 34

JDBC

Donnez maintenant le vrai nom de la base laquelle vous voulez


vous connecter. Cliquez sur suivant, puis sur terminer. Votre lien
ODBC vers votre base est tabli. Vous pouvez tester ce lien en
cliquant le bouton tester la source de donnes .

OFPPT @

Document

Millsime

294242725.doc

juillet 12

Page
7 - 34

JDBC

2.2.

Chargement de la classe du Driver dsir.

try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") ;
// pour charger le driver ODBC
}
catch ( Exception e)
{

}
La classe statique dsire est charge. A l'tablissement de la
connexion le driver sera automatiquement charg par la fonction
getConnection.

2.3.

OFPPT @

tablissement de la connexion

Document

Millsime

294242725.doc

juillet 12

Page
8 - 34

JDBC

Par l'administrateur de source de donnes ODBC vous avez dfini un


nom logique pour reprsenter votre base. A ce nom sont associs un
pilote, un nom de serveur, Nous accderons la base de donnes par
ce nom logique.
Pour se connecter la base de donnes il suffit de demander une
connexion la base au DriverManager en donnant le nom logique de la
base.
String url = "jdbc:odbc: sebo"; // sebo est le nom logique de la base
Connection cox = null;
try{
cox = DriverManager.getConnection(url,"user","pswd");
// demande d'une connexion la base avec le nom d'user et
son mot de passe
}
catch(Exception e)
{

}
Exemple de connexion une base de donnes:
// connexion une base de donne
import java.sql.*; // importation des classes jdbc
public class Class1
{
public static void main (String[] args)
{
try
{
Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");
// chargement de la classe du pilote
}
catch(Exception e)
{
e.printStackTrace ();
}
try
{
String url ="jdbc:odbc:banque";
Connection con= DriverManager.getConnection (url,
"arrault", "");
// chargement du pilote et connexion la base
System.out.println ("a marche ");
System.in.read ();

}
catch(Exception e)

OFPPT @

Document

Millsime

294242725.doc

juillet 12

Page
9 - 34

JDBC
{
System.out.println ("la connexion a chou");
e.printStackTrace ();
}
}

2.4.

Passage d'une
rsultats

requte

et

exploitation

des

Ici nous allons passer une requte la base de donnes et exploiter les
ventuels rsultats. Ds que nous avons rcupr une connexion, nous
allons pouvoir passer des requtes la base. Nous allons pouvoir
travailler de trois manire diffrentes.

Les requtes directes la base (Statement)


Les requtes prpares (PreparedStatement). Ce sont des requtes,
souvent paramtres, qui sont prcompiles par la base, ce qui
acclre leurs traitement. Nous utiliserons des requtes prpares
chaque fois qu'une requte doit tre passes sur un grand ensemble
de donnes.
L'appel de procdures stockes. Ces procdures peuvent tre
paramtres, avoir un rsultat en retour, et nous retourner un
ensemble solution (les lignes rsultant d'un SELECT par exemple).

Nous verrons galement comment exploiter les rsultats des requtes.

2.4.1.

Requtes directes.

Voici un exemple de requte, une fois que nous avons eu une connexion
(cox).
Statement st = cox.createStatement(); // creation d'un objet requte
directe
Resulset Resultat; // cration d'une variable qui rfrencera l'ensemble
des rsultats
Resultat = stm.executeQuery("SELECT x,y,z FROM table");
// excution de la requte
// nous exploiterons plus loin les rsultats
int ret = stm.executeUpdate("DELETE ");
Il existe trois manires d'excuter des requtes SQL.

OFPPT @

Document

Millsime

294242725.doc

juillet 12

Page
10 - 34

JDBC

executeQuery : c'est une interrogation qui produit un ensemble


simple de lignes rsultat (SELECT).
executeUpdate : c'est la modification de l'tat de la base (INSERT,
UPDATE, DELETE, CREATE TABLE, DROP TABLE). Le rsultat est la
modification de 1 ou plusieurs colonnes de 0 plusieurs lignes de la
table. Cela retourne le nombre de lignes modifies (pour les requtes
CREATE et DROP le rsultat est toujours 0).
execute : est utilis pour excuter des requtes qui retournent plus
d'un ensemble de rsultat, ou plus d'une valeur de retour, ou les
deux. Cette manire d'excuter des requtes SQL est assez peu
utilises par les dveloppeurs, nous la passerons donc sous silence.

2.5.

Exploitation des rsultats.

Un ResultSet contient en retour d'un executeQuery toutes les lignes qui


satisfont les conditions. Reprenons notre code:
Resultat = stm.executeQuery ("SELECT x,y,z FROM table");
// excution de la requte
while (Resultat.next())
{
int i = Resultat.getInt ("x");
String S = Resultat.getString ("y");
Float f = Resultat.getFloat("z");
System.out.println ("ligne = "+i+" "+S+" "+f);
}
stm.close();
// il est recommand de fermer la Statement mme si le
garbage collector fait
//le travail quand mme.
cox.close(); // idem pour la connexion
Le ResultSet un curseur sur les lignes rsultantes. Initialement ce
cursuer est positionn avant la premire ligne. La mthode next le
positionne sur la ligne suivante.
Pour lire la ligne nous utilisons les fonctions:
getXXX( "nom-de-colonne"); ou XXX est le type de la donne lue
( voir la classe ResultSet ) .
getXXX(numcolonne); ou XXX est le type de la donne lue ( voir la
classe ResultSet ) et numcolonne est le numro de la colonne
concerne ( 1 pour la colonne la plus gauche ).
Les noms de colonne ne peuvent tre utiliss que si ils figurent dans la
requte SQL. Si deux colonnes ont le mme nom, l'accs par le nom de
colonne ne donne que la premire des deux. Il est plus efficace de

OFPPT @

Document

Millsime

294242725.doc

juillet 12

Page
11 - 34

JDBC

passer par le numro de colonne, mais il est plus lisible de passer par le
nom des colonnes ( sauf dans le cas ou le nom est dupliqu ).
Ci joint une copie des correspondances entre les types Java et les types
JDBC, et un exemple de traitement d'une requte SQL en direct sans
rsultat, et d'une requte SQL avec un ResultSet.
// exemple de requte SQL sans rsultat
import java.sql.*;
public class Class1
{
public static void main (String[] args)
{
try
{
//Chargement de la classe du 'Driver'
//pour etablir la connection ODBC
Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(Exception e)
{
System.out.println ("le pilote n'a pu tre charg");
}
try
{
//tablissement de la connection au lien ODBC 'banque'
//,o l'indentificateur de connection
// est "arrault" , et de code ""
Connection con= DriverManager.getConnection
("jdbc:odbc:banque", "arrault", "");
//cration d'un objet
de la classe Statement qui permet
//d'effectuer des requtes lies la connection 'con'
Statement select=con.createStatement ();
//appel de la mthode executeUpdate de la classe
//Statement qui permet d'crire dans une base
select.executeUpdate("INSERT INTO
COMPTE(NumCompte, Nom,
Prenom, Solde) VALUES(13, 'Grisolano', 'Philippe',
18000)");
//il est recommand de fermer
l'objet Statement
select.close();
//et de fermer la connection
con.close ();
}
catch(Exception e)
{
//ceci permet d'crire l'exception intercepte
e.printStackTrace ();

OFPPT @

Document

Millsime

294242725.doc

juillet 12

Page
12 - 34

JDBC
}
}

OFPPT @

Document

Millsime

294242725.doc

juillet 12

Page
13 - 34

JDBC
// exemple de requte SQL avec un rsultat
import java .sql

.*;

public class Class1


{
public static void main (String[] args)
{
try
{
Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(Exception e)
{
System.out.println ("le pilote n'a pu tre charg");
}
try
{
Connection con= DriverManager.getConnection
("jdbc:odbc:banque","arrault","");
Statement
select=con.createStatement ();
//executeQuery correspond la demande d'excution de la
// requte. La variable result ( ResultSet ) est
// est l'ensemble des rsultats renvoys par la requte
ResultSet result =select.executeQuery ("SELECT * "+
"FROM COMPTE");
//next renvoie true lorsqu'il existe une range
//supplmentaire
while(result.next())
{
//conversion du rsultat dans le bon type
int Num=result.getInt (1);
String Nom=result.getString (2);
String Prenom=result.getString (3);
String argent=result.getString (4);
System.out.println ("Num : "+Num+"
Nom : "+Nom+"
Prenom : "+Prenom+ "
argent : "+argent);
}
//il est recommand de fermet l'objet Statement
select.close();
//et de fermer la connection
con.close ();
}
catch(Exception e)
{
//ceci permet d'crire l'exception intercepte
e.printStackTrace ();
}

OFPPT @

Document

Millsime

294242725.doc

juillet 12

Page
14 - 34

JDBC

2.6.

Les requtes prcompiles (ou paramtres).

Les requtes prcompiles sont des requtes " trous ", que le SGBD
compile afin de prparer leur excution . Cela permet d'acclrer leur
traitement.
La classe PreparedStatement reprsente ce type de requte. Une
PreparedStatement contient une requte prcompile. Elle a au moins
un paramtre en entre. Ce paramtre est reprsent dans la requte
par un point d'interrogation '?'.
Avant l'excution d'une PreparedStatement il faut appeler la fonction
setXXX pour chacun de ces paramtres ( afin de remplir tous les
trous ).
Les PreparedStatements sont des requtes excutes un grand nombre
de fois, qui sont prcompiles afin d'en optimiser le traitement.
La classe PreparedStatement hrite de Statement, mais il ne faut pas
utiliser les mthodes de la classe mre, mais toujours les mthodes de
la classe fille.
Exemple d'utilisation:
// prparation de la requte
PreparedStatement ps = cox.prepareStatement("UPDATE table SET
m=? WHERE x=?");
// garniture des trous avant l'excution
ps.setString(1,"toto");
ps.setFloat(2,5.0);
// excution de la requte
ps.executeUpdate();
Pour l'appel suivant nous pouvons redfinir un ou plusieurs des
paramtres, les paramtres non modifis tant conservs. La fonction
clearParameters efface tous les paramtres. Le mode de fonctionnement
par dfaut est le mode autocommit.
setNull() met un paramtre null.
setxxx () xxx reprsente le type Java.
Dans le cas d'un SELECT le traitement du ResultSet retourn est le
mme que pour une requte directe.

OFPPT @

Document

Millsime

294242725.doc

juillet 12

Page
15 - 34

JDBC

Il est noter que les points d'interrogation de la PreparedStatement ne


remplace que des valeurs de champs de la base. Il ne peuvent pas se
substituer des noms de colonne, ou de table; cela serait l'objet de la
dfinition d'une nouvelle requte. N'oublions pas qu'ici nous traitons des
requtes paramtres (pour plus de dtail voir votre documentation
SQL prfre).
Voici un exemple de traitement par une requte prcompile:
// exemple de requtes paramtres
import java .sql

.*; // importation des classes SQL

public class Class1


{
public static void main (String[] args)
{
try
{
Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(Exception e)
{
System.out.println ("le pilote n'a pu tre charg");
}
try
{
Connection con= DriverManager.getConnection
("jdbc:odbc:banque","arrault","");
//Crer une requte prdfinie par la classe
// PreparedStatement sur la connexion con
PreparedStatement instruction = con.prepareStatement (
"SELECT * "+
"FROM COMPTE " +
"WHERE Nom=? ");
//donner la valeur du paramtre pour l'excution de la
//requte
instruction.setString (1,"perrin" );
//excution de la requte (lecture de la base)
ResultSet result =instruction.executeQuery ();
//affichage du rsultat
while(result.next())
{
String Nom=result.getString (2);
System.out.println ("Nom : " + Nom);
}
// fermeture de la requte
instruction.close();
//Crer une requte prdfinie pour une mise a jour de la
// base avec cette fois-ci deux paramtres
instruction = con.prepareStatement (

OFPPT @

Document

Millsime

294242725.doc

juillet 12

Page
16 - 34

JDBC
"UPDATE COMPTE "+
"SET Solde=? " +
"WHERE Nom=? ");
//donner les valeurs manquant la requte pour chacun
//des deux paramtres de la requte paramtre
instruction.setInt (1,122 );
instruction.setString (2,"perrin" );
//excuter la requte
instruction.execute ();
//fermeture de la requte
instruction.close ();
// fermeture de la connexion
con.close ();
}
catch(Exception e)
{
//ceci permet d'crire l'exception intercepte
e.printStackTrace ();
}
}

2.7.

Procdures stockes.

Une procdure stocke est une procdure enregistre sur la base de


donne. La classe CallableStatement est la classe qui permet une
requte via une procdure stocke. Elle hrite de PreparedStatement.
Un objet CallableStatement contient un appel une procdure
stocke.
Nous trouverons deux formes d'appel d'une procdure stocke.
Les procdures non paramtres.
Les procdures paramtres.
Pour chacun de ces cas il peut y avoir ou pas un code de retour de la procdure
stocke

Cela nous donne les quatre interfaces suivantes.


{ call nom_proc }
{ call nom_proc ( ?, ?, ? ) }
{ ?=call nom_proc }
{ ?=call nom_proc ( ?, ?, ? ) }
Voici comment crer une CallableStatement:
CallableStatement cs = cox.prepareCall( "{call test ( ?, ? ) }");

OFPPT @

Document

Millsime

294242725.doc

juillet 12

Page
17 - 34

JDBC

Avant d'excuter la requte il faut garnir les paramtres.

Les paramtres en entre seront affects en utilisant la mthode


setXXX () ou XXX est le type JDBC des donnes. C'est une
conversion entre une donne Java et une donne JDBC.
Les paramtres en sortie seront dcrits avant l'appel, par l'appel de
la mthode registerOutParameter ().

setInt(1,7); // le premier paramtre est un entier en entre. Il vaut 7

cs.registerOutParameter(2,java.sql.Types.TINYINT);
// le paramtre 2 est un Byte en sortie.
cs.executeUpdate(); // ou ResultSet rs = cs.executeQuery();
il ne reste plus qu' rcuprer la valeur du paramtre en sortie.
byte x = cs.getByte(2);
Si la procdure stocke nous retourne un ResultSet, il sera alors trait
comme prcdemment.

Attention!!!
Si nous traitons le code de retour de la procdure stocke ce sera le
premier paramtre de l'appel. Il sera trait comme un paramtre en
sortie. Il est important de noter que si nous avons un ResultSet et une
valeur de retour, ou des paramtres de sortie, il faut d'abord vider le
ResultSet avant de rcuprer les valeurs de sortie, ou de retour.
Vous trouverez des exemples d'appels des procdures stockes dans
les 7 cas suivants:

Pas de paramtres.
Un paramtre en entre.
Un paramtre en sortie.
Un Paramtre en entre/sortie.
Un ResultSet en rsultat de l'excution de la requte, avec un
paramtre en entre.
Une valeur de retour de la procdure stocke.
Une valeur de retour de la procdure stocke avec un ResultSet.

OFPPT @

Document

Millsime

294242725.doc

juillet 12

Page
18 - 34

JDBC

2.7.1.

Exemple 1 Procdure stocke non paramtre

/* codage de la procdure sql */


CREATE PROCEDURE phil AS

BEGIN
SELECT *
FROM COMPTE
END
/* exemple 1 : procdure stocke non paramtre
codage du programme java */
import java.sql.*; // importation des classes jdbc
public class Class1
{
public static void main (String[] args)
{
try
{
Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(Exception e)
{
System.out.println ("le pilote n'a pu tre charg");
}
try
{
Connection con= DriverManager.getConnection
("jdbc:odbc:banque","arrault","");
//Appel d'une procdure stocke(pralablement cre sous
//sql Server) sans paramtre
CallableStatement cs= con.prepareCall ("{call phil}");
//excution de la procdure stocke
ResultSet result=cs.executeQuery ();
// lecture du rsultat
while(result.next())
{
int Num=result.getInt (1);
String Nom=result.getString (2);
String Prenom=result.getString (3);
String argent=result.getString(4);
System.out.println ("Num : "+Num+" Nom :" +Nom
+" Prenom : "+Prenom+ " argent : "+argent);
}
// fermeture de le requte et de la connexion
cs.close ();
con.close ();
}

OFPPT @

Document

Millsime

294242725.doc

juillet 12

Page
19 - 34

JDBC
catch(Exception e)
{
//ceci permet d'crire l'exception intercepte
e.printStackTrace ();
}

}
}

2.7.2. Exemple 2 Procdure stocke avec un paramtre en


entre
/* exemple 2 : procdure stocke avec un paramtre en
entre
codage de la procdure sql */
CREATE PROCEDURE paramin ( @num int) AS

BEGIN
SELECT *
FROM COMPTE
WHERE NumCompte = @num
END
/* exemple 2 : procdure stocke avec un paramtre en
entre
codage du programme java */
import java.sql.*; // importation des classes jdbc
public class Class1
{
public static void main (String[] args)
{
try
{
Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(Exception e)
{
System.out.println ("le pilote n'a pu tre charg");
}
try
{
Connection con= DriverManager.getConnection
("jdbc:odbc:banque","arrault","");
//Appel d'une procdure stocke(pralablement cre sous
//sql Server) avec paramtre
CallableStatement cs= con.prepareCall

OFPPT @

Document

Millsime

294242725.doc

juillet 12

Page
20 - 34

JDBC
("{call paramin(?)}");
// passage du premier paramtre
cs.setInt(1,4);
//excution de la procdure stocke(avec un paramtre)
ResultSet result=cs.executeQuery ();
//rcupration des valeurs renvoyes par la procdure
while(result.next())
{

int Num=result.getInt (1);


String Nom=result.getString (2);
String Prenom=result.getString (3);
String argent=result.getString(4);
System.out.println ("Num : "+Num+" Nom : "+Nom+
" Prenom : "+Prenom+ " argent : "+argent);

// fermeture de la requte et de la connexion


cs.close ();
con.close ();
}
catch(Exception e)
{
//ceci permet d'crire l'exception intercepte
e.printStackTrace ();
}
}

2.7.3. Exemple 3 Procdure stocke avec un paramtre en


sortie
/* exemple 3 : procdure stocke avec un paramtre en
sortie
codage de la procdure sql */
CREATE PROCEDURE paramout @solde int OUTPUT
AS

BEGIN
SELECT @solde = MAX(Solde)
FROM COMPTE
WHERE Nom = 'Dumousseau'
END
/* exemple 3 : procdure stocke avec un paramtre en
sortie

OFPPT @

Document

Millsime

294242725.doc

juillet 12

Page
21 - 34

JDBC

codage du programme java */


import java.sql.*; // importation des classes JDBC
public class Class1
{
public static void main (String[] args)
{
try
{
Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(Exception e)
{
System.out.println ("le pilote n'a pu tre charg");
}
try
{
Connection con= DriverManager.getConnection
("jdbc:odbc:banque","arrault","");
//Appel d'une procdure stocke avec un paramtre de
//sortie
CallableStatement cs= con.prepareCall
("{call paramout(?)}");
//Description du paramtre en sortie
cs.registerOutParameter (1,java.sql.Types.INTEGER

);

//excution de la requte
cs.executeUpdate ();
//rcupration du paramtre
int Num=cs.getInt (1) ;
//affichage du rsultat
System.out.println ("Num : "+Num);
// fermeture de la requte et de la connexion
cs.close ();
con.close ();
}
catch(Exception e)
{
//ceci permet d'crire l'exception intercepte
e.printStackTrace ();
}
}

2.7.4. Exemple 4 Procdure stocke avec un paramtre en


entre/sortie

OFPPT @

Document

Millsime

294242725.doc

juillet 12

Page
22 - 34

JDBC

/* exemple 4 : procdure stocke avec un paramtre en


entre/sortie
codage de la procdure sql */

CREATE PROCEDURE paramresult @solde int OUTPUT


AS

BEGIN
SELECT Solde
FROM COMPTE
WHERE NumCompte = @solde
Select @solde = Solde
FROM COMPTE
WHERE Nom = 'Grisolano'
END
/* exemple 4 : procdure stocke avec un paramtre en
entre/sortie
codage du programme java */
import java.sql.*; // importation des classes jdbc
public class Class1
{
public static void main (String[] args)
{
try
{
Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(Exception e)
{
System.out.println ("le pilote n'a pu tre charg");
}
try
{
Connection con= DriverManager.getConnection
("jdbc:odbc:banque","arrault","");
//instruction d'appel d'une procdure stocke avec un
// paramtre d'entre/ sortie
CallableStatement cs= con.prepareCall
("{call paraminout(?)}");

OFPPT @

Document

Millsime

294242725.doc

juillet 12

Page
23 - 34

JDBC
//passage du paramtre en entre
cs.setFloat (1,12.0f);//si float
//Description du paramtre en sortie ( le mme )
cs.registerOutParameter (1,java.sql.Types.FLOAT

);

//execution de la requete
cs.executeQuery();
//rcupration du paramtre
float Solde=cs.getFloat (1)

//affichage du rsultat
System.out.println ("Nouveau solde : "+Solde);
// fermeture de la requte et de la connexion
cs.close ();
con.close ();
}
catch(Exception e)
{
//ceci permet d'crire l'exception intercepte
e.printStackTrace ();
}

}
}

2.7.5. Exemple 5 Procdure stocke avec un paramtre en


entre et un rsultat
/* exemple 5 : procdure stocke avec un paramtre en
entre et un rsultat
codage de la procdure sql */
CREATE PROCEDURE paramresult @solde varchar(30)
AS

BEGIN
SELECT *
FROM COMPTE
WHERE Nom = @solde
END
/* exemple 5 : procdure stocke avec un paramtre en
entre et un rsultat
codage du programme java */

OFPPT @

Document

Millsime

294242725.doc

juillet 12

Page
24 - 34

JDBC
import java.sql.*;

// importation des classes jdbc

public class Class1


{
public static void main (String[] args)
{
int paye;
try
{
Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(Exception e)
{
System.out.println ("le pilote n'a pu tre charg");
}
try
{
Connection con= DriverManager.getConnection
("jdbc:odbc:banque","arrault","");
//Appel d'une procdure stocke avec un paramtre en
//entre et retournant un ResultSet
CallableStatement cs= con.prepareCall
("{call paramresult(?)}");
//passage du paramtre en entre
cs.setString (1,"perrin");
//excution de la requte et ,rcupration de la table
ResultSet result=cs.executeQuery();
//affichage d'un champ de la rponse rcupre
while (result.next ())
{
// rcupration du troisime champ de la ligne
String Num=result.getString (3) ;
}

System.out.println ("les Prenoms de Perrin: "+Num);

// fermeture de la requte et de la connexion


cs.close ();
con.close ();
}
catch(Exception e)
{
//ceci permet d'crire l'exception intercepte
e.printStackTrace ();
}
}

2.7.6. Exemple 6 Procdure stocke avec des paramtres et


un code de retour
/* exemple 6 : procdure stocke avec des paramtres et
un code de retour

OFPPT @

Document

Millsime

294242725.doc

juillet 12

Page
25 - 34

JDBC

codage de la procdure sql */


CREATE PROCEDURE param2in1retour @nom varchar(30),@combien int
AS
BEGIN
UPDATE COMPTE set Solde=@combien
WHERE Nom=@nom
RETURN 5
END
/* exemple 6 : procdure stocke avec des paramtres et
un code de retour
codage de la procdure sql */
import java.sql.*; // importation des classes jdbc
public class Class1
{
public static void main (String[] args)
{
int code; // valeur du code retour rcupr de l'appel SQL
try
{
Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(Exception e)
{
System.out.println ("le pilote n'a pu tre charg");
}
try
{
Connection con= DriverManager.getConnection
("jdbc:odbc:banque","arrault","");
// prparation de l'appel de la procdure stocke
// ?= call indique que l'on rcupre la valeur de retour
// le premier paramtre in est fourni l'appel
// le deuxime paramtre in est fix pour cette requte
CallableStatement cs= con.prepareCall
("{?=call param2in1retour(?,123)}");
// configuration du type de la valeur de retour ( c'est
// forcment un entier )
cs.registerOutParameter (1,java.sql.Types.INTEGER );
// la valeur du premier paramtre in est configure
cs.setString (2,"perrin");
// excution de la requte
cs.executeUpdate ();
// rcupration du rsultat de la valeur de retour

OFPPT @

Document

Millsime

294242725.doc

juillet 12

Page
26 - 34

JDBC
code=cs.getInt(1);
// fermeture de la requte et de la connexion
cs.close ();
con.close ();
System.out.println ("code retour :"+code);
}
catch(Exception e)
{
//ceci permet d'crire l'exception intercepte
e.printStackTrace ();
}

}
}

2.7.7. Exemple 7 Procdure stocke avec un code de retour et


un resultset
/* exemple 7 : procdure stocke avec un code retour et un
ResulSet
codage de la procdure sql */
CREATE PROCEDURE paramtotal @nom varchar(30),@max money
OUTPUT,@combien int
AS
BEGIN
UPDATE COMPTE SET Solde=@combien
WHERE Nom=@nom
SELECT *
FROM COMPTE
WHERE Solde=@combien
SELECT @max=MAX(Solde)
FROM COMPTE
RETURN 5
END
/* exemple 7 : procdure stocke avec un code retour et un
ResulSet
codage de la procdure sql */
import java.sql.*;

// importation des classes JDBC

public class Class1


{
public static void main (String[] args)
{
int code;
try
{
Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");

OFPPT @

Document

Millsime

294242725.doc

juillet 12

Page
27 - 34

JDBC
}
catch(Exception e)
{
System.out.println ("le pilote n'a pu tre charg");
}
try
{
Connection con= DriverManager.getConnection
("jdbc:odbc:banque","arrault","");
// constitution de la requte d'appel la procdure avec
// une valeur prdfinie pour un paramtre (4)
CallableStatement cs= con.prepareCall
("{?=call paramtotal(?,?,123)}");
//
(1)
(2)(3)(4)
// (1) est la valeur retourne par la fonction
// (2) est le premier paramtre. Il est en entre
// (3) est le deuxime paramtre. Il est en sortie
// (4) est le troisime paramtre. Il est en entre et
//
fix dans la requte
// description de la valeur de retour de la procdure (1)
cs.registerOutParameter (1,java.sql .Types .INTEGER );
// description du paramtre en sortie (3)
cs.registerOutParameter (3,java.sql .Types .DOUBLE

);

// la valeur du premier paramtre in est configure (2)


cs.setString (2,"perrin");
// excution de la requte
ResultSet rs=cs.executeQuery

();

// il faut commencer par exploiter le ResultSet


// sinon a ne marchera pas !!!
// parcours du ResultSet jusqu'au bout
while (rs.next ())
{
System.out .println (rs.getInt (1));
}
// rcupration de la valeur de retour de la procdure
code=cs.getInt(1);
// rcupration de la valeur du paramtre en sortie
System.out.println ("le solde max est:"+cs.getDouble(3));
// fermeture de la requte et de la connexion
cs.close ();
con.close ();
System.out.println ("code retour :"+code);
}
catch(Exception e)
{
//ceci permet d'crire l'exception intercepte
e.printStackTrace ();

OFPPT @

Document

Millsime

294242725.doc

juillet 12

Page
28 - 34

JDBC
}
}

2.8.

Le Contrle d'intgrit de la base de donne.

Il serait temps de s'intresser l'intgrit de la base de donne.


Toutes les requtes effectues jusqu' maintenant ont t effectues
en autocommit. Le mode de fonctionnement est une caractristique
de la connexion. Le mode par dfaut est autocommit, c'est dire
que chaque requte SQL est considre comme une transaction
individuelle. Le commit s'effectue quand la requte se termine, ou
quand la prochaine excution dmarre (le premier des deux). Dans le
cas de requte retournant un ResultSet, le commit s'effectue quand
la dernire ligne du ResultSet a t lue, ou que le ResultSet t
ferm.
Les mthodes suivantes sont utilises (mthodes de la classe
Connection):

getAutoCommit () : retourne vrai ou faux en fonction du


positionnement de lautocommit.
setAutoCommit (true) : positionne le mode autocommit vrai.
commit () : si le mode est non autocommit, cela enregistre les
derniers changements depuis le dernier commit/rollback, et
relche tous les verrous poss par la connexion.
rollback (): si le mode est non autocommit, cela annule les
derniers changements depuis le dernier commit/rollback, et
relche tous les verrous poss par la connexion.

Voici un exemple de scurisation de transaction en utilisant les


exceptions, pour ne valider une transaction que si tout est correct.

OFPPT @

Document

Millsime

294242725.doc

juillet 12

Page
29 - 34

JDBC

// programme java de prservation de l'intgrit de la base


de donne
import java.sql.*;

// importation des classes jdbc

public class Class1


{
public static void main (String[] args)
{
Connection con=null; // rfrence de la connexion
try
{
Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(Exception e)
{
System.out.println ("le pilote n'a pu tre charg");
}
try
{
con= DriverManager.getConnection
("jdbc:odbc:banque","arrault","");
Statement select=con.createStatement ();
// spcifions que les transactions devront tre valides
// manuellement
con.setAutoCommit (false);
//appel de la mthode executeUpdate de la classe
//Statement qui permet d'crire dans une base
// nous voulons ici faire les deux mises jour,
// ou aucune des deux pour des raisons ( supposes )
// d'intgrit de la base.
select.executeUpdate("INSERT INTO COMPTE(NumCompte, Nom,
Prenom, Solde)"+
"VALUES(23, 'Grisolano', 'Philippe', 5550)");
select.executeUpdate("INSERT INTO
COMPTE(NumCompte,Nom,Prenom,Solde)"+
"VALUES(22, 'Grisolano', 'Philippe', 3680)");
//validation des deux requtes si aucune des 2 n'a
//gnre une exception
con.commit ();
//fermeture de la requte et de la connexion
select.close();
con.close ();
}
catch(SQLException e)
{
e.getSQLState

OFPPT @

();

Document

Millsime

294242725.doc

juillet 12

Page
30 - 34

JDBC
try
{

}
}

//si la connection existe


if (con!= null)
{
//on annule la transaction
con.rollback();
}

}
catch (Exception er) {}

OFPPT @

Document

Millsime

294242725.doc

juillet 12

Page
31 - 34

JDBC

Pour approfondir le sujet.


Proposition de rfrences utiles permettant dapprofondir le thme abord

Sources de rfrence
Citer les auteurs et les sources de rfrence utilises pour llaboration du
support

OFPPT @

Document

Millsime

294242725.doc

juillet 12

Page
32 - 34

Anda mungkin juga menyukai