Académique Documents
Professionnel Documents
Culture Documents
Dfinition
Package Java pour l'accs aux SGDBR : java.sql API unique daccs tout SGBD conforme au standard SQL-3EntryLevel Permet d'envoyer des requtes SQL (sur le rseau)
SGBDR
Middleware JDBC
P. Graffion / JDBC v1.2 2
Architecture
Java Applets & Applications JDBC API
JDBC Driver Manager
BD Propritaire SGBDR
P. Graffion / JDBC v1.2 3
Pont JDBC-ODBC :
appels JDBC traduits en appels ODBC
requiert linstallation dun driver ODBC sur le client code ODBC natif (C) => ne peut pas tre utilis par une applet "untrusted"
SGBDR
P. Graffion / JDBC v1.2 4
Pont natif (C/C++) => ne peut pas tre utilis par une applet "untrusted" moins ouvert que le pont JDBC-ODBC plus performant
SGBDR
P. Graffion / JDBC v1.2 5
Driver JDBC-Net appels JDBC convertis suivant un protocole rseau gnrique Driver 100% Java => peut tre utilis par une applet "untrusted"
Serveur rseau
protocole DB spcifique
SGBDR
P. Graffion / JDBC v1.2 6
Driver 100% Java ne requiert aucune configuration sur le client interaction directe avec le SGBD via sockets OK pour applet "untrusted" si le SGBD est sur le serveur web
protocole DB spcifique
SGBDR
P. Graffion / JDBC v1.2 7
JDBC-ODBC - Traduit les appels JDBC en ODBC - Appel un driver local qui n'est pas crit en Java
Architecture 3-tier
- JDBC est sur le serveur applicatif - Le Driver reste sur le serveur
IHM Serveur JDBC - ODBC Applicatif Serveur Applicatif
HTTP, RMI, CORBA P. Graffion / JDBC v1.2
SGBDR
Driver ODBC
IHM
JDBC
DB protocol
API DB
API JAVA
Classes de connexion
java.sql.DatabaseMetaData
P. Graffion / JDBC v1.2
Mise en oeuvre
1. Enregistrer le driver JDBC 2. Ouvrir une connexion sur la base 3. Crer la requte (un Statement) 4. Excuter la requte 5. Traiter le rsultat retourn (un ResultSet) 6. Fermer les objets
10
Enregistrement du driver
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
ou
Class.forName("com.mysql.jdbc.Driver");
11
URL JDBC
Exemple : jdbc:odbc://www.xyz.com/employeDB
12
Connexion la base
String dbUrl = "jdbc:mysql://localhost:3306/yaps"; String user = "root", password = ""; Connection conn ; conn = DriverManager.getConnection(dbUrl, user, password);
13
14
15
les colonnes peuvent tre rfrences par leur nom ou leur numro (origine 1) obtention de la valeur dune colonne par get<JavaType>(index|nom)
16
String query = "SELECT nom, age ..."; ResutSet r = st.executeQuery(query); while(r.next()) { String nom = r.getString("nom"); int age = r.getInt(2); // ... }
17
Exemple complet
import java.sql.*; public class PrintAllEmployees { public static void main(String[] args) throws SQLException, ClassNotFoundException { String dbUrl = "jdbc:mysql://localhost:3306/yaps"; String user = "root", password = ""; // Chargement dynamique du driver Class.forName("com.mysql.jdbc.Driver"); // Etablissement de la connexion Connection conn; conn = DriverManager.getConnection(dbUrl, user, password); // Cration d'un statement Statement st = conn.createStatement(); String anSQLquery = "SELECT prenom, nom, age FROM employe "; // Excution de la requte ResultSet r = st.executeQuery(anSQLquery); // Parcours du rsultat while(r.next()) { String nom = r.getString("nom"); int age = r.getInt("age"); System.out.println(nom + ", " + age + " ans"); } r.close(); st.close(); conn.close(); } }
18
19
Dans le cas d une modification de donne (INSERT, UPDATE, DELETE), on utilise la mthode executeUpdate() qui renvoie un entier spcifiant le nombre denregistrements modifis
String reqSql = "DELETE FROM ..."; int n = st.executeUpdate(reqSql)
20
21
d'un PreparedStatement
PreparedStatement pst = conn.prepareStatement(anSQLquery ); // => requte SQL compile par le SGBD // Passage
22
d'un CallableStatement
cst.executeQuery(); // Excution
Transactions
3 services dclars dans l interface Connection : setAutoCommit(boolean b) commit() valide une transaction rollback() annulle une transaction Les nouvelles connexions sont initialement en mode autocommit => commit implicite aprs chaque requte SQL Pour dfinir une transaction compose de plusieurs requtes SQL, il faut dsactiver l auto-commit : conn.setAutoCommit(false) Un appel commit() ou rollback() va alors crer implicitement une nouvelle transaction
P. Graffion / JDBC v1.2 24
Transactions Exemple
// Dsactiver l'auto-commit conn.setAutoCommit(false); try { // les requtes SQL suivantes constituent // une seule transaction st.executeUpdate("INSERT ..."); st.executeUpdate("DELETE ..."); st.executeUpdate("UPDATE ..."); // valider la transaction conn.commit(); st.close(); } catch(java.sql.SQLException e) { conn.rollback(); }
25
Accs au mta-modle
Connection.getMetaData() retourne un DatabaseMetaData permettant de connatre :
la structure de la base : getCatalogs(), getTables(), les types SQL supports : getTypeInfo() une description des procdures stockes : getProcedures() ...
26
CLOB et BLOB
28
Insrer un BLOB
String q = "insert into userImages values('dewez', ?)"; Statement pstmt = con.prepareStatement(q); File file = new File("dewez.jpg"); InputStream fin = new FileInputStream(file); pstmt.setBinaryStream (1, fin, file.length()); pstmt.executeUpdate();
29
Lire un BLOB
String q = "select image from userImages" ResultSet rs = stmt.executeQuery(q); while (rs.next) { Blob b = rs.getBlob("image"); InputStream stream = b.getBinaryStream(); // ... }
30
Versions JDBC
JDBC 1.0 2.0 3.0 4.0 JDK 1.1 1.2 1.4 1.6 nouveaux packages java.sql javax.sql javax.sql.rowset
cf http://java.sun.com/j2se/1.5.0/docs/api/java/sql/packagesummary.html#package_description
P. Graffion / JDBC v1.2 31
JDBC 3.0
32
JDBC 4.0
chargement automatique des drivers JDBC Nouvelles exceptions : SQLSyntaxErrorException, SQLIntegrityConstantViolationException Support XML Utilisation des annotations Java 5
interface LoanAppDetailsQuery extends BaseQuery { @Select("SELECT * FROM LoanDetails where LoanStatus = 'A'") DataSet<LoanApplication> getAllActiveLoans(); }
P. Graffion / JDBC v1.2 33
Points cls
JDBC permet d accder un SGBDR Une application base sur JDBC est indpendante du SGBDR utilis JDBC permet un accs SQL mais nautomatise pas la gestion de la persistance des objets java
34