Vous êtes sur la page 1sur 20

IntroductionJDBC

Introduction
JDBC, Java Data Base Connectivity est un ensemble de classes (API Application Programming Interface --JAVA) permettant de se connecter une base de donnes relationnelle en utilisant des requtes SQL ou des procdures stockes. LAPI JDBC a t dveloppe de manire pouvoir se connecter nimporte quelle base de donnes avec la mme syntaxe; cette API est dite indpendante du SGBD utilis. Les classes JDBC font partie du package java.sql et javax.sql JDBC permet entre autre : 1. L'tablissement d'une connexion avec le SGBD. 2. L'envoi de requtes SQL au SGBD, partir du programme java: cration de tables, slection de donnes, 3. Le traitement, au niveau du programme, des donnes retournes par le SGBD. 4. Le traitement des erreurs retournes par le SGBD lors de l'excution d'une instruction. Pilote de bases de donnes ou driver JDBC y y Un pilote ou driver JDBC est un "logiciel" qui permet de convertir les requtes JDBC en requtes spcifiques auprs de la base de donnes. Ce "logiciel" est en fait une implmentation de l'interface Driver, du package java.sql.

Dans le cas doracle, les drivers JDBC sont fournis par Oracle (en principe installs avec la base de donnes) tlchargeables ladresse. http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010090769.html

Saliha Yacoub

Page1

TypesdedriversJDBC
Il existe plusieurs types de pilotes JDBC Les drivers de Type 1 : ODBC-JDBC bridges, ODBC (Open Data Base Connectivity) est une interface propre Microsoft et qui permet laccs nimporte quelle base de donnes (Panneau de configuration /Outils dadministration/ Sources de donnes ODBC

Chaque requte JDBC est convertie par ce pilote en requte ODBC qui est par la suite convertie une seconde fois dans le langage spcifique de la base de donne.

Cette technique est la moins optimale puisque les bases de donnes sont disponibles uniquement que par technologie ODBC. Le SDK de Java fournit un pilote JDBC-ODBC : sun.jdbc.odbc.JdbcOdbcDriver .

Les drivers de Type 2 Ce type de driver traduit les appels de JDBC un SGBD particulier, grce un mlange d'API java et d'API natives. (propre au SGBD). Ce Driver est fourni par lditeur de SGBD

Saliha Yacoub

Page2

Il est de ce fait ncessaire de fournir au client lAPI native de la base de donnes. Si on change le type de la base de donnes, on doit changer le pilote.

Drivers de type 3 (compltement crit en JAVA)

Permet la connexion une base de donnes via un serveur intermdiaire rgissant laccs aux multiples bases de donnes Page3

Saliha Yacoub

Ce type de driver est portable car crit entirement en java. Il est adapt pour le Web. Cela exige une autre application serveur installer et entretenir. Ce type de driver peut tre facilement utilis par une applet, mais dans ce cas le serveur intermdiaire doit obligatoirement tre install sur la machine contenant le serveur Web.

Drivers de type 4 (compltement crit en JAVA) Ce type de driver est connu sous le nom Direct Database Pure Java Driver), permet daccder directement la base de donnes (sans ODBC ni Middleware). Cest le type le plus optimal.

Cest ce type de driver qui sera utilis pour accder aux bases de donnes oracle Dans ce type de driver on retrouve le driver pour oracle (thin driver ou oracle.jdbc.driver.OracleDriver) dont le format de la chaine de connexion une base de donnes est sous formes :jdbc:oracle:thin:@chainedeconnexion

Saliha Yacoub

Page4

Architecture JDBC fonctionne selon les deux modles suivants : Modle deux couches (two-tier)

Dans le modle two-tier, une application JAVA (ou une applet) dialogue avec le SGBD par lintermdiaire du pilote JDBC. Lapplication JAVA et le pilote JDBC sexcutent sur lordinateur client tandis que le SGBD est plac sur un serveur. Cest ce type darchitecture qui nous concerne actuellement dans notre cours.

Modles 3 couches (three-tier)

Dans le modle three-tier, lapplet (ou lapplication JAVA) ne dialogue plus directement avec un SGBD : un middle-tier fait le lien entre ces deux composants

Saliha Yacoub

Page5

Le SGBD excute les requtes SQL et envoie les rsultats au middle tier. Ces rsultats sont ensuite communiqus lapplet sous forme dappels http.

Fonctionnement
Tout programme JDBC fonctionne selon les tapes suivantes : 1. Connexion la base de donnes i. Chargement du pilote de la BDD ii. Demande de connexion: sidentifiant auprs du SGBD et en prcisant la base utilise 2. Traitement des commandes SQL 3. Traitement des rsultats 4. Fermeture de la connexion. Pour utiliser NetBeans avec JDBC et oracle, vous devez inclure les librairies (.Jar) votre projet : ces librairies sont, selon la version de votre JDK, ojdbc6.jar (pour JDK 1.6) et orai18n.jar

