Professional Documents
Culture Documents
Objet: Java
Amira Mouakher
Facult des Sciences de Tunis
mouakheramira@gmail.com
https://amiramouakher.wordpress.com/
1
Plan
Introduction au monde Objet
Hritage
Les exceptions
Les Entres/Sorties
2
Java Database Connectivity (JDBC)
La technologie JDBC est une API : ensemble de classes fournie avec
...)
du code).
3
Java Database Connectivity (JDBC)
Principe
...
4
L API JDBC
Fournie par le package java.sql
donnes relationnelles
5
java.sql
8 interfaces :
Statement
CallableStatement,
PreparedStatement
DatabaseMetaData,
ResultSetMetaData
ResultSet,
Connection
Driver
6
Principe de fonctionnement
constructeurs :
7
Architecture JDBC
Java Appli/Applet
JDBC
API
JDBC DriverManager
JDBC
Driver
API
JDBC-ODBC JDBC JDBC JDBC-Net
bridge driver driver driver driver
for for
ODBC Oracle Sybase
driver
Proprietary protocol JDBC protocol
Proprietary protocol
Orac Syba
Orac Syba le se
le se
8
Un modle 2 couches
La couche externe : API JDBC
9
Drivers JDBC
10
Driver de type I
11
ODBC de Microsoft
Windows
ODBC
12
Avantages de ODBC
Avantages :
source de donnes
13
Driver de type II
14
Driver de type III
15
Driver de type IV
16
Modles de connexion en Java
2. le SGBDR
17
Modle 2-tiers
Principe :
l application (ou l applet) cliente utilise JDBC pour
parler directement avec le SGBD qui gre la base de
donnes
Avantages :
simple mettre en uvre
bon choix pour des applications clientes peu volues,
livrer rapidement et n exigeant que peu de
maintenance
Inconvnients :
dpendance forte entre le client et la structure du
SGBDR
modification du client si l environnement serveur
change
tendance avoir des clients graisseux
tout le traitement est du ct client
18
Architecture 2-tiers
Client Serveur
TCP / Protocole
Application J propritaire
ou D SGBD
B
Applet C
BD
19
Modle 3-tiers
Principes :
le serveur middleware est l interlocuteur direct du code
Java client; c est lui qui change des donnes avec le
SGBDR
pas forcment crit en Java
20
Architecture 3-tiers
Clien Serveu
TCP / RMI /
t
Application CORBA
rMiddlewa
re
ou
Applet JDBC
SGBD
BD
21
Connexion la base de donnes :
Utilisation de JDBC
Cration d1 connexion BD + envoi instructions SQL + exploitation des rsultats
4. Excuter la requte
23
Enregistrer le driver JDBC
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Class.forName("oracle.jdbc.driver.OracleDriver");
quand une classe Driver est charge, elle doit crer une
instance d elle mme et s enregistrer auprs du
DriverManager
certains compilateurs refusent cette notation et demande
plutt :
Class.forName("driver_name").newInstance();
24
URL de connexion
l utilisation de
JDBC
le driver ou le type de
SGBDR
25
Connexion la base
Connection connect =
DriverManager.getConnection(url,user,password );
URL de la base de
donnes
le nom de
lutilisateur
mot de passe
26
Cration d un Statement (1/2)
3/6
L objet Statement possde les mthodes ncessaires
pour raliser les requtes sur la base associe la
connexion dont il dpend
3 types de Statement :
Statement : requtes statiques simples
27
Cration d un Statement (2/2)
3/6
A partir de l objet Connect, on rcupre le
Statement associ :
Statement req1 =
connect.createStatement();
PreparedStatement req2 =
connect.prepareStatement(str);
CallableStatement req3 =
connect.prepareCall(str);
28
Excution d une requte (1/3)
4/6
3 types d excution :
executeQuery() : pour les requtes
(SELECT) qui retournent un ResultSet
(tuples rsultants)
29
Excution d une requte (2/3)
4/6
Statement st = connexion.createStatement();
ResultSet rs = st.executeQuery(
"SELECT nom, prenom FROM clients " +
"WHERE nom=XXY ORDER BY nom;");
int nb = st.executeUpdate("INSERT INTO dept(DEPT) " +
executeQuery() et executeUpdate() de la classe Statement prennent comme argument
"VALUES(06)");
une chane (String) indiquant la requte SQL excuter :
30
Excution d une requte (3/3)
4/6 2 remarques :
le code SQL n est pas interprt par Java.
31
Traiter les donnes retournes
32
Le rsultat : ResultSet (1/3)
33
Le rsultat : ResultSet (1/3)
Il est aussi possible de prciser si le ResultSet peut tre mise jour ou non :
java.sql.ResultSet.CONCUR_READ_ONLY : lecture seule
Lors cration d'un objet de type Statement, il faut prciser ces deux modes (par dfaut, les
valeurs de JDBC1.0 qui sont utilises (TYPE_FORWARD_ONLY et CONCUR_READ_ONLY).
34
Le rsultat : ResultSet (2/3)
5/6
Les colonnes sont rfrences par leur numro ou par
leur nom
35
Le rsultat : ResultSet (3/3)
5/6 Statement st =
connection.createStatement();
ResultSet rs = st.executeQuery(
"SELECT a, b, c, FROM Table1
);
while(rs.next()) {
int i = rs.getInt("a");
String s = rs.getString("b");
byte[] b = rs.getBytes("c");
}
36
Fermer les diffrents espaces
resultset.close();
statement.close();
connection.close();
37
Utilisation de JDBC : code complet
import java. sql.*;
public class TestJDBC {
public static void main( String[] args ) {
/** Chargement du driver JDBC */
try {
Linterface dun objet
Class. forName(" ASP odbc. JdbcOdbcDriver ");
sun. jdbc.
}
catch( Exception ex ) {
System. err. println( "Erreur lors du chargement
du driver" );
System. exit( 1);
}
try {
/** Connexion la base */
Connection cx = DriverManager. getConnection( "jdbc:
odbc: Etud", "", "" );
38
Utilisation de JDBC : code complet
(suite)
/** Cration et excution d'une requte */
Statement st = cx. createStatement();
ResultSet rs = st. executeQuery( "SELECT * FROM etudiant" );
/** Affichage du rsultat */
while (rs. next()) {
String Linterface
nom dun objet ASP
= rs. getString("nom") ;
int age = rs. getInt("age") ;
System. out. println( nom + " a " + age + " ans" );
}
/** Fermetures */
rs. close(); st. close(); cx. close();
}
catch( SQLException ex ) {
System. err. println( "Erreur lors de la connexion la base"
);
System. exit( 1);
} } }
39
JDBC :Accs aux donnes
Une fois la connexion tablie, il est possible de demander des informations sur le nom des
tables et le contenu de chaque colonne, ainsi que d'excuter des requtes SQL (lecture,
mise jour).
40
Utilisation de JDBC : Ordre SQL
quelconque
Dans certains cas on ne sait pas l'avance si l'ordre SQL modifiera les donnes ou
Voici un algorithme pour retrouver le type d'un ordre SQL non connu l'avance :
1. La mthode execute( ordreSQL) retourne un boolen. Si le rsultat est true, c'est que
ordreSQL tait une requte SELECT. On utilise alors un Resultset pour rcuprer les
lignes.
2. Sinon, on lance la mthode getUpdateCount() qui renvoie un entier. Si cet entier est
strictement positif, l'ordre tait un ordre DML (modification de lignes).
3. Sinon, si cet entier est gal 0, il s'agissait soit d'un ordre DML qui n'a modifi aucune
ligne, soit d'un ordre DDL (dfinition des donnes tel qu'un CREATE TABLE).
41
Correspondances types donnes SQL/
Java
Type SQL Type Java getter mthode
CHAR String getString()
VARCHAR
INTEGER int getInt()
TINYINT byte getByte()
SMALLINT short getShort()
BIGINT long getLong()
BIT boolean getBoolean()
REAL float getFloat()
FLOAT double getDouble()
DOUBLE
NUMERIC java. math. BigDecimal getBigDecimal()
DECIMAL
42
Gestion des valeurs nulles
rs. getString( String attribut) ou rs.getString( int colNum) :
renseigne
43
Gestion des valeurs nulles
Statement stmt1 = conn.createStatement();
ResultSet rset = stmt1.executeQuery("select NOM, COMM
from EMP");
float commission;
Linterface dun objet ASP
while (rset.next()) {
nom = rset.getString(1);
commission = rset.getFloat(2);
if (rset.wasNull())
System.out.println(nom + " n'a pas de commission");
else
System.out.println(nom + " a " + commission+ " DT de
commission ");
44
Types pour les donnes de grande
taille
permettent de stocker des donnes de grande taille (ex. : fichier) dans une
table
45
Types de requtes SQL
PreparedStatement CallableStatement
46
Types de requtes SQL
Chaque instruction
SQL envoye au SGBD meilleures
le SGBD n'analyse 1 seule fois
est analyse pour
une requte si elle est excute performances que les
trouver le un grand nombre de fois avec
meilleure plan Statement
des valeurs diffrentes
dexcution
47
Requtes SQL prcompiles
1. Cration en utilisant un objet de la classe Connection
AND age=?");
2. Les paramtres sont renseigns par des appels des mthodes setter
48
Requtes SQL prcompiles
PreparedStatement pstmt = conn.prepareStatement( "UPDATE
int nbLignesModifiees;
Linterface dun objet ASP
for (int i=0; i<10; i++) {
psmt.setFloat(1, salaire[i]);
psmt.setString(2, nom[i]);
nbLignesModifiees = psmt.executeUpdate();
49
Procdure stocke: {[? = ] call
nom_procdure [(?,?,.)]}
Procdure stocke en PL/SQL
create or replace procedure augmentation
(unDept in integer, pourcentage in number,
cout out number) is
begin
Linterface dun objet ASP
update emp
set sal = sal * (1 + pourcentage / 100)
where dept = unDept;
50
Procdure stocke: {[? = ] call
nom_procdure [(?,?,.)]}
En Java
CallableStatement csmt =
conn.prepareCall("{ call augmentation(?, ?, ?)
Linterface dun objet ASP
}");
// Augmentation de 2,5 % des salaires du dept 10
csmt.setInt(1, 10);
csmt.setFloat(2, 2.5);
csmt.executeQuery();
int x = csmt.getFloat(3);
System.out.println("Cout total de l'augmentation :
" + x);
51
Transactions
Groupes de requtes devant tre excuts de
faon indivisible
La transaction doit tre :
- engage ( commit ) les rsultats ne sont
visibles qu' partir de ce moment
- ou annule ( rollback )
52
Transactions
dclaration du dbut de la transaction
(Ali', 12)" );
nom= AZERTY'" );
cx. commit();
engagement de la transaction
53
Niveau d'isolation des transactions
54
Niveau d'isolation des transactions
55
Niveau d'isolation des transactions
4)
t1 lit un enregistrement
56
Niveau d'isolation des transactions
TRANSACTION_ READ_ COMMITED (niveau = 2)
t1 modifie un enregistrement
dirty reads interdits
t2 ne peut pas lire cet enregistrement tant que
t1 n'a pas t engage (ou annule)
Linterface
TRANSACTION_ dun
READ_ objet ASP
UNCOMMITED (niveau = 1)
t1 modifie un enregistrement
dirty reads autoriss
t2 ne peut pas lire cet enregistrement
TRANSACTION_ NONE (niveau = 0)
pas de support pour les transactions
Selon les couples (BD, driver JDBC), tous ces modes ne sont
pas forcment disponibles
57
Traitement par lots ( batch )
But : rduire le cot d'une srie de mise jour
Statement st = cx.
createStatement();
2. Ajout des diffrentes requtes
tables connus
tables
schma
59
Mta- base: Lobjet ResultSetMetaData
60
Mta- base: Lobjet ResultSetMetaData
Obtenir quelques informations sur les colonnes renvoyes par un
SELECT
61
Mta- base : Lobjet
DatabaseMetaData
La mta- base contient aussi des informations sur les tables contenues
dans la base
1. Rcupration d'un objet de la classe DatabaseMetaData dcrivant la
base
DatabaseMetaData dbmd = cx. getMetaData();
2. Rcupration des tables (utilisateur) de la base
ResultSet tables = dbmd. getTables( null, null, null,{" TABLE"});
3. Rcupration des noms des tables (itration sur le ResultSet)
while ( tables. next() ) {
String tableName = tables. getString(" TABLE_ NAME");
}
Rq : nombreuses autres possibilits d'interrogation du DatabaseMetaData
62
Mta- base : Lobjet
DatabaseMetaData
La mta- base contient aussi des informations sur les tables contenues
dans la base
Mthode Rle
63
Mta- base : Lobjet
DatabaseMetaData
Ajoute dans une liste (classe List de lawt) les noms des tables et vues
disponibles dans une base de donnes :
private DatabaseMetaData metaData;
private List listTables = new java.awt.List(10);
.... {
Linterface dun objet ASP
metaData = conn.getMetaData();
String[] types = { "TABLE", "VIEW" };
// % : joker SQL pour dsigner tous les noms
ResultSet rs = metaData.getTables(null, null, "%",
types);
String nomTables;
while (rs.next()) {
// Le nom des tables est la 3me colonne du
ResultSet
nomTable = rs.getString(3);
listTables.add(nomTable);
} ... }
64
Rcapitulatif : Classe gnrique
class Database {
Connection con;
resultSet results;
ResultSetMetaData rsmd;
DatabaseMetaData dm;
Linterface
String dun objet ASP
catalog;
String types[];
//----------------------------
1/8 public Database(String Driver)
{ types = new String[1];
types[0] = "TABLES";
try { Class.forName(driver); }
catch(Exception e)
{ System.out.println("Erreur lors du chargement du
driver:"+ e.getMessage());
} }
65
Rcapitulatif
public void : Classelogin,String
Open(String url,String gnrique
password)
{ try
{ con =
DriverManager.getConnection(url,login,password);
dma = con.getMetaData();
Linterface dun objet ASP
results = new resultSet(dma.getCatalogs());
String s[];
2/8 while(results.hasMoreElements())
{ s = results.NextElement();
}
}
catch(Exception e)
{ System.out.println("echec
d'ouverture:"+e.getMessage());
} }
66
Rcapitulatif : Classe gnrique
public void Close()
{ try{
con.close();
}
catch(Exception
Linterface dune)
objet ASP
{ System.out.println("echec lors de la
fermeture:"+e.getMessage());
3/8 }
}
67
Rcapitulatif : Classe gnrique
public String[] getTableNames()
{ String[] tbnames = null;
Vector tname = new Vector();
try{
results = new
resultSet(dma.getTables(catalog,null,"%",types));
Linterface dun objet ASP
while (results.hasMoreElements())
tname.addElement(results.getColumnValue("TABLE_NAM
4/8 E")); }
catch(Exception e)
{ System.out.println(e.getMessage());
}
tbnames = new String[tname.size()];
for(int i=0;i<tname.size();i++)
tbnames[i] = (String)tname.elementAt(i);
return tbnames;
}
68
Rcapitulatif : Classe gnrique
public String[] getColumnNames(String table)
{ String[] tbnames = null; Vector tname = new
Vector();
try{ results = new
Linterface dun objet ASP
resultSet(dma.getTables(catalog,null,table,null));
while (results.hasMoreElements())
5/8 tname.addElement(results.getColumnValue("COLUMN_NA
ME")); }
catch(Exception e)
{ System.out.println(e.getMessage()); } tbnames =
new String[tname.size()];
for(int i=0;i<tname.size();i++)
tbnames[i] = (String)tname.elementAt(i);
return tbnames; }
69
Rcapitulatif : Classe gnrique
public void getColumnValue(String table, String
columnName)
{
try{
ifLinterface dun objet ASP
(table.length()>0)
results = Execute("Select "+columnName+" from
6/8 "+table+" order by "+columnName);
}
catch(Exception e)
{
System.out.println("Erreur sur la valeur de la
colonne "+columnName+e.getMessage());
}
}
70
Rcapitulatif : Classe gnrique
71
Rcapitulatif : Classe gnrique
public resultSet Execute(String sql)
{ results = null;
Try
{
Linterface
Statement dun
stmt objet ASP
= con.createStatement();
results = new resultSet(stmt.executeQuery(sql));
8/8 }
catch(Exception e)
{
System.out.println(e.getMessage());
}
return results;
}
}
72
Merci
73