Développement Web - JDBC Développement Web - JDBC Jean-Michel Richer [email protected] http://www.info.univ-angers.fr/pub/richer M1/M2 Informatique 2010-2011 1 / 32 Développement Web - JDBC Plan Plan 1 Préambule 2 Utilisation de JDBC 3 Outils 2 / 32 Développement Web - JDBC Préambule Préambule Préambule 3 / 32 Développement Web - JDBC Préambule Utilisation de JDBC Objectifs • découvrir et apprendre à utiliser JDBC (Java DataBase Connectivity) • utilisation avec MySQL • utilisation avec HSQLDB 4 / 32 Développement Web - JDBC Préambule A quoi sert JDBC ? Definition (JDBC) • Java DataBase Connectivity introduit par SUN en 1996 • permet de dialoguer avec un DBMS (DataBase Management System) • au travers d’une API (Application Programming Inteface) • grâce au langage SQL (Structured Query Language) 5 / 32 Développement Web - JDBC Préambule Drivers Definition (JDBC Drivers) Les Drivers (pilotes) permettent l’échange d’information entre Java et le DBMS. Il existe 4 catégories de Drivers : • Type 1 : JDBC-ODBC bridge drivers • Type 2 : Native-API partly Java drivers • Type 3 : Net-protocol All-Java drivers • Type 4 : Native-protocol All-Java drivers 6 / 32 Développement Web - JDBC Préambule Drivers Types de pilotes • Type 1 : traduit JDBC en ODBC et utilise le pilote ODBC pour communiquer avec le DBMS • Type 2 : pilote écrit en Java et dans un langage natif (C/C++) qui communique avec l’API du DBMS • Type 3 : pilote en Java qui communique au travers d’un serveur qui communique avec le DBMS • Type 4 : pilote en Java qui communique avec le DBMS Rappel : ODBC (Open Database Connectivity) 7 / 32 Développement Web - JDBC Utilisation de JDBC Utilisation de JDBC Utilisation de JDBC 8 / 32 Développement Web - JDBC Utilisation de JDBC Fonctionnement Fonctionnement 1 établir une connexion avec la base de données (DriverManager ) 2 construire et exécuter une requête (Statement ou PreparedStatement) 3 traiter le résultat (ResultSet) 9 / 32 Développement Web - JDBC Utilisation de JDBC Connexion à la base de données URL et Connexion • on réalise la connexion au travers d’une URL jdbc:nom du protocole:URL BD • des exceptions sont levées en cas de problème : SQLException, ClassNotFound 10 / 32 Développement Web - JDBC Utilisation de JDBC Exemple de connexion Connexion pour MySQL 1 try { 2 String dbURL = "jdbc:mysql://localhost/dbpersons"; 3 // Avant JDBC 4.0 4 Class.forName("com.mysql.jdbc.driver"); 5 Connection connection = DriverManager.getConnection( 6 7 dbUrl, "login", "password"); 8 9 } catch(Execption e) { 10 e.printStackTrace(); 11 } 11 / 32 Développement Web - JDBC Utilisation de JDBC Autres pilotes Autres pilotes • JDBC-ODBC : sun.jdbc.odbc.JdbcOdbcDriver • MySQL : com.mysql.jdbc.Driver • DB2 : com.ibm.db2.jcc.DB2Driver • HSQLDB : org.hsqldb.jdbc.JDBCDriver 12 / 32 Développement Web - JDBC Utilisation de JDBC java.sql.Statement java.sql.Statement • modélise une requête SQL • executeQuery(String query) : execute la requête et retourne un ResultSet (SELECT) • executeUpdate(String query) renvoie le nombre de lignes modifiées (INSERT, DELETE, UPDATE) • execute(String query) à utiliser dans les deux cas 13 / 32 Développement Web - JDBC Utilisation de JDBC java.sql.PreparedStatement Fonctionnement d’un Statement • consiste à mettre en place un plan d’accès aux tables • coûteux ! • la classe PreparedStatement optimise les traitements en permettant d’établir une seule fois le plan d’accès • pour l’exécution de plusieurs requêtes 14 / 32 Développement Web - JDBC Utilisation de JDBC java.sql.PreparedStatement Sans PreparedStatement 1 2 3 4 5 6 7 8 9 10 Statement st= connection.createStatement(); for (Person p : list) { // same request but generates access plan st.executeUpdate("UPDATE persons "+ "SET pe name=’"+p.getName()+"’ "+ "WHERE pe id="+p.getId(); } st.close(); 15 / 32 Développement Web - JDBC Utilisation de JDBC java.sql.PreparedStatement Utilisation • on utilise ? pour représenter un champ • les méthodes setXXX(int, Object) pour le renseigner Avec PreparedStatement 1 2 3 4 5 6 7 8 9 10 PreparedStatement st = connection.prepareStatement( "UPDATE persons SET pe name=? WHERE pe id=?" ); for (Person p : list) { st.setString(1, p.getName()); st.setInt(2, p.getId()); st.execute(); } st.close(); 16 / 32 Développement Web - JDBC Utilisation de JDBC java.sql.ResultSet java.sql.ResultSet • permet le traitement des résultats • représente un ensemble de résultats (lignes) extraites de la BD • on itère au travers du container grâce à next() • on récupère les colonnes grâces aux méthodes : • getXXX(int columnIndex) • getXXX(String columnName) • avec XXX = Int, String, Float, Long, Date, Timestamp 17 / 32 Développement Web - JDBC Utilisation de JDBC java.sql.ResultSet Utilisation de ResultSet 1 2 3 4 5 6 7 8 9 10 Statement st = connection.createStatement(); ResultSet rs = st.executeQuery("SELECT * FROM persons"); while (rs.next()) { Persons p = new Persons(); p.setId( rs.getInt("pe id") ); // or p.setId( rs.getInt(1) ); p.setId( rs.getName("pe name") ); // or p.setId( rs.getName(2) ); list.add(p); } 18 / 32 Développement Web - JDBC Utilisation de JDBC Les Transactions JDBC et transactions • JDBC permet de gérer les transactions • désactiver la validation automatique : connection.setAutoCommit(false) • effectuer des requêtes • valider : connection.commit() • ou invalider : connection.rollback() 19 / 32 Développement Web - JDBC Outils Outils Outils 20 / 32 Développement Web - JDBC Outils MySQL MySQL Pour communiquer avec le serveur MySQL : • télécharger depuis www.mysql.com : JDBC Driver for MySQL (Connector/J) • installer le .jar dans WEB-INF/lib (mysql-connector) • pilote : com.mysql.jdbc.driver • url : jdbc:mysql://localhost/db 21 / 32 Développement Web - JDBC Outils DBMS en mémoire DBMS en mémoire • à utiliser pour le debugging • parfois pas réellement compatible SQL • plus ou moins facile à installer et utiliser (ex : HSQLDB) exemples : • HSQLDB • Derby (Apache DB) 22 / 32 Développement Web - JDBC Outils HSQLDB Hyper SQL DB Caractéristiques de HSQLDB : • DBMS écrit en Java • réside en mémoire • lors de l’arrêt du serveur on écrit les données dans un fichier 23 / 32 Développement Web - JDBC Outils HSQLDB HSQLDB Pour communiquer avec le serveur HSQLDB : • télécharger sur www.hsqldb.org • installer hsqldb.jar dans WEB-INF/lib • pilote : org.hsqldb.jdbc.JDBCDriver • url : jdbc:hsqldb:hsql://localhost/db 24 / 32 Développement Web - JDBC Outils HSQLDB Création du script Créer le script suivant et sauver dans a.script : CREATE MEMORY TABLE PUBLIC.PERSONS( PE_ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 1) NOT NULL PRIMARY KEY, PE_FIRST_NAME VARCHAR(20), PE_LAST_NAME VARCHAR(20) ) 25 / 32 Développement Web - JDBC Outils HSQLDB création de la base de données Dans le répertoire du projet • créer un sous-répertoire hsqldb • cd hsqldb • lancer java -cp hsqldb.jar org.hsqldb.util.DatabaseManagerSwing • puis utiliser pour la connexion : jdbc:hsqldb:file:dbpersons 26 / 32 Développement Web - JDBC Outils HSQLDB création de la base de données • choisir File, Open Script • télécharger a.script • puis cliquer sur Execute SQL • quitter le programme 27 / 32 Développement Web - JDBC Outils HSQLDB - Lancer le serveur HSQLDB java -cp hsqldb.jar org.hsqldb.server.Server --database.0 file:hsqldb/dbpersons --dbname.0 dbpersons • nom de la base : --dbname • fichier de configuration : data/dbpersons 28 / 32 Développement Web - JDBC Outils HSQLDB - Lancer le serveur Fichier de configuration : data/dbpersons.script 1 CREATE USER SA PASSWORD ’’ 2 CREATE USER PERSUSER PASSWORD ’PERSPASS’ 3 CREATE SCHEMA PUBLIC AUTHORIZATION DBA 4 SET SCHEMA PUBLIC 5 CREATE MEMORY TABLE PUBLIC.PERSONS(PE ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 1) 6 NOT NULL PRIMARY KEY,PE FIRST NAME VARCHAR(20),PE LAST NAME VARCHAR(20)) 7 GRANT DBA TO SA 8 GRANT SELECT ON TABLE PUBLIC.PERSONS TO PERSUSER 9 29 / 32 Développement Web - JDBC Outils HSQLDB - Lancer le client HSQLDB java -cp hsqldb.jar org.hsqldb.util.DatabaseManagerSwing se connecter avec : • jdbc:hsqldb:hsql://localhost/dbpersons • login : SA • mot de passe : vide utiliser les mêmes paramètres pour la connection JDBC 30 / 32 Développement Web - JDBC Outils HSQLDB - Fermer le serveur HSQLDB • lancer java -cp hsqldb.jar org.hsqldb.util.DatabaseManagerSwing • se connecter avec jdbc:hsqldb:hsql://localhost/dbpersons • login : SA • mot de passe : vide • exécuter la requête SQL : SHUTDOWN 31 / 32 Développement Web - JDBC Outils Fin Fin 32 / 32