Vous êtes sur la page 1sur 73

Programmation Oriente

Objet: Java

Amira Mouakher
Facult des Sciences de Tunis
mouakheramira@gmail.com
https://amiramouakher.wordpress.com/

1
Plan
Introduction au monde Objet

La langage Java: Introduction et caractristiques

Syntaxe et structures de contrle

Hritage

Les exceptions

Les Entres/Sorties

Connexion Java et les bases de donnes: lAPI JDBC

2
Java Database Connectivity (JDBC)
La technologie JDBC est une API : ensemble de classes fournie avec

Java (depuis sa version 1.1)

Permet de se connecter des bases de donnes locale ou distante:

une base de donnes relationnelle (Access, SQL Server, Oracle, MySQL,

...)

L'API JDBC est indpendante du SGBD : dveloppe de telle faon

permettre un programme de se connecter n'importe quelle base de

donnes en utilisant la mme syntaxe.

Indpendante de la plate-forme sur laquelle elle s'excute (portabilit

du code).

3
Java Database Connectivity (JDBC)

Fonctionne selon un principe client/ serveur :

client = le programme Java serveur = la base de donnes

Principe

le programme Java ouvre une connexion

il envoie des requtes SQL

il rcupre les rsultats

...

il ferme la connexion (lorsqu'il n'en a plus besoin)

4
L API JDBC
Fournie par le package java.sql

permet de formuler et grer les requtes aux bases de

donnes relationnelles

8 interfaces dfinissant les objets ncessaires :

la connexion une base loigne

et la cration et excution de requtes SQL

5
java.sql

8 interfaces :
Statement
CallableStatement,
PreparedStatement
DatabaseMetaData,
ResultSetMetaData
ResultSet,
Connection
Driver

6
Principe de fonctionnement

Chaque base de donnes utilise un pilote (driver) qui lui

est propre et qui permet de convertir les requtes JDBC

dans le langage natif du SGBDR.

Ces drivers dits JDBC (un ensemble de classes et

dinterfaces Java) existent pour pour tous les principaux

constructeurs :

Oracle, Sybase, Informix, DB2, ...

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

c est la couche visible et utile pour dvelopper des


applications Java accdant des SGBDR

reprsente par le package java.sql

Les couches infrieures :


destines faciliter l implmentation de drivers pour
des bases de donnes

reprsentent une interface entre les accs de bas


niveau au moteur du SGBDR et la partie applicative

9
Drivers JDBC

4 types de drivers (taxonomie de JavaSoft) :

Type 1 : JDBC-ODBC bridge driver


Type 2 : Native-API, partly-Java driver
Type 3 : Net-protocol, all-Java driver
Type 4 : Native-protocol, all-Java driver

Tous les drivers :


http://java.sun.com/products/jdbc/jdbc.drivers.html

10
Driver de type I

Le driver accde un SGBDR en passant par les


drivers ODBC (standard Microsoft) via un pont
JDBC-ODBC :
les appels JDBC sont traduits en appels ODBC

presque tous les SGBDR sont accessibles


(monde Windows)

est fourni par SUN avec le JDK 1.1


sun.jdbc.odbc.JdbcOdbcDriver

11
ODBC de Microsoft

Open DataBase Connectivity :

permet d accder la plupart des SGBD dans le monde

Windows

dfinit un format de communication standard entre les

clients Windows et les serveurs de bases de donnes

est devenu un standard de fait du monde Windows

tous les constructeurs de SGBD fournissent un driver

ODBC
12
Avantages de ODBC
Avantages :

possibilit d crire des applications accdant des

donnes rparties entre plusieurs sources htrognes

on dveloppe l application sans se soucier de la

source de donnes

la base de donnes utilise ct serveur peut tre

interchange sans aucune modification du

dveloppement fait dans la partie cliente

13
Driver de type II

Driver d API natif :


fait appel des fonctions natives (non Java) de l API du
SGBDR (Oracle, Sybase, ou autres)
Les appels JDBC sont convertis en appels natifs
pour le serveur de bases de donnes
gnralement en C ou en C++.

fourni par les diteurs de SGBD et gnralement payant

14
Driver de type III

Pilote tout Java ou 100% Java


interagit avec une API rseau gnrique et
communique avec une application intermdiaire
(middleware) sur le serveur

le middleware accde par un moyen quelconque (par


exple JDBC si crit en Java) aux diffrents SGBDR

