8 - Java DataBase Connectivity
8 - Java DataBase Connectivity
JDBC Introduction
1
JDBC Architectures
Architectures Client/Serveur
Client/Serveur
l Client/Serveur : un programme client s ’adresse à un programme sur une
machine distante (le serveur) pour échanger des informations et des
services
SGBD réseau
Client
Interface Serveur SGBD
Serveur de programme
données
2
JDBC Services
Services JDBC
JDBC
JDBC Classes
Classes et
et interfaces
interfaces de
de JDBC
JDBC
classes Java.lang.Object
SQLException
Charge et configure le
driver client du SGBD
BatchUpdateException SQLWarning
DataTruncation
Requètes SQL
interfaces
PreparedStatement
Connexion et
authentification Résultats des
CallableStatement
auprès du SGBD requètes
3
JDBC Classes
Classes et
et interfaces
interfaces de
de JDBC
JDBC
Requètes SQL
interfaces
Driver Oracle 8i
Driver Connection Statement ResultSet ResultSetMetaData DatabaseMetaData
PreparedStatement
Connexion et
authentification Résultats des
auprès du SGBD CallableStatement
requètes
Au niveau du programme
d’application on ne travaille qu’avec
les abstractions (interfaces) sans ce
soucier des classes effectives
d’implémentation
JDBC Classes
Classes et
et interfaces
interfaces de
de JDBC
JDBC
l Objets instanciés à partir des types Java définis dans java.sql
DriverManager
DriverManager permet de créer
des objets Connection
4
JDBC 1) Chargement du driver
l Avant de pouvoir être utilisé, le driver doit être enregistré auprès du
DriverManager de jdbc.
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
When a Driver class is loaded, it should create an instance of itself and register it with the DriverManager.
5
JDBC Connexions
Connexions
l Quand getConnection est invoquée le DriverManager interroge chaque driver
enregistré, si un driver reconnaît l’url il crée et retourne un objet Connection.
l Une application peut maintenir des connexions multiples
l le nombre limite de connexions est fixé par le SGBD lui même (de quelques
dizaines à des milliers).
l Quand une Connection n ’a plus d’utilité prendre soin de la fermer explicitement.
try {
con = DriverManager.getConnexion("jdbc:odbc:companydb","", "");
...
}
catch (SQLException e) {
...
}
finally {
try {
con.close();
} catch (SQLEXception e) {
e.printStackTrace();
}
}
© Philippe GENOUD UJF Février 2004 11
l Une fois une Connection créée on peut l’utiliser pour créer et exécuter
des requêtes (statements) SQL.
l 3 types de statement :
l Statement : requêtes simples (SQL statique)
l PreparedStatement : requêtes précompilées (SQL dynamique si
supporté par SGBD) qui peuvent améliorer les performances
l CallableStatement : encapsule procédures SQL stockées dans le
SGBD
l 3 types d'exécutions :
l executeQuery : pour les requêtes qui retournent un résultat (SELECT )
l résultat accessible au travers d ’un objet ResultSet
6
JDBC Préparer / exécuter une
requête simple
l Exécution de la requête :
String myQuery = "SELECT prenom, nom, email " +
"FROM employe " +
"WHERE (nom='Dupont') AND (email IS NOT NULL) " +
"ORDER BY nom";
ResultSet rs = stmt.executeQuery(myQuery);
while (rs.next())
{
... Exploiter les données
}
7
JDBC Lecture des résultats
l Les colonnes sont référencées par leur numéro ou par leur nom
l L'accès aux valeurs des colonnes se fait par des méthodes getXXX(String nomCol)
ou getXXX(int numCol) où XXX représente le type de l'objet
l Pour les très gros row, on peut utiliser des streams.
Equivalences
Equivalences des
des
JDBC types Java-SQL
types Java-SQL
l Pour chaque méthode getXXX le driver JDBC doit effectuer une conversion
entre le type de données de la base de données et le type Java correspondant
Type SQL Méthode Type Java
CHAR getString String Peut être appelée sur
n’importe quel type de valeur
VARCHAR getString String
NUMERIC getBigDecimal java.Math.BigDecimal
DECIMAL getBigDecimal java.Math.getBigDecimal
getObject peut retourner
BIT getBoolean boolean Boolean
n’importe quel type de donnée
TINYINT getByte byte Integer « packagé » dans un objet java
SMALLINT getShort short Integer (object wrapper)
INTEGER getInt int Integer
BIGINT getLong long Long
REAL getFloat float Float
FLOAT getDouble double Double Si une conversion de données
invalide est effectuée (par ex
DOUBLE getDouble double Double DATE -> int), une SQLException
DATE getDate java.sql.Date est lancée
TIME getTime java.sql.Time
getObject
TIME STAMP getTimestamp java.sql.Timestamp
8
JDBC Préparer/exécuter une
requête simple
ps.setString(1, "Person" );
9
JDBC Procédures
Procédures stockées
stockées
JDBC Procédures
Procédures stockées
stockées
l Préparation de l ’appel
Appel avec valeur de retour et paramètres
CallableStatement proc = conn.callableStatement(
"{? = call maProcedure(?,?)}");
Appel sans valeur de retour et avec paramètres
CallableStatement proc = conn. callableStatement(
"{call maProcedure(?,?)}");
l Préparation des paramètres
proc.registerOUTParameter(2,Types.DECIMAL,3);
2ème paramètre de type OUT Nombre de chiffres après décimale
l Appel
ResultSet rs = proc.executeQuery();
l Exploitation du ResultSet (idem que pour Statement et PreparedStatement)
l Récupération des paramètres OUT
java.Math.BigDecimal bigd = proc.getBigDecimal(2,3);
10
JDBC Accès aux méta-données
l On peut connaître :
l On peut connaître :
l Le nombre de colonnes : getColumnCount()
l …
11
JDBC Gestion
Gestion des
des transactions
transactions
l rollback()annule la transaction
try {
con.setAutoCommit(false);
// exécuter les instructions qui constituent la transaction
stmt.executeUpdate("UPDATE INVENTORY SET ONHAND = 10 WHERE ID = 5");
stmt.executeUpdate("INSERT INTO SHIPPING (QTY) VALUES (5)");
...
// valide la transaction
con.commit()
}
catch (SQLException e) {
con.rollback(); // annulle les opérations de la transaction
}
JDBC A
A propos
propos de
de SQLException
SQLException
...
}
catch (SQLException e) {
while (e != null) {
System.out.println("SQL Exception");
System.out.println(e.getMessage());
System.out.println("ANSI-92 SQL State : "+e.getSQLState());
System.out.println("Vendor error code : "+e.getErrorCode());
e = e.getNextException();
}
12
JDBC SQLWarning
SQLWarning
l Les classes du JDBC ont la possibilité de générer sans les lancer des exceptions
quand un problème est intervenu mais qu’il n’est pas suffisamment grave pour
interrompre le programme
l Exemple : fixer une mode de transaction qui n’est pas supporté la base de
données cible (un mode par défaut sera utilisé)
l SQLWarning encapsule même information que SQLException
l Pour les récupérer pas de bloc try catch mais à l’aide de méthode
getWarnings des interfaces Connection, Statement, ResultSet,
PreparedSatement, CallableStatement
void printWarninsg(SQLWarning warn) {
while (warn != null) {
System.out.println("\nSQL Warning");
System.out.println(warn.getMessage());
System.out.println("ANSI-92 SQL State : "+warn.getSQLState());
System.out.println("Vendor error code : "+warn.getErrorCode());
warn = warn.getNextException();
}
} ...
ResultSet rs = stmt.executeQuery("SELECT * FROM CLIENTS");
printWarnings( stmt.getWarnings() );
printWarnings( rs.getWarnings() );
...
JDBC Api
Api JDBC
JDBC 2.0
2.0
l JDBC 1.0
l package supplémentaire (add-on) pour JDK 1.0
l intégré l’API de base (core API) du JDK 1.1
l JDBC 2.0
13
JDBC ResultSet
ResultSet JDBC
JDBC 2.0
2.0
l Par défaut lorsque l’on crée un Statement les objets ResultSet sont en lecture
seule (read only) et à accès séquentiel (forward only)
public Statement createStatement() throws SQLException
l « Updateable »
ResultSet.TYPE_FORWARD_ONLY ResultSet.CONCUR_READ_ONLY
ResultSet.TYPE_SCROLL_INSENSITIVE ResultSet.CONCUR_UPDATABLE
ResultSet.TYPE_SCROLL_SENSITIVE
JDBC ResultSet
ResultSet JDBC
JDBC 2.0
2.0
l Méthodes de parcours
first() Positionne sur la première ligne (1er enregistrement)
relative(int) Déplacement d’un nombre de lignes donné par rapport à ligne courante
14
JDBC ResultSet
ResultSet JDBC
JDBC 2.0
2.0
l Modification du ResultSet
l Se placer sur le rang concerné
l Méthodes updateXXX(…)
l Puis updateRow()
JDBC ResultSet
ResultSet JDBC
JDBC 2.0
2.0
l Insertion d’une ligne
l moveToInsertRow()
l Puis insertRow()
rs.last();
rs.deleteRow();
15
JDBC ResultSet
ResultSet JDBC
JDBC 2.0
2.0
JDBC javax.sql
javax.sql
16
JDBC Pour conclure :
Un exemple « complet »
import java.sql.*;
public class TestJDBC {
public static void main(String[] args) throws Exception {
Class.forName("postgres95.pgDriver");
rs.close();
stmt.close();
conn.close();
}
}
© Philippe GENOUD UJF Février 2004 33
JDBC bibliographie
bibliographie
l Java Entreprise in a Nutshell, David Flannagan, Jim Farley, William
Cawford et Kris Magnusson, Ed. O ’Reilly , 1999
l Database programming with JDBC and Java, George Reese, Ed. O ’Reilly,
1998
l Tutoriaux en ligne
l JDBCshort course
http://developer.java.sun.com/developer/onlineTraining/Database/
JDBCShortCourse/index.html
JDBC Explorer is an open source front-end for Data Base Management Systems that supports visualization and editing (if
the corresponding JDBC driver supports ResultSets). Any JDBC database is supported, in the screenshots below you
can see the app in action browsing MySQL, MS SQL Server 2000, SAP DB - Ver.7.3.
Home: qform.sourceforge.net
QueryForm is a GPL'd open source GUI database front-end that, in the words of developer Dave
Glasser (email: [email protected]), "uses table metadata to build forms on-the-fly through which
you can enter queries, browse results, and add, update or delete rows".
© Philippe GENOUD UJF Février 2004 34
17
JDBC Drivers
Drivers JDBC
JDBC
l 4 catégories de drivers JDBC
l type 1 : Pont JDBC-ODBC (Open Data Base Connectivity)
JDBC Drivers
Drivers JDBC
JDBC
Application Java
Interface serveur
SGBD
Driver dédié à un SGBD particulier
• moins ouvert que pont JDBC/ODBC
• potentiellement plus performant (moins de couches logicielles)
mêmes problèmes qu’avec pont JDBC-ODBC
• code natif sur plateforme d ’exécution
18
JDBC Drivers
Drivers JDBC
JDBC
JDBC Drivers
Drivers JDBC
JDBC
19
JDBC Drivers
Drivers JDBC
JDBC
20