09 JDBC
09 JDBC
1
Pilotes nécessaires pour exécuter les
programmes du cours
Pour Oracle 19c, vous pouvez télécharger le pilote
“[Link]” à partir de l’url:
• [Link]
pdev/[Link]
2
JDBC INTRODUCTION
partir de JDBC
3
JDBC Qu’est ce que JDBC ?
4
JDBC Qu’est ce que JDBC ?
5
JDBC Qu’est ce que JDBC ?
6
Le Driver JDBC change d'un type de BD à un autre
Driver Base de
Application ORACLE
Données
Java ORACLE
Driver
MySQL
Driver
SQLServer
Base de
Données
MySQL
Base de
Données
SQLServer
7
JDBC Historique et versions de JDBC
9
JDBC Historique et versions de JDBC
Remarque :
L’API JDBC 4.0 a été implémenté dans Java SE 6.0.
Les pilotes spécifiques aux serveurs de base de
données pour cette version d’API peuvent ne pas
être encore disponibles.
Mais puisqu’il ya compatibilité ascendante, il n’ya
pas de problèmes d’utiliser les drivers pour l’API
JDBC 3.0 avec Java SE 6, tant que vous n’utilisez
pas les nouvelles classes ou méthodes introduites
par l’API JDBC 4.0.
10
JDBC Types de pilotes JDBC
Les pilotes JDBC se répartissent en quatre types:
Type 1:
Ce type de pilote JDBC utilise un pilote ODBC pour se
connecter aux bases de données. Le code binaire du
pilote ODBC, et dans plusieurs cas, le code client d’une
base de données, doivent être chargés dans chaque
machine client qui utilise le bridge JDBC-ODBC.
Sun fournit un pilote bridge JDBC-ODBC, qui est
approprié pour des utilisations expérimentales, et pour
des situations où aucun autre pilote n’est disponible.
11
Pilotes Type 1
Application Java
M
API JDBC C
a
l
DriverManager Ou c
Objet DataSource i
h
e
Pilote Bridge JDBC-ODBC i
n
Pilote ODBC n
t
Libraire Client Pour BD e
12
JDBC Types de pilotes JDBC
Type 2 :
Ce type de pilotes est écrit en partie en le
langage Java et en partie en code natif. Il
utilse une librairie en code natif spécifique à la
base de données à laquelle on veut se
connecter.
13
Pilotes Type 2
Application Java M
API JDBC C
a
l
DriverManager Ou c
Objet DataSource i
h
e
Pilote JDBC écrit en partie en Java i
n
n
Libraire Client Pour BD t
e
14
JDBC Types de pilotes JDBC
Type 3 :
Ce type de pilotes est purement écrit en
langage Java, et communique avec un
serveur middleware qui utilise un protocole
réseau indépendant de la base de données.
Le serveur middleware communique par la
suite les requêtes du client au serveur de
base de données.
15
Pilotes Type 3
Application Java M C
a l
API JDBC c i
Gestionnaire de pilotes Ou h e
Objet DataSource i n
n t
Pilote JDBC en pure Java e
Serveur
middleWare
16
JDBC Types de pilotes JDBC
Type 4 :
Ce type de pilotes sont écrit à 100% en
lanage Java et implémentent le protocole
pour communiquer avec une base de
données spécifique. Le client communique
directement avec la base de données.
17
Pilotes Type 4
Application Java M C
a l
API JDBC
c i
Gestionnaire de pilotes Ou h e
Objet DataSource i n
n t
Pilote JDBC en pure Java
e
18
Méthodes de connexion à une base de données
[Link](<URL_De_Connection>)
19
Méthodes de connexion à une base de données
Exemple a: Oracle
// Chargement du pilote d’oracle:
[Link]("[Link]");
Exemple b: MySQL
// Chargement du pilote MySQL:
[Link](" [Link] ");
//Etablir une connection à une base de données MySQL:
String dbURL = "jdbc:mysql://localhost:3306/<nomBD>";
Connection conn = [Link](url,“utilisateur",”password");
20
Méthodes de connexion à une base de données
21
JDBC DriverManager-Chargement du pilote JDBC
Pour tester ce programme vous devez disposer des pilotes pour les bases de
données ORACLE et MySQL.
22
import [Link].*;
import [Link].*;
import [Link];
public class LoadJdbcDriver {
public static void main(String [] args) {
try {
[Link]("Before loading OracleDriver:");
listDrivers();
// Charger le pilote d’oracle
[Link]("[Link]");
[Link]("After loading OracleDriver:");
listDrivers();
// Charger le pilote de MySQL
[Link]("[Link]");
[Link]("After loading MySQLDriver:");
listDrivers();
}
catch (Exception e) {
[Link]("Exception: "+[Link]());}
}
23
private static void listDrivers() {
Enumeration<Driver> driverList = [Link]();
while ([Link]()) {
Driver driverClass = (Driver) [Link]();
[Link](" "+[Link]().getName());
} }
}
}
C:\..>javac [Link]
24
JDBC DriverManager-URL de connection
jdbc:<subprotocol>:<subname>
Exemples d’URL :
Exemple 1 :
"jdbc:oracle:thin:@PC-de-Hassouni:1521:orcl"
“oracle:thin” identifie le pilote qui va créer un objet
connection à la base de données orcl sur le poste “PC-de-
Hassouni” en utilisant le port “1521”
Exemple 2:
"jdbc:mysql://localhost:3306/elibrairie";
“mysql” identifie le pilote qui va créer un objet connection à
la base de données "elibrairie" sur le poste local en utilisant
le port “3306”
26
JDBC DriverManager-URL de connection
27
JDBC Classes de JDBC
[Link]
Exception
Charge et configure le
Date Time TimeStamp pilote JDBC client
SQLException
BatchUpdateException SQLWarning
DataTruncation
Les classes qui ne sont pas coloriées se
trouvent dans le package [Link]
28
JDBC Interfaces de JDBC ([Link])
Les classes d’implémentation du driver jdbc sont dans une archive (fichier jar ou zip)
qu’il faut intégrer (sans le décompresser) au niveau du classpath de l’application au
moment de l’exécution
getConnection()
DriverManager
permet de créer Connection Connection Connection
des objets
Connection
createStatement() prepareStatement() prepareCall()
Un objet Connection
permet de créer
Statement PreparedStatement CallableStatement
des objets encapsulant
des requêtes SQL executeQuery()
execute()
executeUpdate()
Les objets encapsulant les
requêtesSQL permettent de
créer des objets ResultSet ResultSet ResultSet ResultSet
encapsulant le résultat
d’une requête
30
Résumé sur les formats et exemples d’URL de connection
31
URL pour Access
32
Pilote pour MySQL
33
Pilote pour Oracle
Nom du Driver : Oracle JDBC Thin client-side driver
----------------------------------------------------------------
Fichier JAR du Driver : [Link]
34
Pilote pour SQLServer
35
ORACLE - JDBC
36
JDBC Types de pilotes JDBC pour Oracle
Cette partie du cours présente comment accéder à une base de données Oracle.
39
3. JDBC Thin server-side driver: C’est un autre pilote JDBC de
type 4 qui utilise Java pour se connecter directement avec un
serveur Oracle.
40
4. JDBC Server-Side Internal driver: C’est un autre pilote JDBC de
type 2 qui utilise des méthodes natives Java pour appeler des
programmes d’une libraire C.
Cette libraire C fait partie d’un processus du serveur Oracle et
communique directement avec le moteur SQL interne
d’Oracle.
Ce pilote accède au moteur SQL en utilisant des appels de
fonctions internes évitant ainsi tout trafic réseau.
41
Ce cours utilise "JDBC Thin client-side driver" pour
éviter d’installer toute autre librairie native.
42
Installation du pilote JDBC Thin Client-Side
[Link]
ologies/appdev/jdbc-ucp-19c-
[Link]
43
Installation du pilote JDBC Thin Client-Side
[Link]
44
Chargement de la classe JDBC Driver - [Link]
45
URL de connection du pilote JDBC d’Oracle
46
URL de connection du pilote JDBC d’Oracle
jdbc:oracle:thin:user/password@host:port:SID
jdbc:oracle:thin:user/password@//host:port/SID
jdbc:oracle:thin:@host:port:SID
jdbc:oracle:thin:@//host:port/SID
47
URL de connection du pilote JDBC d’Oracle
port : Numéro du port utilisé par Oracle listener. La valeur par défaut est 1521.
SID : L’ID Système de l’instance Base de données créée sur le serveur Oracle.
Oracle 11g Release 2 crée par défaut une instance de base de donnée
appelée orcl. Pour Oracle 10g Express Edition le SID est XE.
Remarque:
Pour les besoins de test des programmes, j’ai créé un compte dont
le nom est MOHA et le password est topsecret.
Le nom hote de mon poste est hassouni-PC
Sur mon poste j’ai installé Oracle 11g Express Edition, j’ai gardé le
nom par défaut de l’instance de la base de données créée qui est xe
Le numéro du port du listener est : 1521
48
URL de connection du pilote JDBC d’Oracle
En tenant compte des paramètres du poste sur lequel je vais exécuter les programmes
de test, le format de l’URL de connexion que nous rencontrerons sont:
Format 1 :
Format 2 :
49
import [Link].*;
public class OracleConnectionUrlFormat1 {
public static void main(String [] args) {
Connection con = null;
try {
// Chargement du Driver Oracle
[Link]("[Link]") ;
[Link]("Le Driver JDBC Oracle est charge avec succes.");
con = [Link](
"jdbc:oracle:thin:MOHA/TopSecret@localhost:1521:xe");
[Link]("Connexion reussie avec url =
jdbc:oracle:thin:MOHA/TopSecret@localhost:1521:orcl");
[Link]();
con = [Link](
"jdbc:oracle:thin:MOHA/TopSecret@hassouni-P[Link]xe");
[Link]("Connexion reussie avec url=jdbc:oracle:thin:MOHA/TopSecret@PC-de-
Hassouni:1521:orcl");
[Link]();
50
con = [Link](
"jdbc:oracle:thin:MOHA/TopSecret@//localhost:1521/xe");
[Link]("Connexion reussie avec url =
jdbc:oracle:thin:MOHA/TopSecret@//localhost:1521/orcl");
[Link]();
con = [Link](
"jdbc:oracle:thin:MOHA/TopSecret@//hassouni-PC:1521/xe");
[Link]("Connexion reussie avec
url=jdbc:oracle:thin:MOHA/TopSecret@//PC-de-Hassouni:1521/orcl");
[Link]();
} catch (Exception e) {
[Link]("Exception: "+[Link]());
} }}
51
import [Link].*;
public class OracleConnectionUrlFormat1 {
public static void main(String [] args) {
Connection con = null;
try {
// Chargement du Driver Oracle
[Link]("[Link]") ;
[Link]("Le Driver JDBC Oracle est charge avec succes.");
con = [Link]( "jdbc:oracle:thin:MOHA/TopSecret@localhost:1521:xe");
[Link]("Connexion reussie avec url = jdbc:oracle:thin:MOHA/TopSecret@localhost:1521:xe");
[Link]();
} catch (Exception e) {
[Link]("Exception: "+[Link]());
} }}
52
import [Link].*;
public class OracleConnectionUrlFormat2 {
public static void main(String [] args) {
Connection con = null;
try {
[Link]("[Link]") ;
[Link]("Le Driver JDBC Oracle est charge avec succes.");
con = [Link](
"jdbc:oracle:thin:@localhost:1521:orcl", "MOHA", "topSecret");
[Link]("Connexion reussie avec url =
jdbc:oracle:thin:@localhost:1521:orcl");
[Link]("\t\tuser = Moha\tPassword = TopSecret");
[Link]();
con = [Link](
"jdbc:oracle:thin:@hassouni-P[Link]orcl", "MOHA",
"TopSecret");
[Link]("Connexion reussie avec url = jdbc:oracle:thin:@PC-de-
Hassouni:1521:orcl");
[Link]("\tuser = Moha\tPassword = TopSecret");
[Link](); 53
con = [Link](
"jdbc:oracle:thin:@//localhost:1521/orcl", "MOHA", "TopSecret");
[Link]("Connexion reussie avec url =
jdbc:oracle:thin:@//localhost:1521/orcl");
[Link]("\t\tuser = Moha\tPassword = TopSecret");
[Link]();
con = [Link](
"jdbc:oracle:thin:@//PC-de-Hassouni:1521/orcl", "MOHA",
"TopSecret");
[Link]("Connexion reussie avec url = jdbc:oracle:thin:@PC-de-
Hassouni:1521:orcl");
[Link]("\tuser = Moha\tPassword = TopSecret");
[Link]();
} catch (Exception e) {
[Link]("Exception: "+[Link]());
} }}
54
import [Link].*;
public class OracleConnectionUrlFormat2 {
public static void main(String [] args) {
Connection con = null;
try {
[Link]("[Link]") ;
[Link]("Le Driver JDBC Oracle est charge avec succes.");
56
Informations sur le serveur SGBD et sur le pilote JDBC
Il est possible d’obtenir des informations sur le serveur SGBD et sur
le pilote JDBC à l’aide d’un objet DatabaseMetaData obtenu par la
méthode getMetaData() d’un objet connection.
Le programme exemple qui suit obtient le nom du serveur SGBD,
et sa version, respectivement par les méthodes :
• getDatabaseProductName();
• getDatabaseProductVersion();
Il obtient aussi le nom du Driver, sa version, et les numéros majeur
et mineur de la version , respectivement par les méthodes :
• getDriverName();
• getDriverVersion();
• getJDBCMajorVersion();
• getJDBCMinorVersion();
Pour obtenir d’autres informations, consulter la doc de L’API
(Package [Link], interface DatabaseMetaData)
57
Informations sur le serveur SGBD Oracle et sur le pilote JDBC
import [Link].*;
public class OracleDatabaseInfo {
public static void main(String [] args) {
Connection con = null;
try {
//Chargement du Driver JDBC
[Link]("[Link]");
//Fermeture de la connection
[Link]();
} catch (Exception e) {
[Link]("Exception: "+[Link]());
} }}
58
Informations sur le serveur SGBD et sur le pilote JDBC
59
Informations sur le serveur SGBD MySQL et sur le pilote JDBC
import [Link];
import [Link];
import [Link];
61
Objets instanciés a partir des classes et interfaces de
JDBC
DriverManager
getConnection()
DriverManager
permet de créer Connection Connection Connection
des objets
Connection
createStatement() prepareStatement() prepareCall()
Un objet Connection
permet de créer
Statement PreparedStatement CallableStatement
des objets encapsulant
des requêtes SQL executeQuery()
execute()
executeUpdate()
Les objets encapsulant les
requêtesSQL permettent de
créer des objets ResultSet ResultSet ResultSet ResultSet
encapsulant le résultat
d’une requête
62
Crétaion de nouvelles tables : "CREATE TABLE“
L’exécution d’une commande LDD ou LMD à partir d’un programme
java est très simple. Il suffit de suivre la procédure suivante:
1. Chargement du pilote :
[Link](<nom du piloteJDBC >);
[Link]éation d’un objet Connection:
(Connection con = [Link](<url>)
[Link]éation d’un objet Statement par la méthode createStatement de
l’objet Connection:
(Statement sta = [Link]())
[Link]éation d’une String qui contient la commande SQL LDD/LMD
(String SQLCmdLddLmd = <Commande LDD / LMD>)
[Link]écution de la commande par la méthode executeUpdate() de
l’objet Statement
[Link](<commande LDD/LMD>)
Le programme exemple suivant permet de créer une table. 63
import [Link].*;
public class OracleCreateTable {
public static void main(String [] args) {
Connection con = null;
try {
[Link]("[Link]");
String url = "jdbc:oracle:thin:@localhost:1521:xe";
con = [Link](url,"Moha","TopSecret");
Statement sta = [Link]();
String SQLCreateTable = "CREATE TABLE Profile ("
+ " ID NUMBER(5) CONSTRAINT PKProfile PRIMARY KEY,"
+ " FirstName VARCHAR2(20) NOT NULL,"
+ " LastName VARCHAR2(20),"
+ " Point NUMBER DEFAULT 0.0)";
int count = [Link](SQLCreateTable);
[Link]("Creation de la table reussie");
[Link]();
[Link]();
} catch (Exception e) {
[Link]("Exception: "+[Link]());
} }}
64
Programme avec SGBD MySQL
import [Link].*;
public class MySQLCreateTable {
public static void main(String [] args) {
Connection con = null;
try {
[Link]("[Link]");
String url = "jdbc:mysql://localhost:3306/testjdbc";
con = [Link](url,"moha","topsecret");
Statement sta = [Link]();
String SQLCreateTable = "CREATE TABLE Profile ("
+ " ID INT PRIMARY KEY,"
+ " FirstName VARCHAR(20) NOT NULL,"
+ " LastName VARCHAR(20),"
+ " Point DECIMAL(9,2))";
int count = [Link](SQLCreateTable);
[Link]("Creation de la table reussie count = " +
count);
[Link]();
[Link]();
} catch (Exception e) {
[Link]("Exception: "+[Link]());
}
}
} 65
Insertion de nouvelles lignes dans une table : “INSERT INTO“
66
import [Link].*;
import [Link].*;
public class OracleMultipleInserts {
public static void main(String [] args) {
Connection con = null;
try {
[Link]("[Link]");
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
con = [Link](
url,"Moha","TopSecret");
Statement sta = [Link]();
int count = 0;
// insérer une ligne en utilisant les valeurs par défaut
String SQLInsert = "INSERT INTO Profile(ID, FirstName,
LastName) VALUES (1, 'Moha', 'John')";
count += [Link](SQLInsert);
67
// insérer une seule ligne dont on fournit les valeurs
SQLInsert = "INSERT INTO Profile(ID, FirstName, LastName, Point)
VALUES (2, 'Manolo', 'Brahim', 999.99)";
count += [Link](SQLInsert);
// insérer des lignes avec une boucle et des valeurs aléatoires
Random r = new Random();
for (int i=0; i<10; i++) {
Float points = 1000*[Link]();
String firstName = [Link]([Link](9999));
String lastName = [Link]([Link](999999));
SQLInsert = "INSERT INTO Profile(ID, FirstName, LastName, Point)" +
" VALUES (" + (i+10) + ", '" + firstName + "', '" + lastName + "', " + points +
")";
count += [Link]( SQLInsert);
}
[Link]("Nombre de lignes inserees: "+count);
[Link]();
[Link]();
} catch (Exception e) {
[Link]("Exception: "+[Link]());
68
} }}
import [Link].*;
import [Link].*;
public class OracleMultipleInserts {
public static void main(String [] args) {
Connection con = null;
try {
[Link]("[Link]");
String url = "jdbc:oracle:thin:@localhost:1521:xe";
con = [Link](url,"Moha","TopSecret");
Statement sta = [Link]();
int count = 0;
// insérer une ligne en utilisant les valeurs par défaut
String SQLInsert = "INSERT INTO Profile(ID, FirstName, LastName) VALUES (1, 'Moha', 'John')";
count += [Link](SQLInsert);
// insérer une seule ligne dont on fournit les valeurs
SQLInsert = "INSERT INTO Profile(ID, FirstName, LastName, Point)"
+ " VALUES (2, 'Manolo', 'Brahim', 999.99)";
count += [Link](SQLInsert);
// insérer des lignes avec une boucle et des valeurs aléatoires
Random r = new Random();
for (int i=0; i<10; i++) {
Float points = 1000*[Link]();
String firstName = [Link]([Link](9999));
String lastName = [Link]([Link](999999));
SQLInsert = "INSERT INTO Profile(ID, FirstName, LastName, Point)"
+ " VALUES (" + (i+10) + ", '" + firstName + "', '" + lastName + "', " + points + ")";
count += [Link]( SQLInsert);
}
[Link]("Nombre de lignes inserees: "+count);
[Link]();
[Link]();
} catch (Exception e) {
[Link]("Exception: "+[Link]());
} }}
69
import [Link].*;
import [Link].*;
Programme avec SGBD MySQL
public class MySQLMultipleInserts {
public static void main(String [] args) {
Connection con = null;
try {
[Link]("[Link]");
String url = "jdbc:mysql://localhost:3306/testjdbc";
con = [Link](url,"moha","topsecret");
Statement sta = [Link]();
int count = 0;
// insérer une ligne en utilisant les valeurs par défaut
String SQLInsert = "INSERT INTO Profile(ID, FirstName, LastName) VALUES (1, 'Moha', 'John')";
count += [Link](SQLInsert);
// insérer une seule ligne dont on fournit les valeurs
SQLInsert = "INSERT INTO Profile(ID, FirstName, LastName, Point)"
+ " VALUES (2, 'Manolo', 'Brahim', 999.99)";
count += [Link](SQLInsert);
// insérer des lignes avec une boucle et des valeurs aléatoires
Random r = new Random();
for (int i=0; i<10; i++) {
Float points = 1000*[Link]();
String firstName = [Link]([Link](9999));
String lastName = [Link]([Link](999999));
SQLInsert = "INSERT INTO Profile(ID, FirstName, LastName, Point)"
+ " VALUES (" + (i+10) + ", '" + firstName + "', '"
+ lastName + "', " + points + ")";
count += [Link]( SQLInsert);
}
[Link]("Nombre de lignes inserees: "+count);
[Link]();
[Link]();
} catch (Exception e) {
[Link]("Exception: "+[Link]());
} }}
70
Extraction des lignes à partir d’une table “SELECT”
Pour exécuter une commande SELECT à partir d’un programme java,
on suit à peu près les mêmes étapes que pour exécuter une
commande LDD/LMD:
1. Effectuez les étapes 1. 2. 3. présentées pour exécuter une
commande LDD/LMD
2. Création d’une String qui contient la commande SQL SELECT
String SQLQuery = <Commande SELECT>
3. Exécution de la commande par la méthode executeQuery() de
l’objet Statement, le résultat retourné doit être affecté à un objet
ResultSet
ResultSet res = [Link](<commande SELECT>)
4. Exploiter les lignes du résultat représenté par l’objet ResultSet
71
import [Link].*;
import [Link].*;
public class OracleExecuteQuery {
public static void main(String [] args) {
Connection con = null; Résultat de l’exécution
try {
[Link]("[Link]"); java -cp .;[Link] OracleExecuteQuery
String url = "jdbc:oracle:thin:@localhost:1521:orcl"; iste des Profils:
con = [Link](url,"Moha","topsecret"); 1, Moha, John, 0.0
Statement sta = [Link](); 2, Manolo, Brahim, 999.99
// Extraction de toutes les lignes de la table Profile 10, 3f6, 7e08e, 885.5092
String SQLQuery = "SELECT * FROM Profile"; 11, 200f, e82f8, 42.3851
ResultSet res = [Link](SQLQuery); 12, 1d93, 14bd7, 359.63333
13, 182d, ae9ca, 881.9009
[Link]("Liste des Profils: "); 14, 1287, 1061c, 218.53745
while ([Link]()) { 15, bd, 2d2be, 805.2661
[Link]( 16, 261c, 7ca6d, 523.52576
" "+[Link]("ID") 17, 193, 533f0, 547.2503
+ ", "+[Link]("FirstName") 18, 249b, 6bbc6, 442.02423
+ ", "+[Link]("LastName") 19, 109b, 6789f, 381.88998
+ ", "+[Link]("Point"));
}
[Link]();
[Link]();
[Link]();
} catch (Exception e) {
[Link]("Exception: "+[Link]());
} }}
72
Programme avec SGBD MySQL
import [Link].*;
import [Link].*;
public class MySQLExecuteQuery {
public static void main(String [] args) {
Connection con = null;
try {
[Link]("[Link]");
String url = "jdbc:mysql://localhost:3306/testjdbc";
con = [Link](url,"moha","topsecret");
Statement sta = [Link]();
// Extraction de toutes les lignes de la table Profile
String SQLQuery = "SELECT * FROM Profile";
ResultSet res = [Link](SQLQuery);
[Link]("Liste des Profils: ");
while ([Link]()) {
[Link](" "+[Link]("ID") + ", "+[Link]("FirstName")
+ ", "+[Link]("LastName") + ", "+[Link]("Point"));
}
[Link]();
[Link]();
[Link]();
} catch (Exception e) {
[Link]("Exception: "+[Link]());
} }}
73
Modification des valeurs des colonnes d’une table
“UPDATE”
74
Supression des lignes d’une table “DELETE”
75
ORACLE - PreparedStatement
Cette partie du cours a pour objectif de mettre en oeuvre les
PreparedStatement (instructions préparées) de l’API
JDBC avec le pilote JDBC d’Oracle.
Nous traiterons dans l’ordre les sujets cidessous:
• Vue générale sur PreparedStatement
• PreparedStatement avec Parametres
• PreparedStatement en Mode Batch
• Performance d’Insertion des lignes avec
PreparedStatement
• Performance d’Insertion des lignes avec Statement
• Performance d’Insertion des lignes avec ResultSet
76
Vue générale sur PreparedStatement
C:\..>javac [Link]
Connection con = null;
try {
Résultat de l’exécution:
[Link]("[Link]");
String url = "jdbc:oracle:thin:@PC-de-Hassouni:1521:orcl";
con = [Link](url,"Moha","TopSecret");
// PreparedStatement pour une instruction SELECT avec un parametere
String SQLQuery = "SELECT * FROM Profile WHERE ID = ?";
PreparedStatement ps = [Link](SQLQuery);
// Attribution d'une valeure au parametere
int id = 19;
[Link](1,id);
// Executer le PreparedStatement en tant que requête
ResultSet res = [Link]();
// Obtenir les valeurs à partir du ResultSet
[Link]();
String firstName = [Link]("FirstName");
String lastName = [Link]("LastName");
[Link]("User ID "+id+": "+firstName+' '+lastName);
[Link]();
[Link]();
[Link]();
} catch (Exception e) {
[Link]("Exception: "+[Link]());
[Link]();
} }}
82
import [Link].*;
public class MySQLPreparedStatementParameter { SGBD MySQL
public static void main(String [] args) {
Connection con = null;
try {
[Link]("[Link]");
String url = "jdbc:mysql://localhost:3306/mohadb";
con = [Link](url,"moha","topsecret");
// PreparedStatement pour une instruction SELECT avec un parametere
String SQLQuery = "SELECT * FROM Profile WHERE ID = ?";
PreparedStatement ps = [Link](SQLQuery);
// Attribution d'une valeure au parametere
int id = 19;
[Link](1,id);
// Executer le PreparedStatement en tant que requête
ResultSet res = [Link]();
// Obtenir les valeurs à partir du ResultSet
[Link]();
String firstName = [Link]("FirstName");
String lastName = [Link]("LastName");
[Link]("User ID "+id+": "+firstName+' '+lastName);
[Link]();
[Link]();
[Link]();
} catch (Exception e) {
[Link]("Exception: "+[Link]());
[Link]();
}
}
}
83
PreparedStatement en Mode Batch
84
[Link](...); // attribuer les valeurs aux paramètres de la 1ère copie
…
[Link](); // Créer la 1ère copie de l’instruction SQL
85
import [Link].*;
public class OraclePreparedStatementBatch {
public static void main(String [] args) {
Connection con = null;
try {
[Link]("[Link]");
String url = "jdbc:oracle:thin:@PC-de-Hassouni:1521:orcl";
con = [Link](url,"Moha","TopSecret");
C:\...>javac [Link]
3 : -2
2 : -2
1 : -2
0 : -2
[Link](2, "IJKL");
[Link](3,"Third");
int count = 0;
for (int i=0; i<[Link]; i++) {
[Link](" " + i + " : " + counts[i]);
count += counts[i]; }
[Link]("Total des lignes inserees: "+count);
[Link]();
[Link]();
} catch (Exception e) {
[Link]("Exception: "+[Link]());
[Link]();
} }} 87
import [Link].*;
public class MySQLPreparedStatementBatch {
public static void main(String [] args) {
Connection con = null;
try {
[Link]("[Link]");
String url = "jdbc:mysql://localhost:3306/mohadb";
con = [Link](url,"moha","topsecret");
88
// Fournir les valeurs des paramètre de la 2ème copie
[Link](1,102);
[Link](2, "EFGH");
[Link](3,"Second");
// Créer la 2ème copie
[Link]();
// Fournir les valeurs des paramètre de la 3ème copie
[Link](1,103);
[Link](2, "IJKL");
[Link](3,"Third");
// Créer la 3ème copie
[Link]();
89
// Fournir les valeurs des paramètre de la 4ème copie
[Link](1,104);
[Link](2, "MNOP");
[Link](3,"Last");
int count = 0;
for (int i=0; i<[Link]; i++) {
[Link](" " + i + " : " + counts[i]);
count += counts[i]; }
[Link]("Total des lignes inserees: "+count);
[Link]();
[Link]();
} catch (Exception e) {
[Link]("Exception: "+[Link]());
[Link]();
} }} 90
Performance d’Insertion des lignes avec PreparedStatement
Résultat de l’exécution
C:\...>javac [Link]
91
import [Link].*;
public class OraclePerformancePreparedStatement {
public static void main(String [] args) {
Connection con = null;
try {
// Chargement du Driver Oracle
[Link]("[Link]");
// Début du test
int count = 10000;
long t1 = [Link]();
92
// PreparedStatement pour insérer des lignes
PreparedStatement ps = [Link](
"INSERT INTO Profile (ID, FirstName, LastName)"
+ " VALUES (?, ?, ?)");
[Link] r = new [Link]();
for (int i = 0; i < count; i++) {
[Link](1,i+1);
[Link](2,[Link]([Link](9999)));
[Link](3,[Link]([Link](999999)));
[Link]();
}
[Link]();
// Fin du test
long t2 = [Link]();
[Link]("Temps ecoule pour inserer "+count
+" lignes avec PreparedStatement "+(t2 -t1) +" milliseconds");
[Link]();
} catch (Exception e) {
[Link]("Exception: "+[Link]());
[Link]();
} }} 93
Performance d’Insertion des lignes avec Statement
Résultat de l’exécution
C:\...>javac [Link]
94
import [Link].*;
public class OraclePerformanceRegularStatement {
public static void main(String [] args) {
Connection con = null;
try {
// Chargement du Driver Oracle
[Link]("[Link]");
// Début du test
int count = 10000;
long t1 = [Link]();
95
// Insertion des lignes par un objet Statement
Statement rs = [Link]();
[Link] r = new [Link]();
for (int i = 0; i < count; i++) {
[Link](
"INSERT INTO Profile (ID, FirstName, LastName) VALUES ("
+(i+1)+", '"+[Link]([Link](9999))
+"', '"+[Link]([Link](999999))+"')");
}
[Link]();
// Fin du test
long t2 = [Link]();
[Link]("Temps ecoule pour inserer "+count
+" lignes avec Statement : "+(t2 -t1) +" milliseconds");
[Link]();
} catch (Exception e) {
[Link]("Exception: "+[Link]());
[Link]();
} }}
96
Exemple de programme qui utilise un champ de table de type Date
mport [Link].*;
import [Link];
public class OraclePreparedStatementParameterUpdate {
public static void main(String [] args) {
Connection con = null;
try {
// Chargement du Driver Oracle
[Link]("[Link]");
// Obtention d'un objet Connection
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
con = [Link](url,"Moha","TopSecret");
// PreparedStatement pour une instruction SELECT avec un parametere
String SQLUpdate = " UPDATE Profile SET BirthDate = ? WHERE ID = ?";
PreparedStatement sta = [Link](SQLUpdate);
// Attribution d'une valeure aux parameteres
SimpleDateFormat sdf = new SimpleDateFormat( "dd/MM/yyyy" ) ;
Date birthd = new Date([Link]("23/12/2008").getTime());
[Link](1, birthd);
int id = 19;
[Link](2,id);
// Executer le PreparedStatement
int count = [Link]();
// Fermer les objets PreparedStatement et connection
[Link]();
[Link]();
} catch (Exception e) {
[Link]("Exception: "+[Link]());
[Link]();
} }} 97
ORACLE - JDBC CallableStatement
Il est possible d’exécuter les procédures stockées écrites en PL/SQL et
sauvegardées sur le serveur à partir des programmes Java en utilisant
l’objet JDBC CallableStatement. Dans ce qui suit nous traiterons les
sujets ci-dessous:
Les ojets JDBC CallableStatement sont utilisés pour faire des appels aux
procédures stockées dans le serveur SGBDR.
99
2. Il est possible d’utiliser les point d’interrogation (?) dans
l’instruction d’appel pour marquer la place d’un paramètre de la même
manière qu’avec un objet PreparedStatement.
Les paramètres OUT (output), INOUT (input and output), et return
doivent être représentés par des points d’interrogation (?):
100
4. Les marqueurs de place (?) pour les paramètres OUT, INOUT et
return doivent être enregistrés comme des paramètres avec des types
de données JDBC avant l’exécution de l’objet CallableStatement:
101
7. Un objet CallableStatement peut aussi être exécuté en mode batch
d’une manière similaire à l’objet PreparedStatement:
102
8. Après l’exécution de l’l’instruction Call, toutes les lignes de tous
les objets ResultSet retournés doivent être traitées avant de
retrouver n’importe quel paramètre output.
103
"CREATE PROCEDURE"
Creation d’une simple Procédure Stockée.
import [Link].*;
public class OracleCallableStatement {
public static void main(String [] args) {
Connection con = null;
try {
// Chargement du Driver Oracle
[Link]("[Link]");
// Execution de la procédure
[Link]();
106
// fermer l'objet CallableStatement resource
[Link]();
// Tester le résultat
Statement sta = [Link]();
ResultSet res = [Link](
"SELECT * FROM Profile WHERE FirstName LIKE ‘Moha'");
while([Link]()){
[Link]("Point: "+[Link]("Point"));
}
//Fermeture des objets ressources
[Link]();
[Link]();
[Link]();
} catch (Exception e) {
[Link]("Exception: "+[Link]());
[Link]();
} }}
107
C:\..>javac [Link]
108
Creation des objets CallableStatement avec des Parametres
Lors de la création d’un objet CallableStatement, pour appeler une procédure qui a
un paramètre IN, il est possible de mettre une valeur statique, ou un marqueur de
place (?).
Pour fournir une valeur au marqueur de place, il faut utiliser la méthode setXXX().
C:\...>javac [Link]
C:\...>javac [Link]
111
import [Link].*;
public class OracleCallGetProcedures {
public static void main(String [] args) {
Connection con = null;
try {
[Link]("[Link]");
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
con = [Link](url,"Moha","TopSecret");
DatabaseMetaData meta = [Link]();
// Liste des procedures stockées
ResultSet res = [Link](null, "MOHA", "%");
[Link]("Stored procedures:");
while ([Link]()) {
[Link]( " "+[Link]("PROCEDURE_CAT« ) + ", "+[Link]("PROCEDURE_SCHEM")
+ ", "+[Link]("PROCEDURE_NAME"));
}
[Link]();
// Liste des tables
res = [Link](null, "MOHA", "%", null);
[Link]("Stored tables:");
while ([Link]()) {
[Link]( " "+[Link]("TABLE_CAT« ) + ", "+[Link]("TABLE_SCHEM")
+ ", "+[Link]("TABLE_NAME"));
}
[Link](); [Link]();
} catch (Exception e) {
[Link]("Exception: "+[Link]());
[Link]();
} }}
112