portable car entirement crit en Java

15
Driver de type IV

Driver 100% Java mais utilisant le protocole


rseau du SGBDR
interagit avec la base de donnes via des
sockets

gnralement fourni par lditeur

aucun problme d excution pour une applet


si le SGBDR est install au mme endroit que
le serveur Web

16
Modles de connexion en Java

Modle 2-tiers : 2 entits interviennent


1. une application Java ou une applet

2. le SGBDR

Modle 3-tiers : 3 entits interviennent


1. une application Java ou une applet

2. un serveur middleware install sur le


rseau
3. 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

si c est le cas : utilise souvent JDBC pour accder au


SGBDR
Avantages:
le middleware peut ajouter un niveau de scurit

plusieurs supports pour les changes avec le client :

sockets, RMI Java, CORBA,


facilite l utilisation de clients lgers

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

L'API JDBC est dfinie dans le package java. sql

Classes Interfaces Exceptions

Date Array BatchUpdateException


DriverManager Blob DataTruncation
DriverPropertyInfo CallableStatement SQLException
SQLWarning
Time Clob
Timestamp Connection
Types DatabaseMetaData
Driver
PreparedStatement
Ref
ResultSet
ResultSetMetaData
SQLData
SQLInput
SQLOutput
Statement
Struct
22
Mettre en uvre JDBC
0. Importer le package java.sql

1. Enregistrer le driver JDBC

2. Etablir la connexion la base de donnes

3. Crer une zone de description de requte

4. Excuter la requte

5. Traiter les donnes retournes

6. Fermer les diffrents espaces

23
Enregistrer le driver JDBC

1/6 Mthode forName() de la classe Class :

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

2/6 Accs la base via un URL de la forme :


jdbc:<sous-protocole>:<nom-BD>;param=valeur, ...

l utilisation de
JDBC
le driver ou le type de
SGBDR

l identification de la base locale ou distante

avec des paramtres de


configuration ventuels
nom utilisateur, mot de passe, ...
Exemples :
String url = "jdbc:odbc:maBase" ;
String url =
"jdbc:msql://sadok.fst.tn:1114:maBase";

25
Connexion la base

2/6 Mthode getConnexion() de DriverManager

Connection connect =
DriverManager.getConnection(url,user,password );

URL de la base de
donnes

le nom de
lutilisateur

mot de passe

le DriverManager essaye tous les drivers qui se sont


enregistrs (chargement en mmoire avec
Class.forName()) jusqu ce quil trouve un driver
qui peut se connecter la base

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

PreparedStatement : requtes dynamiques


pr-compiles (avec paramtres d entre/sortie)
CallableStatement : procdures stockes

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)

executeUpdate() : pour les requtes


(INSERT, UPDATE, DELETE, CREATE
TABLE, DROP TABLE) qui retournent un
entier (nombre de tuples traits)

execute() : procdures stockes (cas rares)

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.

c est le pilote associ la connexion (et au


final par le moteur de la base de donnes) qui
interprte la requte SQL
si une requte ne peut s excuter ou quune
erreur de syntaxe SQL a t dtecte,
lexception SQLException est leve

le driver JDBC effectue dabord un accs la


base pour dcouvrir les types des colonnes
impliques dans la requte puis un 2me pour
l excuter..

31
Traiter les donnes retournes

5/6 L objet ResulSet (retourn par l excution de


executeQuery()) permet d accder aux
champs des tuples slectionns

seules les donnes demandes sont


transfres en mmoire par le driver JDBC

il faut donc les lire "manuellement" et les


stocker dans des variables pour un usage
ultrieur

32
Le rsultat : ResultSet (1/3)

5/6 Il se parcourt itrativement ligne par ligne


par la mthode next()
retourne false si dernier tuple lu, true sinon
chaque appel fait avancer le curseur sur le tuple suivant
initialement, le curseur est positionn avant le premier
tuple
excuter next() au moins une fois pour avoir le
premier

while(rs.next()) {// Traitement de chaque


tuple}

33
Le rsultat : ResultSet (1/3)

Trois modes de fonctionnement ( partir de JDBC 2.0) :


forwardonly : parcours sequentiel de chaque occurrence
(java.sql.ResultSet.TYPE_FORWARD_ONLY)
scrollinsensitive : les occurrences ne refltent pas les mises jour qui peuvent intervenir
durant le parcours (java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE)
scrollsensitive : les occurrences refltent les mises jour qui peuvent intervenir durant le
parcours (java.sql.ResultSet.TYPE_SCROLL_SENSITIVE)

