6 EPU - Génie Biologique (BIMB) [email protected] Programmation Orientée Objet Le Langage JAVA 6 2/16 P.O.O. - Le langage Java Chapitre 6 Accès aux Bases de Données 6 3/16 ● ● Rappels ( 1 ) Base de Données : – Permet de stocker un grand nombre d'informations – Données accessibles simultanément par plusieurs utilisateurs – Gestion de droits d'accès Structure d'une BD : – Données rangées dans des tables (table des pilotes, table des avions) – Enregistrements d'une table identifés (et uniques) grâce à une clé primaire – Possibilité d'avoir les liaisons qui existent entre les tables : clés étrangères (table vols) 6 4/16 ● Rappels (2) Exemple : – Schéma de la base – Contenu de la base 6 5/16 ● ● Rappels (3) 3 types de requêtes : – Requêtes de défnition : défnir/modifer le schéma – Requêtes de modifcation : modifer les données – Requêtes d'interrogation : récupérer certaines données Le langage SQL : – Langage de requêtes, – Utilisé dans de nombreux SGBD, – Peut-être inséré dans de nombreux langages de programmation (PHP, Java, Langage C, … ) 6 6/16 ● Rappels (4) Requêtes de défnition – Création d'une table : CREATE TABLE nomTable ( attr format, … ) – Suppression d'une table : DROP TABLE nomTable – Modifcation du schéma d'une table : ALTER TABLE nomTable ADD attr format ALTER TABLE nomTable MODIFY attr format ALTER TABLE nomTable DROP attr 6 7/16 Rappels (5) ● Requêtes de modifcation – Ajout d'un enregistrement : INSERT INTO nomTable [ (attr, …) ] VALUES ( val, … ) – Suppression d'un enregistrement : DELETE FROM nomTable [ WHERE condition ] – Modifcation des valeurs d'un enregistrement : UPDATE nomTable SET attr = new_Val [ WHERE condition ] 6 8/16 ● Rappels (6) Requêtes d'interrogation – Bloc de base : – Tri des résultats : – Statistiques sur les résultats (dans le SELECT) : SELECT attr, ... FROM nomTable, … [ INNER JOIN table ON Prim = Etr ] [ WHERE condition ] ORDER BY attr [ DESC ], … SUM (attr), AVG (attr), MAX (attr), MIN (attr), COUNT (attr) – Regroupement : GROUP BY attr, … [ HAVING stat/gr ] – Possibilité d'imbriquer les requêtes (dans le WHERE) 6 9/16 ● Rappels (7) Exemples : SELECT Nom, Prenom FROM PILOTES ORDER BY Nom DESC SELECT Type FROM AVIONS WHERE Ville = 'Nice' SELECT Nom FROM PILOTES INNER JOIN VOLS ON NumPil = Pil WHERE NumVol = 'AF100' SELECT COUNT DISTINCT (VilleArrivee) FROM VOLS SELECT Nom FROM PILOTES INNER JOIN VOLS ON NumPil = Pil WHERE Adr = VilleArrivee SELECT Ville FROM AVIONS GROUP BY Ville HAVING COUNT(*) > 1 SELECT DISTINCT Type FROM AVIONS WHERE Cap > ( SELECT AVG(Cap) FROM AVIONS ) SELECT NumVol FROM VOLS WHERE VilleArrivee IN ( SELECT DISTINCT Adr FROM PILOTES ) 6 10/16 ● ● Accès aux BD ( 1 ) La liaison se fait grâce à : – Une interface : Java DataBase Connectivity (JDBC) – Le contenu du package java.sql 4 étapes pour connecter un programme Java à une base de données : 1. Charger le driver correspondant à la BD (SQL, SQLite, …) 2.Ouvrir la connexion avec la BD 3. Exécuter une requête 4.Traiter, éventuellement, le résultat produit par la requête 6 11/16 ● Accès aux BD (2) Etape 1 : Chargement du driver – Le driver = un fchier .jar à récupérer – La commande pour le charger : Class.forName ("nomDriver"); – – Quelques drivers : ● PostGres : "org.postgresql.Driver" ● SQL: "com.microsoft.sqlserver.jdbc.SQLServerDriver" ● SQLite: "org.sqlite.JDBC" ● … Exception levée si driver non trouvé 6 12/16 ● Accès aux BD (3) Etape 2 : Ouverture de la connexion – – Indiquer : ● L'URL de connexion : type de la BD + infos sur la base (nom et port du serveur, nom de la BD) ● Nom de l'utilisateur ● Mot de passe de l'utilisateur La commande pour ouvrir la connexion retourne un objet de type Connection Connection connex= DriverManager.getConnection(url, nom, mdp); – Certaines informations peuvent être facultatives : ● Nom et port du serveur ● Nom et mot de passe de l'utilisateur – Exception levée si ouverture impossible 6 13/16 ● Accès aux BD (4) Etape 3 : Exécution de la requête – Nécessite un objet de type Statement lié à la connexion : Statement st = connex.createStatement() ; – Commande pour exécuter une requête de défnition ou une requête de modifcation : retourne le nombre d'enregistrements qui ont été « touchés » int nb = st.executeUpdate ( "requêteSQL" ) ; – Commande pour exécuter une requête d'interrogation : retourne un objet de type ResultSet qui contient le résultat de la requête : ResultSet rs = st.executeQuery ( "requêteSQL" ) ; 6 14/16 ● Accès aux BD (5) Etape 4 : Traitement du résultat de la requête – – Cas d'une requête de défnition ou de modifcation : ● Retour d'un entier (récupération facultative) Cas d'une requête d'interrogation : ● Retour d'un ensemble de résultats (ResultSet) ● Commande next() pour parcourir l'ensemble : – Renvoie le résultat suivant ou False – Un résultat = un enregistrement i.e plusieurs valeurs pouvant être de types différents et ayant un indice while (rs.next( )) { System.out.println ( rs.getInt (2) ) ; System.out.println ( rs.getString ("attr") ) ; } 6 15/16 Accès aux BD (6) – Possibilité d'avoir des info sur la structure d'un ResultSet : ● Utilisation d'un objet de type ResultSetMetaData ResultSetMetaData rsMeta = rs.getMetaData() ; ● Récupérer le nombre d'attributs rsMeta.getColumnCount() ; ● Récupérer le nom d'un attribut rsMeta.getColumName( i ) ; ● Récupérer le type d'un attribut rsMeta.getColumTypeName( i ) ; ● … 6 16/16 Exemple