www.cours-ofppt.com
ROYAUME DU MAROC
JDBC
www.cours-ofppt.com
Sommaire
1.
2.
Ce quest JDBC._______________________________________________________________2
1.1.
Introduction._____________________________________________________________________2
1.2.
Technologies._____________________________________________________________________2
2.2.
2.3.
tablissement de la connexion______________________________________________________8
2.4.
2.4.1.
Requtes directes._____________________________________________________________________9
2.5.
2.6.
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.
OFPPT @
Document
Millsime
294242725.doc
juillet 12
Page
1 - 34
JDBC
Introduction.
1.2.
Technologies.
appli
Base
donnes
jdbc
cl
ie
OFPPT @
de
s
e
Document
Millsime
294242725.doc
juillet 12
Page
2 - 34
JDBC
prsentation
appli
Base de
donnes
jdbc
Serveur dapplication
Serveur de base de
donnes
Pilote JDBC-net
Pilote de
liaison JDBCODBC
Pilote X
Pilote Y
BDD
OFPPT @
Document
Millsime
294242725.doc
juillet 12
Page
3 - 34
JDBC
OFPPT @
Document
Millsime
294242725.doc
juillet 12
Page
4 - 34
JDBC
OFPPT @
Document
Millsime
294242725.doc
juillet 12
Page
5 - 34
JDBC
OFPPT @
Document
Millsime
294242725.doc
juillet 12
Page
6 - 34
JDBC
OFPPT @
Document
Millsime
294242725.doc
juillet 12
Page
7 - 34
JDBC
2.2.
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
}
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.
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
2.5.
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
.*;
OFPPT @
Document
Millsime
294242725.doc
juillet 12
Page
14 - 34
JDBC
2.6.
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
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.
OFPPT @
Document
Millsime
294242725.doc
juillet 12
Page
17 - 34
JDBC
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.
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 ();
}
}
}
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())
{
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
);
//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 ();
}
}
OFPPT @
Document
Millsime
294242725.doc
juillet 12
Page
22 - 34
JDBC
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 ();
}
}
}
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.*;
OFPPT @
Document
Millsime
294242725.doc
juillet 12
Page
25 - 34
JDBC
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 ();
}
}
}
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
);
();
OFPPT @
Document
Millsime
294242725.doc
juillet 12
Page
28 - 34
JDBC
}
}
2.8.
OFPPT @
Document
Millsime
294242725.doc
juillet 12
Page
29 - 34
JDBC
OFPPT @
();
Document
Millsime
294242725.doc
juillet 12
Page
30 - 34
JDBC
try
{
}
}
}
catch (Exception er) {}
OFPPT @
Document
Millsime
294242725.doc
juillet 12
Page
31 - 34
JDBC
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