tablissementduneconnexion
1. Chargement du pilote (driver) Pour tablir une connexion, il faut dabord charger le driver en utilisant la mthode forName de la classe Class comme suit : Class.forName(string driver). Pour oracle, linstruction est la suivante :
Saliha Yacoub

Page6

Class.forName ("oracle.jdbc.driver.OracleDriver");

Quand une classe Driver est charge, elle doit crer une instance delle mme et senregistrer auprs du DriverManager. Code complet pour le chargement du pilote

try { Class.forName ("oracle.jdbc.driver.OracleDriver"); System.out.println("Pilote charg"); } catch(ClassNotFoundException cnfe) { System.out.println("ERREUR : Driver manquant."); }

La mthode Class.forName(string driver) fait partie du pckage java.lang et peut lancer une exception de type ClassNotFoundException . 2. Demander une connexion Une fois le pilote charg, alors on peut demander une e connexion la base de donnes. Cette connexion est obtenue grce la mthode getConnection de la classe DriverManager Cette mthode retourne la connexion qui est en fait, un objet implmentant linterface Connection. Connection connexion = DriverManager.getConnection(url); url dsigne la chaine de connexion , dans le cas doracle la chaine de connexion est de forme : "jdbc:oracle:thin:@IP:port:orcl", "nomUsager","Motdepasse"

Saliha Yacoub

Page7

public static void main(String[] args) { String url = "jdbc:oracle:thin:@172.17.200.251:1521:orcl"; String usager ="usager1"; String motdepasse="oracle1"; try { Class.forName ("oracle.jdbc.driver.OracleDriver"); System.out.println("Pilote charg"); } catch(ClassNotFoundException cnfe) { System.out.println("ERREUR : Driver manquant."); } try {
Connection connexion = DriverManager.getConnection(url,usager, motdepasse);

System.out.println("connct"); } catch (SQLException se) { System.out.println("ERREUR : bd manquante ou connexion invalide."); } }

Saliha Yacoub

Page8

ExcutionderequtasSQL:crerunstatementdunerequte particulire.
Cette tape consiste obtenir une dclaration (zone de description de requte ou statement ) au travers de laquelle les requtes SQL seront excutes. Il existe 3 types de dclarations: 1. Statement: instruction simple : permet dexcuter directement et une fois laction sur la base de donnes : Statement declaration1= connexion.createStatement(); 2. PreparedStatement: instruction paramtre. (cas des requtes avec paramtres) Linstruction est gnrique, des champs sont non remplis Permet une prcompilation de linstruction optimisant les performances Pour chaque excution, on prcise les champs manquants

PreparedStatement declaration2= connexion PreparedStatement (requetesql);

3. CallableStatement: Une dclaration de type CallableStatement permet laccs complet aux fonctions contenues dans la base de donnes.(cas des procdures stockes)

ExcutionderequtasSQL:executeUpdate;executeQuery,execute
La mthode ExecuteUpdate est utilise pour les requtes DML (INSERT, DELETE, UPDATE) Syntaxe objetStatement.executeUpdate(String Requte_SQL]); ou objetPreparedStatement.executeUpdate(String Requte_SQL]);

Saliha Yacoub

Page9

Exemple : ---------------Dabord le chargement du driver---- ensuite String requete1 = "INSERT INTO employes (numemp, nom) VALUES (1,Patoche')"; Connection connexion = DriverManager.getConnection(url1,usager,motdepasse); System.out.println("connexion tablie"); Statement stm = connexion.createStatement(); stm .executeUpdate(requete1); System.out.println("insertion complte");

Exercice 1 : crire un programme JAVA JDBC qui permet De se connecter notre base de donnes Oracle De supprimer les employs dont le codedep =inf Dafficher le nombre denregistrements supprimer

La mthode executeQuery, permet dexcuter une instruction SQL de type SELECT Elle retourne un objet de type ResultSet contenant tous les rsultats de la requte (les tuples slectionns). Syntaxe objetResultSet=objetStatement.executeQuery(String ordreSQL); ou objetResultSet=objetPreparedStatement.executeQuery(String ordreSQL);

Saliha Yacoub

Page10

Exploitation des rsultats des requtes SQL Linterface ResultSet reprsente une table de lignes et de colonnes. Une ligne reprsente un enregistrement Une colonne reprsente un champ particulier de la table Un objet de type RsultSet possde un pointeur sur lenregistrement courant. la rception de cet objet, le pointeur se trouve devant le premier enregistrement. On y accde ligne par ligne, puis colonne par colonne dans la ligne.