Il est aussi possible de prciser si le ResultSet peut tre mise jour ou non :
java.sql.ResultSet.CONCUR_READ_ONLY : lecture seule

java.sql.resultSet.CONCUR_UPDATABLE : mise jour possible

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).

Statement statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,


ResultSet.CONCUR_READ_ONLY);
ResultSet resultSet = statement.executeQuery("SELECT nom, prenom FROM employes");

34
Le rsultat : ResultSet (2/3)

5/6
Les colonnes sont rfrences par leur numro ou par
leur nom

L accs aux valeurs des colonnes se fait par les


mthodes de la forme getXXX()
lecture du type de donnes XXX dans chaque
colonne du tuple courant

int val = rs.getInt(3) ; // accs la 3e


colonne
String prod = rs.getString("PRODUIT") ;

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

6/6 Pour terminer proprement un traitement, il faut


fermer les diffrents espaces ouverts
sinon le garbage collector s en occupera mais
moins efficace

Chaque objet possde une mthode close() :

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).

Les objets utilisables pour obtenir ces informations sont:


DataBaseMetaData: Un objet contenant les informations sur la base de donnes
en gnral (des mtadonnes), c'est--dire le nom de la table, les index, la version
de la base, etc.
ResultSet: Un objet contenant les informations sur une table ou le rsultat d'une
requte. L'accs aux donnes se fait colonne par colonne, mais il est
ventuellement possible d'accder indpendamment chaque colonne par son
nom
ResultSetMetaData: Un objet contenant des informations sur le nom et le type des
colonnes d'une table

40
Utilisation de JDBC : Ordre SQL
quelconque
Dans certains cas on ne sait pas l'avance si l'ordre SQL modifiera les donnes ou

effectuera une simple consultation.

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).

En fait, la mthode getUpdateCount() suffit pour dterminer le type de la requte

(elle renvoie l'entier -1 si l'ordre est un ordre SELECT)

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

DATE java. sql. Date getDate()


TIME java. sql. Time getTime()
TIMESTAMP java. sql. TimeStamp getTimeStamp()

42
Gestion des valeurs nulles
rs. getString( String attribut) ou rs.getString( int colNum) :

peuvent tre utiliss pour n'importe quel type de paramtre

rcupration de la valeur de l'attribut sous forme de chane.

rs. wasNull() permet de savoir si la valeur est non

renseigne

int num = rs. getInt(" age"); // -1 si non renseign

boolean ageNonRenseigne = rs.wasNull();

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

BLOB :Binary Large OBject

CLOB : Character Large OBject

permettent de stocker des donnes de grande taille (ex. : fichier) dans une

table

Type SQL Type Java getter mthode

BLOB java.io.InputStream getBinaryStream()

CLOB java.io.Reader getAsciiStream()

BD Type pour BLOB Type pour CLOB

Access Objet OLE Objet OLE

Oracle RAW LONG RAW

45
Types de requtes SQL

Statement requte SQL "normale"


PreparedStatement requte SQL prcompile
CallableStatement procdure stocke

PreparedStatement CallableStatement

Requte SQL Procdure stocke dans la


BD
prcompile
crite avec le langage interne
pouvant tre paramtre
de la BD
pouvant tre excute pouvant tre paramtre
plusieurs fois pouvant tre excute

gre par le client JDBC plusieurs fois


gre par la BD

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

Possibilit de dfinition de 1 ou plusieurs paramtres caractres ?

