JDBC 4p
JDBC 4p
JDBC 4p
• Net : protocole fermé, mais: sécurité, performances • “Finesse”: TOUT se télécharge, pas de config locale
• “Epaisseur”: installation, configuration “câblée” • Développement: Java, HTML (voire JavaScript)
• Développement: langage “client”, peu portable Côté serveur :
Côté serveur : • Request Broker: centralise les appels aux services
• Développement: Java
• Net: protocole fermé, mais: répartition, homogénéité
! local: code exécuté par le serveur
• Développement: langage “serveur”, pas portable ! mobile: code stocké dans la BD et envoyé au client
Constat :
• Une API (Application Programming Interface) Java
• Java est de plus en plus utilisé pour développer des applications permettant à un programme d’application en Java d’exécuter
BD en client-serveur (Web, Browser, …) des instructions SQL pour accéder à une base de données
• Besoin d’une API Java pour : relationnelle
• interagir avec des BD relationnelles :
• Une API permettant un accès uniforme à des BD relationnelles :
! exécuter des requêtes SQL
! récupèrer les résultats ! portable sur la plupart des OS
• permettant de standardiser l’accès aux BD : ! indépendant du SGBD (seule la phase de connexion est
! Spécification basée sur X/Open SQL CLI (comme ODBC) spécifique – driver)
Architecture à 2 niveaux :
• Niveau supérieur : API JDBC
! couche visible, nécessaire pour interfacer applications Java et
SGBD
! package java.sql Application JDBC JDBC Driver JDBC Database
• Niveau inférieur : DRIVERS Java API Manager DRIVER server
! implantation des drivers
! interface entre les accès bas niveau au moteur du SGBD et
l'application
• utilisent une partie écrite dans du code spécifique non Java (souvent en
langage C) et appelé par ces implantations
JDBC API JDBC API
• rapides mais doivent être présents sur le poste client car ne peuvent pas
être téléchargés par le ClassLoader de Java (pas des classes Java mais des
librairies dynamiques) JDBC Driver JDBC Driver
• ne peuvent donc pas être utilisés par des applets dans des browsers Manager Manager
classiques : JDCB-ODCB
Pure Java Pure Java
• Classe 1 : JDBC-ODBC bridge driver (pont JDBC-ODBC) Bridge Driver DB Client Lib.
JDBC Driver JDBC Driver
• Classe 2 : Native-API, partly-Java driver (driver faisant appel à des
fonctions natives non Java de l'API du SGBD) ODCB
DB Middleware
Drivers « Java » : Database Database
DB Client Lib. server server
• Classe 3 : Net-protocol, all-Java driver (driver qui permet l'utilisation d'un
middleware qui fait l'interface avec la BD Database
server
• Classe 4 : Native-protocol, all-Java driver (driver écrit entièrement en Database
server Classe 1 Classe 2 Classe 4
Java qui utilise le protocole réseau du SGBD pour accéder à la BD)
Classe 3
JDBC
Bernard ESPINASSE - Introduction à JDBC 13 Bernard ESPINASSE - Introduction à JDBC 14
JDBC
Java.lang.Object Driver Statement Connection ResultSet ResultSetMetaData
DatabaseMetaData
java.util.Date DriverManager DriverPropertyInfo Types PreparedStatement
CallableStatement
Date Time Timestamp
• Driver : renvoie une instance de Connection
• Connection : connexion à une BD
• DriverManager : gère les drivers, lance les connexions aux BD Statement : instruction SQL
• Date : date SQL
•
• Les interfaces du package java.sql
PreparedStatement : instruction SQL paramétrée
• Time : heures, minutes, secondes SQL • CallableStatement : procédure stockée dans la BD
•
•
Les classes du package java.sql
TimeStamp : comme Time, avec une précision à la microseconde
Types : constantes pour désigner les types SQL (conversions)
•
•
ResultSet : n-uplets récupérés par une instruction SQL
ResultSetMetaData
2013-2014 : descriptionBases
desden-uplets
données récupérés 4
• DatabaseMetaData : informations sur la BD
Deuxième étape :
• Récupérer un objet « Connection » en s'identifiant auprès du SGBD
• Préciser la BD utilisée
Etapes suivantes :
• Procédure générale
• A partir de la connexion, créer un « statement » (état) correspondant
• Connexion à la BD
à une requête particulière
• Création de la requête
• Exécuter ce statement au niveau du SGBD
• Exécution de la requête
• Fermer le statement
• Traitement de la requête
• Fermeture de la connexion Dernière étape
• Se déconnecter de la base en fermant la connexion
Il y 3 types d'exécutions différents : • Seules les données demandées sont transférées en mémoire par le driver
• en consultation (requêtes de type SELECT) : JDBC
! avec la méthode executeQuery() • L'interface ResultSet permet d'accéder ligne par ligne au résultat
! qui retourne un ResultSet (n-uplets résultants) retourné par une requête SELECT grâce à ses méthodes :
• en modification (requêtes de type INSERT, UPDATE, DELETE, • méthode booléenne next() : fait avancer le curseur sur la
CREATE TABLE, DROP TABLE) : ligne suivante
! avec la méthode executeUpdate() • Retourne true si le déplacement a été fait, false s'il n'y
avait pas d'autre ligne
! qui retourne un entier (nombre de n-uplets traités)
• Traitement de chaque ligne : while(rs.next()) {// Traitement
• les exécutions de nature indéterminée avec la méthode execute()
de chaque ligne}
Remarques : les méthodes executeQuery() et executeUpdate() de l’interface • méthode booléenne previous() : recule d’une ligne
Statement prennent comme argument la requête SQL à exécuter
• Retourne true si le déplacement a été fait, false s'il n'y
Ex : Statement stmt = connexion.createStatement(); avait pas de ligne précédente
ResultSet rs = stmt.executeQuery("SELECT * FROM auteur WHERE aut_id > 60"); • méthode absolute(int ligne) : se place à la ligne n° ligne
• autres méthodes : first(), last()
• Paramètres de la base :
• La BD s'appelle « test »
• Exécution d'une instruction simple de type UPDATE : Ajouter • Instruction paramétrée de type SELECT : Retourne tous les
une catégorie « céréales » de code 5 dans la table catégories produits de la catégorie ‘céréales’
Statement req; PreparedStatement req;
ResultSet res;
int nb; String nom;
int code;
req = con.createStatement();
req = con.prepareStatement(''select codprod, nomprod
from categorie c, produit p where c.codcat=p.codcat
nb = req.executeUpdate('' and libellecat = ?'');
insert into categories values (5, 'cereales')'');
req.setString(1, ''cereales'');
System.out.println( res = req.executeQuery();
'' nombre de lignes modifiées : ''+nb); while(res.next()) {
code = getInt(1);
req.close(); libelle = getString(2);
System.out.println( '' produit : ''+code +'',''+ libelle); }
req.close();
req.setInt(1, 12);
req.setString(2, ''fruits'');
nb = req.executeUpdate();
req.setInt(1, 13);
req.setString(2, ''légumes'');
nb = req.executeUpdate();
req.close();