Pour pouvoir rcuprer les donnes contenues dans linstance de ResultSet, celui-ci met disposition des mthodes permettant de : Positionner le curseur sur lenregistrement suivant : public boolean next(); Renvoi un boolen indiquant la prsence dun lment suivant. Accder la valeur dun champ (par indice ou par nom) de lenregistrement actuellement point par le curseur avec les mthodes getString(), getInt(), getDate() .. public String getString(int indiceCol); public String getString(String nomCol); etc. la cration du ResultSet, le curseur de parcours est positionn avant la premire occurrence traiter.

Le premier indice tant 1

Saliha Yacoub

Page11

Exemple String requete2= "select nom, prenom from employes where codedep = 'inf'"; -------------------------Dabord le chargement du driver---- ensuite Connection connexion = DriverManager.getConnection(url1,user,passwd); System.out.println("connexion tablie"); Statement stm = connexion.createStatement(); ResultSet rest = stm.executeQuery(requete2); while (rest.next()) { String NOMR = rest.getString("nom"); String PRENOMR = rest.getString("prenom"); System.out.print(NOMR + " " + PRENOMR); System.out.println(); }

Exercice 2 Complter le programme prcdent pour quil affiche la liste des employs dont le nom commence par R;

Mthode execute (String ordre) : Retourne true si un rsultat est disponible, false si non.

valeurboolenne=objetStatement.execute (String ordre); valeurboolenne=objetPreparedStatement.execute (String ordre);

Fermetureduneconnexion:
La connexion est ferme avec la mthode close de lobjet connexion.close();

Saliha Yacoub

Page12

UtilisationduPreparedStatement
Ce type dinterface est utilis pour des requtes paramtres. PreparedStatement est utilis dans le cas 0 la requte va tre excute plusieurs fois. De plus Les requtes sont prcompiles. Remarquez 1. Dans le requte le paramtre est reprsent par ? 2. Les paramtres sont passs dans lordre de leur prsentation de la requte 3. Les paramtres et les valeurs sont passs comme suit : y y y y y [Objet PreparedStatement].setString([index],[objet String]); [Objet PreparedStatement].setBoolean([index],[valeur]); [Objet PreparedStatement].setInt([index],[valeur]); [Objet PreparedStatement].setFloat([index],[valeur]); Etc

4. La requte est excut par executeUpdate() ou executeQuery Exemple : String requete3 = "update employes set prenom = ? where nom = ? "; // se connecter PreparedStatement stm2 = connexion.prepareStatement(requete3); stm2.setString(1, "Blabla"); stm2.setString(2, "Alpha"); stm2.executeUpdate();

Exercice 3 : crire la partie du programme JAVA qui permet de mettre jour le prix unitaire (paramtre ) et la quantit (paramtre) selon le numro de commande (paramtre) de la table commander

Saliha Yacoub

Page13

TypedeparcoursduResultSet
il est possible de parcourir le ResultSet de trois faons diffrentes selon le type de ce dernier. Par dfaut, le parcourt est farward only. ResultSet.TYPE_FORWARD _ONLY : accs squentiel ResultSet.TYPE_SCROLL_INSENSITIVE, accs direct sans modification (les occurrences ne refltent pas les mises jour qui peuvent intervenir durant le parcours) Permet de parcourir les rsultats dans les deux sens. 1. Permet de parcourir les rsultats dans les deux sens grce aux mthodes: y y y y Public boolean next(); public boolean previous(); Public boolean first(); Public boolean last();

2. Permet de connaitre la position courante du curseur lintrieur du ResultSet y y y y Public boolean isBeforFirst(); public boolean isAfterLast(); Public boolean isFirst(); Public boolean isLast();

ResultSet.TYPE_SCROLL_SENSITIVE accs direct avec modification Mme principe que le type prcdent sauf que, lesoccurrences refltent les mises jour qui

peuvent intervenir durant le parcours

ModificationdesdonnesduResultSet:
Par dfaut, un ResultSet contient des donnes en lecture seulement, mais il est possible dobtenir un ResultSet modifiable. ResultSet.CONCUR_READ_ONLY : lecture seule ResultSet.CONCUR_UPDATABLE : mise jour Page14

Saliha Yacoub

Le type de ResultSet et le mode dutilisation (read only ou ubdatable) doit se faire lors de la cration du Statement

Exemple

Statement instruction = connexionBd.getConnexion().createStatement(ResultSet. TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_ READ_ONLY);

Dans le cas dune modification (updatable), voici les oprations pour une mise jour ou une insertion Modifier la valeur du type et de la colonne donne (par indice ou par nom) de lenregistrement actuellement point : y y y y y public void updateString(int indiceCol, String value); public void updateString(String nomCol, String value); public void updateInt(int indiceCol, Int value); public void updateInt(String nomCol, Int value); etc.

