JDBC Réaliser en Java un programme client d’une Base de Données Un accès universel aux sources de données IHM Magasin de données Noyau de l’application Programme Client Moteur Programmes de couche intermédiaire (middle-tier software) Programme dorsal (serveur) API JDBC (Java Data Base Connectivity) et pilotes JDBC Type 1 : Source de données compatible ODBC (ACCESS, EXCEL,…) Programme Java Pont JDBC-ODBC Pilote ODBC API ODBC La meilleure solution de connexion Type 4 Programme Java Pilote JDBC Source de données (MySQL, Oracle, PostGres…) Pour le projet GLPOO… Comptoir (base ACCESS) BIG-GROCER Pont JDBC-ODBC Pilote ODBC API ODBC Déclarer la source de données Comptoir au gestionnaire ODBC de Windows (1) Déclarer la source de données Comptoir au gestionnaire ODBC de Windows (2) Déclarer la source de données Comptoir au gestionnaire ODBC de Windows (3) Déclarer la source de données Comptoir au gestionnaire ODBC de Windows (4) La base de données Comptoir import java.sql.*; Un programme client qui se connecte à la base public class EssaiJDBC_ODBC { COMPTOIR public static void main (String [ ] args) { Connection conn = null; try { Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver"); conn = DriverManager.getConnection ("jdbc:odbc:Comptoir","",""); System.out.println ("Connexion etablie avec COMPTOIR"); } catch (Exception e) {System.err.println ("Pas de connexion à COMPTOIR");} finally { if (conn != null) { try { conn.close ( ); System.out.println ("Connexion terminee"); } catch (Exception e) { } } } } } Variante : connexion à une base mySQL try { String url = "jdbc:mysql://localhost/grocer"; Class.forName ("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection (url, "toto", "toto"); System.out.println ("Connexion etablie avec GROCER"); } import java.sql.*; Exécution d’une requête SQL public class EssaiSELECT { public static void main (String [ ] args) { Connection conn = null; try { Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver"); conn = DriverManager.getConnection ("jdbc:odbc:Comptoir","",""); System.out.println ("Connexion etablie avec COMPTOIR"); Statement s = conn.createStatement ( ); s.executeQuery ("SELECT Nom, [N° Employé], [Date de naissance] FROM Employés"); ResultSet rs = s.getResultSet ( ); while (rs.next ( )){ String nomVal = rs.getString ("Nom"); int numéro = rs.getInt("N° Employé"); Date date = rs.getDate("Date de naissance"); System.out.println ("N° Employé : " + numéro + " Nom : " + nomVal + " Date de naissance : " + date);} rs.close ( ); s.close ( ); } catch (Exception e) {System.err.println ("Pb avec SELECT");} finally { if (conn != null) { try { conn.close ( ); System.out.println ("Connexion terminee");} catch (Exception e) {System.err.println ("Pb de fermeture de connexion");}}}}} Résultat du SELECT Exécution d’une instruction SQL Statement s = conn.createStatement ( ); s.executeUpdate ("INSERT INTO Messagers VALUES (4,'La Poste', '01 46 21 32 64')"); s.executeQuery ("SELECT * FROM Messagers"); ResultSet rs = s.getResultSet ( ); while (rs.next ( )){ int numéro = rs.getInt("N° messager"); String nom = rs.getString("Nom du messager"); String tel = rs.getString("Téléphone"); System.out.println ("N° messager : " + numéro + " Société : " + nom + " Téléphone : " + tel); } rs.close ( ); s.close ( ); Affichage graphique d’une table (1) import java.sql.*; Affichage graphique d’une table (2) import java.awt.*; import java.awt.event.*; import javax.swing.*; public class EssaiTableGraphique extends JFrame{ String [ ] [ ] données; public static void main (String [ ] args) { EssaiTableGraphique etg = new EssaiTableGraphique(100); etg.setSize(400,400); etg.show( ); } public EssaiTableGraphique(int nbLignes) { Connection conn = null; try { Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver"); conn = DriverManager.getConnection ("jdbc:odbc:Comptoir","",""); System.out.println ("Connexion etablie avec COMPTOIR"); Statement s = conn.createStatement ( ); s.executeQuery ("SELECT [Nom du produit],[Prix unitaire], [Unités en stock] FROM Produits" ResultSet rs = s.getResultSet ( ); données = new String [nbLignes][3]; int i = 0; while (rs.next ( )){ données[i][0] = rs.getString("Nom du produit"); données[i][1] = rs.getString ("Prix unitaire"); données[i][2] = rs.getString("Unités en stock"); i++; } Affichage graphique d’une table (3) rs.close ( ); s.close ( ); } catch (Exception e) {System.err.println ("Pb SQL");} finally { if (conn != null) { try { conn.close ( ); System.out.println ("Connexion terminee"); } catch (Exception e) { } } } String[ ] nomsColonnes = {"produit", "Prix unitaire", "Quantité en stock"}; JTable table = new JTable(données, nomsColonnes); table.setPreferredScrollableViewportSize(new Dimension(500, 70)); JScrollPane scrollPane = new JScrollPane(table); getContentPane().add(scrollPane, BorderLayout.CENTER); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) { System.exit(0); } }); } } Utilisation de l'éditeur de requête d'ACCESS (1) Sélectionner "Requêtes" dans le panneau de gauche, cliquez sur le bouton "Nouveau" dans la barre d'outils et sélectionnez "Assistant requête simple" Utilisation de l'éditeur de requête d'ACCESS (2) Choisir la table sur laquelle porte la "requête simple" (un SELECT) et sélectionner les champs visés par la requête Utilisation de l'éditeur de requête d'ACCESS (3) Choisissez une requête détaillée, puis "Modifier la structure" Utilisation de l'éditeur de requête d'ACCESS (4) Ajoutez vos contraintes sur les valeurs des champs (comme sous EXCEL avec les "zones de critères" pour les "filtrages élaborés") Utilisation de l'éditeur de requête d'ACCESS (5) Déroulez le menu "Affichage" de la fenêtre principale d'ACCESS et choisissez l'item "Mode SQL"…vous n'avez plus qu'à copier le code SQL dans votre code Java…