Programmation Java Cours n° 11 Java et bases de données Alain Giorgetti et Françoise Sailhan Laboratoire d'Informatique de l’Université de Franche-Comté Motivations • Conservation des données d'un programme Java sur disque avec un langage d'interrogation adapté • Accès à des bases de données existantes transformation des données en objets pour des traitements complexes ♦ sinon utiliser les langages de SGBD • Cas d'une base de données relationnelle cas le plus fréquent dans la pratique langage de requête SQL normalisé (à 99%) problème : correspondance classe/relation et objet/enregistrement non naturelle ♦ émergence de base de données objet (OODB pour Object Oriented DataBases) Cours n°11 : Java et bases de données - © A. Giorgetti & F. Sailhan, Université de Franche-Comté 2 Contexte Java • JDBC Java DataBase Connectivity Standard de connexion java ♦ Connexions aux autres sources de données ♦ Méthodes Java de lecture-écriture dans la base • OODB Object Oriented DataBase Pas de standard existant, mais quelques concepts communs Différents langages objets supportés (C++, Java) Cours n°11 : Java et bases de données - © A. Giorgetti & F. Sailhan, Université de Franche-Comté 3 JDBC • Java DataBase Connectivity Connexion aux bases de données relationnelles Lectures-écritures dans la base en Java • Bibliothèque de classes Pilotes Requêtes SQL Résultats de requêtes • Packages de l’API JDBC (Java 2) java.sql, javax.sql Cours n°11 : Java et bases de données - © A. Giorgetti & F. Sailhan, Université de Franche-Comté 4 SQL • Structured Query Language Langage structuré d’interrogation des bases de données relationnelles Indépendant des SGBD propriétaires ♦ en réalité, quelques incompatibilités mineures • Requête demande de lecture ou d’écriture dans une BD Cours n°11 : Java et bases de données - © A. Giorgetti & F. Sailhan, Université de Franche-Comté 5 SQL – Quelques exemples • Création d'une table (commune) CREATE TABLE commune(nom char(20), departement char(20)) • Suppression d'une table (commune) DROP TABLE commune • Requête Obtenir la liste des noms et départements de rattachement de chaque commune SELECT nom, departement FROM commune Cours n°11 : Java et bases de données - © A. Giorgetti & F. Sailhan, Université de Franche-Comté 6 Version de l’API JDBC • A partir de J2SE 1.4 (Java 2 standard Edition) donne accès à toute source de données ♦ bases de données relationnelles, feuilles de calcul, fichiers non structurés Accès effectué à travers ♦ un pont JDBC-ODBC grâce au pilote ODBC (Open DataBase Connectivity) qui offre un mode standard de connexion Microsoft ♦ ou un pont entre JDBC et l'interface spécifique de la base de données du vendeur (pilote spécifique) //Technologie JDBC import java.sql.*; import javax.sql.*; ... public class ... Pilote ODBC Pilote spécifique Source de données Cours n°11 : Java et bases de données - © A. Giorgetti & F. Sailhan, Université de Franche-Comté 7 Configuration préliminaire d’ODBC sous Windows • ODBC (Open DataBase Connectivity) Standard de connexion • Préparation sous Microsoft Windows® Créer une BD relationnelle interrogeable en SQL Déclarer une source de données ODBC ♦ s'identifier en tant qu'administrateur ♦ démarrer/Panneau de configuration/Outils d'administration/Sources de données (ODBC) ♦ Onglet « sources de données utilisateur » ♦ choisir le pilote ODBC (par exemple Microsoft Access driver) ♦ ajouter un nom de source de données utilisateur ♦ sélectionner le fichier de la base de données Cours n°11 : Java et bases de données - © A. Giorgetti & F. Sailhan, Université de Franche-Comté 8 Démarche à suivre avec la technologie JDBC (I) • Deux cas (Cas 1) Avec un pilote standard ODBC ♦ Effectuer une configuration préliminaire de ODBC ♦ le pilote ODBC est inclus dans java 2 ♦ c'est une classe du package sun.jdbc.odbc que l'interpréteur Java doit charger dynamiquement Class.forName(sun.jdbc.odbc.JdbcOdbcDriver) (Cas 2) Avec un pilote spécifique fourni par le vendeur/l'éditeur de la base de données ♦ ♦ ♦ ♦ acquérir et installer un pilote JDBC consulter http://servlet.java.sun.com/products/jdbc/drivers charger le pilote JDBC Class.forName(piloteClassName) Cours n°11 : Java et bases de données - © A. Giorgetti & F. Sailhan, Université de Franche-Comté 9 Démarche à suivre avec la technologie JDBC (II) • Se connecter à la source de données Méthode statique de la classe java.sql.DriverManager Cas 1 Connection c=DriverManager.getConnection (jdbc:odbc:sourceDonnees) Cas 2 Connection c=DriverManager.getConnection (jdbc:pilotClassName) Le DriverManager cherche un pilote adapté chargé (par exemple il trouve le pont JDBC-ODBC) • Effectuer les requêtes dans la base de données Cours n°11 : Java et bases de données - © A. Giorgetti & F. Sailhan, Université de Franche-Comté 10 Déclaration du pilote JDBC - exemple import java.sql.*; public class ExempleJDBC{ public static void main(String[] Args) { try { Class.forName("org.gjt.mm.mysql.Driver"); } catch (Exception E) { System.err.println("Pas de pilote !"); } ... connexion et utilisation de la base ... } } Cours n°11 : Java et bases de données - © A. Giorgetti & F. Sailhan, Université de Franche-Comté 11 Connexion à la base de données exemple try { String url = "jdbc:mysql://localhost/dbessai"; Connection con = DriverManager.getConnection( url, "loginUsr", "usrPsswd"); /* … Utilisation de la base de données … */ } catch (SQLException e) { System.err.println(e.getMessage()); } Cours n°11 : Java et bases de données - © A. Giorgetti & F. Sailhan, Université de Franche-Comté 12 Requête en base de données - exemple Statement st = conn.createStatement(); lancement requête SQL ResultSet rs = st.executeQuery( "SELECT nom, departement FROM commune"); while (rs.next()) { extraction (réitérée) du résultat System.out.println("Nom : " + rs.getString(1)); System.out.println(“Département : " + rs.getString(2)); } rs.close(); st.close(); conn.close(); fermeture Cours n°11 : Java et bases de données - © A. Giorgetti & F. Sailhan, Université de Franche-Comté 13 Bases de données orientées objet • DB4O est un système de base de données orienté objet qui fournit un stockage persistant de données complexes ♦ Tableaux, collections, … ♦ Objets, liés ensemble par héritage fournit des fonctionnalités avancées (gestion des transactions, cryptage, réplication, interface utilisateur) se caractérise par une configuration et une maintenance des bases de données facile à effectuer Cours n°11 : Java et bases de données - © A. Giorgetti & F. Sailhan, Université de Franche-Comté 14 Démarche à suivre avec db4o (I) • Configuration d'une OODB Acquérir une distribution de db4o (http://db4o.com) Installer la distribution ♦ Pour db4o avec eclipse : ajouter en tant que librairie les fichiers jar fournis dans la distribution • Utilisation d'une OODB Accéder à une base de donnée existante ou à créer vObjectContainer db = db4o.openFile("chemin/vers/base/fichierBD"); Ajouter une entrée dans la base de données Commune besancon = new ("Besancon", "Doubs"); db.set(besancon); Cours n°11 : Java et bases de données - © A. Giorgetti & F. Sailhan, Université de Franche-Comté 15 Démarche à suivre avec db4o (II) • Requête simple en base de données Commune uneCommune = new Commune(null, null) ObjectSet result = db.get(uneCommune) while (result.hasNext()) { Commune communeRecherchee = result.next(); ...} • Requête complexe en base de données Création d'une requête pour la base de donnée désignée par db Query requete = db.query(); Création d'une contrainte Query.constraint(Commune.class); Query.descend("nom").constraint("Besancon"); objectSet result = query.execute(); • Suppression d'une entrée de la base de données extraction de l’objet de la base de données ObjectSet result = db.get(uneCommune); Commune communeRecherchee = result.next(); suppression de l’objet ObjectSet result = db.deleted(communeRecherchee); Cours n°11 : Java et bases de données - © A. Giorgetti & F. Sailhan, Université de Franche-Comté 16