PreparedStatement pst = cx. prepareStatement(" SELECT * FROM etudiant WHERE nom=?

AND age=?");

2. Les paramtres sont renseigns par des appels des mthodes setter

pst. setString( 1, " Ali" ); // 1 = 1er ?

pst. setInt( 2, 25 ); // 2 = 2me ?

Rq : setBoolean, setByte, setDouble, setFloat pour les autres types

3. Excution de la requte : ResultSet rs = pst. executeQuery();

Rq : executeUpdate pour les autres types de requtes SQL

48
Requtes SQL prcompiles
PreparedStatement pstmt = conn.prepareStatement( "UPDATE

emp SET sal = ? WHERE name = ?");

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;

select sum(sal) * pourcentage / 100


into cout
from emp
where dept = unDept;
end;

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

cx. setAutoCommit( false);

Statement st = cx. createStatement();


Linterface
st. dun objet
executeUpdate( ASP INTO ages VALUES
"INSERT

(Ali', 12)" );

st. executeUpdate( "UPDATE ages SET age= 15 WHERE

nom= AZERTY'" );

cx. commit();

engagement de la transaction

53
Niveau d'isolation des transactions

Diffrents niveaux d'isolation possibles pour les transactions :

quel moment les rsultats des transactions sont visibles

Positionnables par appel cx.setTransactionIsolation(niveau);

54
Niveau d'isolation des transactions

TRANSACTION_ SERIALIZABLE (niveau = 8)


t1 lit un ensemble d'enregistrement
t2 ajoute un enregistrement l'ensemble
si t1 lit nouveau l'ensemble, il ne voit pas celui ajoute par
t2

les transactions apparaissent comme si elles avaient t


excutes en squence

55
Niveau d'isolation des transactions

TRANSACTION_ REPEATABLE_ READ (niveau =

4)

t1 lit un enregistrement

t2 modifie cet enregistrement

si t1 lit nouveau l'enregistrement, il lit la mme

valeur que prcdemment

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

1. Cration d'une requte en utilisant un objet de la classe Connection

Statement st = cx.
createStatement();
2. Ajout des diffrentes requtes

st. addBatch( "INSERT INTO ages VALUES (Salah', 45)" );


st. addBatch( "INSERT INTO ages VALUES (Ali', 45)" );
st. executeUpdate("UPDATE ages SET age= 15 WHERE nom= XXW'"
);

3. Excution des requtes (dans l'ordre dajout)

int[] res = st. executeBatch();

possibilit d'insrer le lot dans une transaction


0. cx. setAutoCommit( false);
4. cx. commit();
58
Mta- base: Lobjet ResultSetMetaData
La plupart des programmes JDBC sont crits pour des schmas de

tables connus

But de la mta- base : dcouvrir l'excution le schma des

tables

Avantage : le programme peut manipuler n'importe quel

schma

59
Mta- base: Lobjet ResultSetMetaData

1. Connexion et rcupration des enregistrements d'une table


Statement st = cx. createStatement();
ResultSet rs = st. executeQuery( "SELECT * FROM etudiant" );
2. Rcupration d'un objet de la classe ResultSetMetaData dcrivant le
ResultSet
ResultSetMetaData rsmd = rs. getMetaData();
3. Interrogation du ResultSetMetaData pour dcouvrir le schma de la table
etudiant
int columnCount = rsmd. getColumnCount(); // # de colonnes
String colLabel = rsmd. getColumnLabel( i); // nom de la colonne i
String colType = rsmd. getColumnTypeName( i); // type de la colonne i

60
Mta- base: Lobjet ResultSetMetaData
Obtenir quelques informations sur les colonnes renvoyes par un
SELECT

ResultSet rs = stmt.executeQuery("SELECT * FROM



etudiant");
Linterface dun objet ASP
ResultSetMetaData rsmd = rs.getMetaData();
int nbColonnes = rsmd.getColumnCount();
for (int i = 1; i <= nbColonnes; i++)
{ // Les colonnes sont numrotes partir de 1
(et pas de 0)
String typeColonne = rsmd.getColumnTypeName(i);
String nomColonne = rsmd.getColumnName(i);
System.out.println("La colonne " + i + " de nom
+ nomColonne + " est de type " +
typeColonne);
}

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

ResultSet getCatalogs() --> la liste du catalogue d'informations (Avec le pont


JDBCODBC, on obtient la liste des bases de
donnes enregistres dans ODBC).

ResultSet getTables(catalog, schema, une description de toutes les tables


tableNames, columnNames) correspondant au TableNames donn et toutes
les colonnes correspondantes columnNames.

ResultSet getColumns(catalog, schema, une description de toutes les colonnes


tableNames, columnNames) correspondantes au TableNames donn et toutes
les colonnes correspondantes
columnNames.

String getURL() l'URL de la base laquelle on est connect


String getDriverName() le nom du driver utilis

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

public String getNextValue(String columnName)


{ String res = "";
ifLinterface
try{
dun objet ASP
(results.hasMoreElements()) res =
results.getColumnvalue(columnName);
7/8 }
catch(Exception e)
{ System.out.println("Erreur sur la valeur
suivante "+columnName+e.getMessage());
}
return res;
}

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