Interface Java Oracle : JDBC Christine Bonnet Sommaire Démarche globale JDBC --- 6 Accès s en consultation --- 9 Accès s en modification --- 13 Ordres dynamiques --- 19 Procédures stockées --- 24 I-2 Christine Bonnet
JDBC (Java DataBase Connectivity) ) : interface API (Application Programming Interface) permet d exécuter des ordres SQL dans un programme Java I-3 Christine Bonnet Package java.sql Exécution depuis un programme hôte écrit en Java d ordres d SQL reconnus par le noyau de la base de données cible; Gestion des résultats r des requêtes SQL dans le code Java. import java.sql.*; I-4 Christine Bonnet
CONNEXION À ORACLE par ll intermédiaire de JDBC en utilisant une URL (Uniform Resource Locator) Exemple : «jdbc:oracle:thin:@iutainfo:1521:info8i :@iutainfo:1521:info8i» I-5 Christine Bonnet ÉTABLISSEMENT D'UNE CONNEXION 1. Déclaration et chargement du driver : Méthodes de la classe DriverManager public static void registerdriver(driver driver) throws SQLException Exemple : DriverManager.registerDriver(new oracle.jdbc.driver.oracledriver()); I-6 Christine Bonnet
ÉTABLISSEMENT D UNE CONNEXION (SUITE) 2. Connexion à une base locale en utilisant l URL, le nom de l utilisateur, son mot de passe. Méthodes de la classe DriverManager public static Connection getconnection(string url, String user, String password) throws SQLException Exemple : Connection connec = DriverManager.getConnection ("jdbc:oracle:thin:@iutainfo:1521:info8i", :@iutainfo:1521:info8i", "2gr1","2gr1"); if (connec(!= null) System.out.println("Connexion etablie"); I-7 Christine Bonnet 3. Accès à la base : requêtes SQL. 4. Fermeture de la connexion : nomconnexion.close() Exemple : connec.close(); I-8 Christine Bonnet
ACCÈS À LA BASE EN CONSULTATION Création d'un objet de type Statement qui reçoit l ordre l SQL select et l envoie l au SGBD pour exécution. Méthode public Statement createstatement() Statement nomordre = nomconnexion.createstatement(); Création d'un objet de type ResultSet qui reçoit le résultat r de ll exécution de la requête. Méthode public ResultSet executequery(string sql) ResultSet nomresultset = nomordre.executequery("requête SQL select "); I-9 Christine Bonnet EXPLOITATION DES RÉSULTATS Méthode public boolean next() while (nomresultset.next()) ()) { String nom = nomresultset.getstring("ename"); ename"); public String getstring(string columnname). nomordre.close(); nomresultset.close(); nomconnexion.close(); I-10 Christine Bonnet
EXEMPLE import java.sql.*; class JdbcTest { public static void main (String args []) throws SQLException { // Chargement du driver DriverManager.registerDriver (new oracle.jdbc.driver.oracledriver()); // Connexion à une base locale Connection connec = DriverManager.getConnection("jdbc:oracle:thin:@iutainfo: thin:@ :@iutainfo: 1521:info8i", "2gr1", "2gr1"); I-11 Christine Bonnet // Création d'une requête Statement stmt = connec.createstatement (); ResultSet rset = stmt.executequery ("select ename from emp"); // Affichage des noms des employés while (rset.next ()) System.out.println (rset.getstring (1)); // Déconnexion D public String getstring(int columnindex) stmt.close(); rset.close(); connec.close(); I-12 Christine Bonnet
ACCÈS POUR UN ORDRE DDL OU UN ORDRE DML Méthode public Statement createstatement() Statement nomordre = nomconnexion.createstatement(); Statement nomordre = nomconnexion.createstatement(); Méthode public int executeupdate(string sql) int nomvariableresultat = nomordre.executeupdate("requête SQL "); Valeur retournée e : 0 pour un ordre DDL create (ou nombre de tuples créés), 0 pour drop table, le nombre de lignes traitées pour un ordre DML (insert, update, delete). I-13 Christine Bonnet EXEMPLE import java.sql.*; public class Tp2 { public static void main(string[] args) throws SQLException { // connexion DriverManager.registerDriver(new oracle.jdbc.driver.oracledriver()); Connection connec = DriverManager.getConnection("jdbc:oracle:thin:@iutainfo:1521: thin:@ :@iutainfo:1521: info8i","2gr1","2gr1"); // suppression puis création de la table TEmployés Statement stmt0= connec.createstatement(); int r0 = stmt0.executeupdate("drop table TEmployés"); System.out.println("suppression de la table " + r0); Statement stmt= connec.createstatement(); int r1 = =stmt.executeupdate("create create table TEmployés as select * from emp"); System.out.println("creation de la table " + r1); I-14 Christine Bonnet
TP2 question a : moyenne des salaires des employés s ayant le même travail que l'employé n 7369 Statement stmt1= connec.createstatement(); ResultSet rset1 =stmt1.executequery("select avg(sal) from TEmployés where job=(select job from TEmployés where empno=7369)"); while (rset1.next()) System.out.println(rset1.getFloat(1)); I-15 Christine Bonnet TP2 question b : màj du salaire des employés s (sal < moyenne? moyenne_salaire : salaire * 1.1) Statement stmt2= connec.createstatement(); int r2 =stmt2.executeupdate("update TEmployés x set sal = (select decode(least(x.sal,avg(sal)),x.sal,avg(sal avg(sal)), (sal)),x.sal avg(sal ),x.sal*1. 1) from TEmployés where job=x.job) where empno=7369"); System.out.println("nombre de lignes mises a jour " + r2); I-16 Christine Bonnet
// déconnexiond stmt0.close(); stmt.close(); stmt1.close(); stmt2.close(); rset1.close(); connec.close(); // fin classe Tp2 I-17 Christine Bonnet Exécution : suppression de la table 0 création de la table 14 1105.75 nombre de lignes mises a jour 1 Appuyez sur une touche pour continuer... I-18 Christine Bonnet
ORDRES SQL DYNAMIQUES Requête paramétrée e : Utilisation de la méthode m public PreparedStatement preparestatement(string sql) et du caractère re "?" pour représenter la valeur d une d variable PreparedStatement nomordre = nomconnexion.preparestatement("ordre sql contenant des? "); I-19 Christine Bonnet ORDRES SQL DYNAMIQUES (suite) Lecture ou renseignement des variables : Méthode setxxx,, avec XXX type de la variable (String, Int, Float,, Date, ) Exemple : public void setfloat(int parameterindex, float x) nomordre.setxxx(rang, valeur); (rang : position du paramètre dans l ordre l SQL) I-20 Christine Bonnet
EXEMPLE import java.sql.*; class OrdreDyna { public static void main (String args []) throws SQLException { String unnom = "BobLEPONGE"; "; // Chargement du driver Oracle DriverManager.registerDriver (new oracle.jdbc.driver.oracledriver()); // Connexion à une base locale Connection connec = DriverManager.getConnection ("jdbc:oracle:thin:@iutainfo:1521:info8i","2gr1", :@iutainfo:1521:info8i","2gr1", "2gr1"); // création d'une table Statement stmt1 = connec.createstatement(); int r = stmt1.executeupdate("create create table adherent(numad numad number(4) primary key,, nom varchar2(14))"); System.out.println("création de la table " + r); I-21 Christine Bonnet // insertion d'un tuple PreparedStatement insere = connec.preparestatement("insert into adherent values (?,?)"); // renseignement des variables insere.setint(1,123); insere.setstring(2,unnom); // insertion du tuple insere.executeupdate(); // sans argument // lecture de la table Statement stmt2= connec.createstatement(); ResultSet rset1 =stmt2.executequery("select select * from adherent"); while (rset1.next()){ ){ System.out.println( rset1.getint(1)+ "\t"" ); System.out.println( rset1.getstring(2) ); I-22 Christine Bonnet
// DéconnexionD stmt1.close(); stmt2.close(); rset1.close(); connec.close(); Exécution création de la table 0 123 BobLEPONGE Appuyez sur une touche pour continuer... I-23 Christine Bonnet PROCÉDURES STOCKÉES EN JAVA 1. Création de classes Java 2. Chargement des classes Java dans la base de données loadjava user utilisateur/mot_de_passe nomclassejava.class 3. Déploiement des classes Java par la création d'une procédure ou fonction stockée 4. Appel de la fonction, procédure stockée à partir du langage SQL : CALL à l'intérieur d'un bloc PL/SQL à l'intérieur d'un déclencheur directement au niveau de SQL*PLUS I-24 Christine Bonnet