Vous êtes sur la page 1sur 8

Accès aux bases de données

Introduction à JDBC
H.Zinsou
Introduction à JDBC.doc___________________________________________________________________________________________

Accès aux bases de données

Introduction à JDBC

1. QUELQUES DEFINITIONS .....................................................................................2

2. LA CONNEXION .....................................................................................................4

3. EXECUTION ET CONTROLE D'UNE COMMANDE SQL ......................................6

3.1 Exécution des commandes SQL figées .......................................................................................................6

3.2 Exécution d'une requête préparée .............................................................................................................7

4. CONTROLE DE L'EXECUTION..............................................................................8

4.1 Contrôle des exceptions retournées par le serveur ...................................................................................8

4.2 Contrôle du nombre de lignes modifiées....................................................................................................8

4.3 Contrôle des valeurs nulles ......................................................................................................................... 9

1. Ce support n'aborde pas la gestion des transactions; il utilise


implicitement la validation par défaut des drivers JDBC (mode
Autocommit).Quelques définitions

Les APIs pour la persistance en base relationnelle

_________________________________________________________________________ 1
Page INJD.11
Accès aux bases de données
Introduction à JDBC
H.Zinsou
Introduction à JDBC.doc___________________________________________________________________________________________

 JDBC
la plus ancienne et actuellement la plus utilisée
basée comme ODBC sur la norme CLI (Call level interface)

 SQLJ
l'application à java de l'embedded SQL
norme implémentée par Oracle et IBM-DB2

 JDO
la plus récente
non limitée aux bases relationnelles

Le JDK : package java.sql

il comporte essentiellement des interfaces

Driver , Connection

Statement , PreparedStatement, ResultSet

et quelques classes, dont DriverManager

les exceptions

SQLException, SQLWarning, DataTruncation

Packages
d’implémentatio XxxDriver
n:

Par exemple registerDriver()


classes111.zip ou
classes12.zip DriverManager
d’Oracle
getDriver()
getConnec tion()
javax.sql…
DriverManager.getConnection( )
Les principales
classes: Connection Statement
s etAutoCommit(boolean)
c reateStatement(): Statement exec uteQuery(String s ql): Res ultSet
c ommit() exec uteUpdate(String s ql): int rowCount

createStatement( )

executeQuery( )
_________________________________________________________________________ 2
Page INJD.21 ResultSet

next(): boolean exis te


getString(): String donnée
getInt(): int donnée
getDate(): Date donnée
Accès aux bases de données
Introduction à JDBC
H.Zinsou
Introduction à JDBC.doc___________________________________________________________________________________________

2. La connexion

Il existe 4 types de drivers


exemples
 drivers "tout java"
JdbcThinTest.java et
JdbcMySqlTest.java
 drivers natifs

 drivers three tiers

 ponts jdbc-odbc
protocole NetServeur
du SGBD
On utilise ici les drivers "tout java" Serveur de données

Coup d'œil à l'architecture


socket TCP / IP

éléments:

classes JDBC
_________________________________________________________________________ 3
Page INJD.31 application

Client
Accès aux bases de données
Introduction à JDBC
H.Zinsou
Introduction à JDBC.doc___________________________________________________________________________________________

- protocoles TCP/IP, HTTP

- connexion socket

- driver JDBC complet « tout java »

Mise en place de la bibliothèque propriétaire


Elle contient
- l'implémentation des classes JDBC (Connection, Statement…)
- et le driver

La bibliothèque dépend du SGBD et varie avec la version


par exemple
classes12.zip pour Oracle
mysql-connector-java-3.0.9-stable-bin.jar pour mySql

la bibliothèque doit être dans le classpath au moment de l'exécution


Par exemple
pour le driver thin d'Oracle8
set classpath = c:\oracle\Ora81\jdbc\lib\classes12.zip;%classpath%

et pour mySql
set classpath = c:\mySql\ mysql-connector-java-3.0.9-stable-bin.jar;%classpath%

Exemple d'utilisation
try {
// chargement du driver
Class.forName ("oracle.jdbc.driver.OracleDriver");
...
// connexion à la base
Connection cnx = DriverManager.getConnection
("jdbc:oracle:thin:scott/tiger@serveur:1521:instance");
...
// création de la requête
Statement stmt = cnx.createStatement ();
...
// exécution de la requête
stmt.executeUpdate
("create table Test(numero number(4))");
// traitement des exceptions retournées par le serveur
} catch (SQLException e) {
System.out.println
("erreur accès base: " + e + " " + e.getMessage());
}

Gestion des transactions


le fonctionnement par défaut des drivers JDBC est la validation des commandes SQL
(commit) au fur et à mesure de leur exécution
fonctionnement appelé mode AutoCommit
_________________________________________________________________________ 4
Page INJD.41
Accès aux bases de données
Introduction à JDBC
H.Zinsou
Introduction à JDBC.doc___________________________________________________________________________________________

 il est inutile d'effectuer un commit()


 un rollback sera sans effet sur la base de données

3. Exécution et contrôle d'une commande SQL

3.1 Exécution des commandes SQL figées

Exécution directe de commandes SQL-DML (insert, update…) ou SQL-DDL (create,


drop…)
Exemple InsertSelect

 Créer une table

Connection cnx = DriverManager.getConnection


("jdbc:oracle:thin:scott/tiger@serveur:1521:instance");
Statement stmt = cnx.createStatement ();
String requete = "create table Livre ( titre varchar2(200),
anneeEdition number(4))";
stmt.executeUpdate(requete);

 Insérer des données dans la table