Appliquer dans la base de donnes les changements effectus sur lenregistrement actuellement point : public void updateRow();

Exemple ResultSet resultat = state.executeQuery("SELECT nom, age from etudiants"); resultat.next() resultat.updateString("nom", "martin"); resultat .updateInt("age", 28); resultat.updateRow();

Saliha Yacoub

Page15

Dans le cas dune insertion : Aller sur un emplacement vide permettant dinsrer un nouvel enregistrement : public void moveToInsertRow(); Insrer dans la base de donnes lenregistrement actuellement point : public void insertRow();

resultat.moveToInsertRow(); resultat.updateString("nom", "Yanick"); resultat.updateInt("age", 19); resultat.insertRow();

MthodededplacementdansleResultSet
Pour se dplacer lintrieur du ResultSet, on utilisera la mthode next() pour le parcours avant et la mthode previous() pour le parcours inverse. Les autres mthodes sont donnes dans le tableau suivant. Mthode Rle boolen qui indique si la position courante du curseur se trouve avant la premire ligne boolen qui indique si la position courante du curseur se trouve aprs la dernire ligne boolen qui indique si le curseur est positionn sur la premire ligne boolen qui indique si le curseur est positionn sur la dernire ligne dplacer le curseur sur la premire ligne dplacer le curseur sur la dernire ligne

boolean isBeforeFirst()

boolean isAfterLast()

boolean isFirst()

boolean isLast()

boolean first() boolean last()

Saliha Yacoub

Page16

boolean absolute()

dplace le curseur sur la ligne dont le numro est fourni en paramtre partir du dbut si il est positif et partir de la fin si il est ngatif. 1 dplace sur la premire ligne, 1 sur la dernire, -2 sur l'avant dernire ... dplacer le curseur du nombre de lignes fourni en paramtre par rapport la position courante du curseur. Le paramtre doit tre ngatif pour se dplacer vers le dbut et positif pur se dplacer vers la fin. Avant l'appel de cette mthode, il faut obligatoirement que le curseur soit positionn sur une ligne. dplacer le curseur sur la ligne prcdente. Le boolen indique si la premire occurrence est dpasse. dplacer le curseur sur la ligne suivante. Le boolen indique si la dernire occurrence est dpasse. dplacer le curseur aprs la dernire ligne dplacer le curseur avant la premire ligne renvoie le numro de la ligne courante

boolean relative(int)

boolean previous()

Boolean next()

void afterLast() void beforeFirst() int getRow()

Mthodespourobtenirlesdonnesetlastructure
Mthode getInt(int) Rle retourne le contenu de la colonne dont le numro est pass en paramtre sous forme d'entier. retourne le contenu de la colonne dont le nom est pass en paramtre sous forme d'entier.

getInt(String)

Saliha Yacoub

Page17

getFloat(int) getFloat(String) getDate(int) getDate(String) next() Close() getMetaData()

retourne le contenu de la colonne dont le numro est pass en paramtre sous forme de nombre flottant.

retourne le contenu de la colonne dont le numro est pass en paramtre sous forme de date.

se dplace sur le prochain enregistrement : retourne false si la fin est atteinte ferme le ResultSet retourne un objet ResultSetMetaData associ au ResultSet.

TypededonnesJDBC(correspondanceSQLetJAVA)

Type SQL ARRAY BIGINT BINARY BIT BLOB CHAR CLOB DATE DECIMAL DINSTINCT Mthode ResultSet getArray getLong getBytes getBoolean getBlob getString getClob getDate getBigDecimal getTypeDeBase Type Java java.sql.Array long byte[] boolean java.sql.Blob java.lang.String java.sql.Clob java.sql.Date java.math.BigDecimal typeDeBase

Saliha Yacoub

Page18

DOUBLE FLOAT INTEGER JAVA_OBJECT LONGVARBINARY LONGVARCHAR NUMERIC OTHER REAL REF SMALLINT STRUCT TIME TIMESTAMP TINYINT VARBINARY VARCHAR

getDouble getDouble getInt (type)getObject getBytes getString getBigDecimal getObject getFloat getRef getShort (type)getObject getTime getTimestamp getByte getBytes getString

double double int type byte[] java.lang.String java.math.BigDecimal java.lang.Object float java.sql.Ref short type java.sql.Time java.sql.Timestamp byte byte[] java.lang.String

Saliha Yacoub

Page19

Sources : http://en.wikipedia.org/wiki/JDBC_driver#Type_4_Driver_-_Native-Protocol_Driver http://download.oracle.com/javase/tutorial/jdbc/overview/architecture.html Introduction JDBC, de Denis Brunet http://java.developpez.com/

Saliha Yacoub

Page20