Académique Documents
Professionnel Documents
Culture Documents
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.
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.
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);
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
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.
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.
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
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
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();
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()
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()
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
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
Saliha Yacoub
Page20