requete = "insert into Livre (titre, auteur)


values ('Tintin au tibet', 1960)";
try { stmt. executeUpdate (requete); }
catch (SQLException ex) {
System.out.println(
“erreur d’exécution dans \n” + requete
+ \n + ex.getMessage()) ;
}

 Lire les données présentes dans la table


requete = "select titre, auteur from livre";
ResultSet rset = stmt.executeQuery (requete);
while (rset.next ()) {
// lecture de la colonne "titre"
System.out.print (rset.getString (1) + "\t");
// lecture de la colonne "anneeEdition"
System.out.println (rset.getInt (2));
}
System.out.println ("fin de la table");

Le resultSet est une collection de lignes retournées par le SELECT


 il faut se positionner sur le 1er élément de la collection par next() avant de lire les
données reçues

_________________________________________________________________________ 5
Page INJD.51
Accès aux bases de données
Introduction à JDBC
H.Zinsou
Introduction à JDBC.doc___________________________________________________________________________________________

3.2 Exécution d'une requête préparée


Exemple RequetePreparee

but:
optimisation des accès à la base, en évitant de recompiler (parsing) les requêtes SQL à chaqu
exécution

moyen.
On remplace la classe Statement par la classe PreparedStatement

PreparedStatement
Connection
clearParameters()
prepareStatement(): PreparedStatement
setShort(int rangParam, short x)
setString(int rangParam, Stringx)
...
executeQuery(Stringsql): ResultSet
executeUpdate(Stringsql): int rowCount

ResultSet

next(): booleanexiste
getString(): Stringdonnée
getInt(): int donnée
getDate(): Datedonnée

Définition, préparation et exécution:

1. création d'un preparedStatement, à la place du Statement:


PreparedStatement pStmt =
cnx.prepareStatement
("select titre, anneeEdition, prix from Scott.Livre where anneeEdition > ? or
auteur = ?");

2. affectation des valeurs aux "place holders"


pStmt.setInt(1, 1965);
pStmt.setString(2, "Morris");

3. exécution du preparedStatement
ResultSet result = pStmt.executeQuery();
while(result.next()) {
// exploitation du résultat
System.out.println (result.getString(1) ; ...

_________________________________________________________________________ 6
Page INJD.61
Accès aux bases de données
Introduction à JDBC
H.Zinsou
Introduction à JDBC.doc___________________________________________________________________________________________

De même pour un insert, ou update, delete:


PreparedStatement pStmt =
cnx.prepareStatement ("insert into Scott.Dept (deptno, dname,
location) values (?, ?, ?)");

pStmt.setInt (1, 12);


pStmt.setString (2, "Oracle");
pStmt.setString (3, "USA");

4. int rows = pStmt.executeUpdate ();Contrôle de l'exécution

4.1 Contrôle des exceptions retournées par le serveur

Exemple InsertSelect2

On peut intercepter et analyser les exceptions retournées par le serveur de données

try {
String requete= "insert into livre (?, ?) values ('?, ?";
PreparedStatement pStmt = cnx.prepareStatement(requete);
pStmt.setString ...
pStmt.executeUpdate();
}
catch(SQLException ex) {
System.out.println (ex.getMessage() );
}

Possibilité de sélection de certains codes d'erreur:


on peut ne vouloir intercepter que certaines exceptions; par exemple
try { ...
catch (SQLException ex) {
if (ex.getErrorCode() == 955 ) {
// exception "la table existe déjà" (pour Oracle)
// traiter cette exception
}
else throw ex; // propager les autres exceptions

4.2 Contrôle du nombre de lignes modifiées

Contrôle du nombre de lignes modifiées par un insert, update ou delete

une commande SQL insert / update / delete peut ne modifier aucune ligne de la table
 le serveur ne retourne pas d'exception dans ce cas
 on peut vouloir vérifier combien de lignes ont étyé modifiées:

String requete = "update Livre set auteur = ? where titre = ?";


PreparedStatement pStmt = cnx.prepareStaement(requete);
_________________________________________________________________________ 7
pStmt.setString ...
Page INJD.71
int compteLignes = stmt.executeUpdate(requete);
System.out.println (compteLignes + " lignes modifiées");
Accès aux bases de données
Introduction à JDBC
H.Zinsou
Introduction à JDBC.doc___________________________________________________________________________________________

4.3 Contrôle des valeurs nulles

Les principes
 dans une base relationnelle, n'importe quelle cellule d'une table peut avoir une valeur nulle
en SQL, une valeur nulle est testée par where une_colonne is null
dans JDBC, la valeur relationnelle NULL est identifiée par java.sql.TYPES.NULL

 avec java, n'importe quel pointeur vers un objet peut être nul
par contre un type primitif (int, float, boolean…) ne peut pas être nul
on peut cependant leur affecter des valeurs spéciales (Integer.MIN_VALUE,
Float.NEGATIVE_INFINITY)

Exemple d'utilisation dans un select

int numero = 0;
ResultSet rs = statement.executeQuery("select empno, ename from emp");
while (rs.next()) {
numero = rs.getInt(1);
if (rs.wasNull()) numero = Integer.MIN_VALUE;
}

et en insertion
int numero = …

PreparedStatement ps = connecion.prepareStatement("insert into emp (empno, ename) values
(?, ?)");
ps.setInt(1, java.sql.TYPES.NULL);

===========================

_________________________________________________________________________ 8
Page INJD.81

Vous aimerez peut-être aussi