Vous êtes sur la page 1sur 11

Université de Monastir

Institut Supérieur d’Informatique et de Mathématiques


Département Informatique
Introduction
Java => monde des OBJETS
SGBDR => monde des RELATIONS
Chapitre 4. JDBC Un mapping Objet-Relationnel est nécessaire (ORM)
Java DataBase Connectivity
API JDBC
 Accès standardisé aux bases de
données,
Cours Java avancée- MPGL1  Exploitation du SQL (LMD, LDD)
 Support des protocoles réseaux

Année Universitaire: 2023-2024 MME SAMEH HBAIEB-COURS JAVA AVANCEE 2

Introduction Architecture
 JDBC : Java Data Base Connectivity
 API (Application Programming interface) permettant l'accès aux bases de JDBC (Java Database Connectivity) est
données relationnelles dans un programme Java une API permettant un accès simple et
 JDBC fait partie du JDK (Java Development Kit). rapide à un grand nombre de bases de
données.
 Independent du type de la base utilisée (mySQL, Oracle, Postgres ...)
 JDBC est indépendant des BD.
 Toutes les classes et interfaces sont dans le package java.sql :  Il y a un pilote (Driver) par base de
import java.sql.* données.
 Permet de faire tout type de requêtes
Sélection de données dans des tables
Création de tables et insertion d'éléments dans les tables
Gestion des transactions
MME SAMEH HBAIEB-COURS JAVA AVANCEE 3 MME SAMEH HBAIEB-COURS JAVA AVANCEE 4
Présentation générale JDBC JDBC 4 : standard de l’API Java
 Une même application peut utiliser plusieurs pilotes pour accéder à
plusieurs BD
 On doit pouvoir changer de SGBD sans modifier le code de l’application.
 JDBC est composée d'un certain nombre de classes et d'interfaces Java, d'un
gestionnaire de pilotes et des pilotes adéquats.

Classes et interfaces de java.sql


MME SAMEH HBAIEB-COURS JAVA AVANCEE 5 MME SAMEH HBAIEB-COURS JAVA AVANCEE 6

Etapes d’accès à une BD JDBC Drivers


Première étape
◦ Préciser le type de driver que l'on veut utiliser
◦ Driver permet de gérer l'accès à un type particulier de SGBD
 Les pilotes JDBC sont des adaptateurs côté client (installés sur la machine
Deuxième étape
◦ Récupérer un objet « Connection » en s'identifiant auprès du SGBD et en précisant la base client, pas sur le serveur) qui convertissent les requêtes des applications
utilisée
Java en un protocole que le SGBD peut comprendre.
Etapes suivantes
◦ A partir de la connexion, créer un « statement » (état) correspondant à une requête  Il existe 4 types de pilotes JDBC
particulière
◦ Exécuter ce statement au niveau du SGBD
◦ Fermer le statement
Dernière étape
◦ Se déconnecter de la base en fermant la connexion
MME SAMEH HBAIEB-COURS JAVA AVANCEE 7 MME SAMEH HBAIEB-COURS JAVA AVANCEE 8
Type 1. JDBC-ODBC Bridge Driver Type 2. Native API Driver
 Le pilote API natif utilise les bibliothèques côté client de la base de

 Le driver JDBC-ODBC utilise ODBC driver pour se connecter à données.

la base de données. Il convertit les appels de méthode JDBC  Ce pilote convertit les appels de méthode JDBC en appels natifs de

en appels de fonction ODBC. l'API de base de données.


 Afin d'interagir avec différentes bases de données, ce pilote a besoin
 Il s'agit d'un pilote indépendant de la base de données.
de son API locale, il s'agit d'un pilote dépendant de la base de
 Ce pilote de type 1 n’est pas écrit en Java, c’est pourquoi ce
données.
n’est pas un pilote portable.
 Le pilote doit être installé séparément sur les ordinateurs clients
 Il est intégré au JDK, il n'est donc pas nécessaire de l'installer
individuels.
séparément.
 Le pilote de type 2 n’est pas écrit en Java, c’est pourquoi ce n’est pas
un pilote portable
MME SAMEH HBAIEB-COURS JAVA AVANCEE 9 MME SAMEH HBAIEB-COURS JAVA AVANCEE 10

Type 3. Network protocol Driver Type 4. Network protocol Driver


 Le pilote Network Protocol utilise un middleware (serveur
d'applications) qui convertit les appels JDBC directement ou  Le pilote de type 4 est également appelé pilote de protocole natif. Ce
indirectement en protocole de base de données spécifique au pilote interagit directement avec la base de données. Il ne nécessite
fournisseur. Ici, tous les pilotes de connectivité de base de données aucune bibliothèque de base de données native, c'est pourquoi il est
sont présents sur un seul serveur, donc pas besoin d'installation également connu sous le nom de Thin Driver.
individuelle côté client.  Ne nécessite aucune bibliothèque native ni serveur Middleware,
 Les pilotes de type 3 sont entièrement écrits en Java, ce sont donc donc aucune installation côté client ou côté serveur.
des pilotes portables.  Il est entièrement écrit en langage Java, ce sont donc des pilotes
 Aucune bibliothèque côté client n'est requise car le serveur portables.
d'applications peut effectuer de nombreuses tâches telles que
l'audit, l'équilibrage de charge, la journalisation, etc.
MME SAMEH HBAIEB-COURS JAVA AVANCEE 11 MME SAMEH HBAIEB-COURS JAVA AVANCEE 12
Quel pilote utiliser ? Etape 1. Etablir une connexion JDBC
 Classe java.sql.DriverManager
 Dans le cas d’un accès réservé à un seul type de base de données, tel qu'Oracle,
◦ Gestion du contrôle et de la connexion au SGBD
Sybase ou IBM, le type 4 est le pilote adéquat.  Méthodes principales
 Dans le cas d’un accès à plusieurs types de bases de données en même temps, le ◦ static void registerDriver(Driver driver)
◦ Enregistre le driver (objet driver) pour un type de SGBD particulier
type 3 est le pilote adéquat.
◦ Le driver est dépendant du SGBD utilisé
 Les pilotes de type 2 sont utiles dans le cas où les pilotes de type 3 ou de type 4 ne ◦ static Connection getConnection( String url, String user, String password)
◦ Crée une connexion permettant d'utiliser une base
sont pas disponibles dans la BD
◦ url : identification de la base considérée sur le SGBD
 Le pilote de type 1 n’est pas considéré comme un pilote de niveau déploiement et ◦ Format de l'URL est dépendant du SGGB utilisé
est généralement utilisé à des fins de développement et de test. ◦ user : nom de l'utilisateur qui se connecte à la base
◦ password : mot de passe de l'utilisateur

MME SAMEH HBAIEB-COURS JAVA AVANCEE 13 MME SAMEH HBAIEB-COURS JAVA AVANCEE 14

Chargement du driver Création d’un objet Connection


 Il existe 2 méthodes:
1. Class.forName(): Ici, nous chargeons le fichier de classe du pilote en mémoire au
 Après avoir chargé le pilote, établir la connexion comme suit :
moment de l'exécution.  DriverManager.getConnection (url, utilisateur, mot de passe)
Exemple: Class.forName(“oracle.jdbc.driver.OracleDriver”);
 user : nom d'utilisateur à partir duquel l’invite de commande SQL est accessible.
2. DriverManager.registerDriver(): DriverManager est une classe Java intégrée avec
 password : mot de passe à partir duquel l'invite de commande SQL est accessible.
un membre statique appelé registre. Ici, nous appelons le constructeur de la
classe du pilote au moment de la compilation.  Url : Uniform Resource Locator qui est créé comme indiqué ci-dessous :
Exemple: DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver())
String url = “ jdbc:oracle:thin:@localhost:1521:xe”
@localhost est l'adresse IP où BD est stockée
Oracle est la base de données utilisée
1521 est le numéro de port
Thin est le pilote utilisé
xe est le fournisseur de services.

MME SAMEH HBAIEB-COURS JAVA AVANCEE 15 MME SAMEH HBAIEB-COURS JAVA AVANCEE 16
Exemple: Définition d’une classe Etape 2. Déclaration et exécution de la
DatabaseConnection requête (Statement)
package com.jdbc.util;

import java.sql.Connection;  Une fois la connexion établie, il est possible d’interagir avec la BD.
import java.sql.DriverManager;
public static Connection getConnection()
import java.sql.SQLException; {  Les interfaces JDBCStatement, CallableStatement et PreparedStatement
return con;
Serveur où est
public class DatabaseConnection { stockée la BD
} définissent les méthodes qui permettent d'envoyer des commandes SQL et
private static Connection con = null; }
static
{ String url = "jdbc:mysql:// localhost:3306/org";
de recevoir des données de la BD.
String user = "root";
String pass = "root";
driver Nom de la BD  Il faut tout d’abord demander la création du statement:
try {
Class.forName("com.mysql.jdbc.Driver"); suite Statement monInstruction = maConnexion.createStatement( );
con = DriverManager.getConnection(url, user, pass);
}  Ensuite il faut déclarer le code SQL de la requête:
catch (ClassNotFoundException | SQLException e) {
e.printStackTrace(); ResultSet monResultat = monInstruction.executeQuery(maRequête);
} }

MME SAMEH HBAIEB-COURS JAVA AVANCEE 17 MME SAMEH HBAIEB-COURS JAVA AVANCEE 18

Les méthodes d’exécution des requêtes Exemple 1. Select one record


Méthode d’exécution Rôle Type de retour // Main driver method
execute Générique pour n'importe un boolean public static void main(String[] args)
{
quelle expression SQL. true si l'instruction renvoie // Declaring and initializing arguments that
un ResultSet, false sinon // needed to be passed later in getConnection()
String url = "jdbc:mysql://localhost/test";
executeQuery SELECT un ResultSet contenant les String uname = "root";
résultats String pass = "";
executeUpdate INSERT, UPDATE, DELETE, int indiquant le nombre de // Query from the database taken
String query = "select username from Student where id=7";
CREATE, etc tuples (lignes) modifiés // Loading and registering drivers
exécuteBatch Spécifique aux transactions int[] : un tableau d'entiers Class.forName("com.mysqljdbc.Driver");
indiquant le nombre de // Creating an connection object by getConnection() method which is static method
tuples modifiés pour // and returns the instance of Connection class
chaque commande Connection con = DriverManager.getConnection(url, uname, pass);
contenue dans le batch.

MME SAMEH HBAIEB-COURS JAVA AVANCEE 19 MME SAMEH HBAIEB-COURS JAVA AVANCEE 20
Exemple 1. Select one record Exemple 2. Select more records
Statement st = con.createStatement(); public static void main(String[] args) throws Exception
// It returns a tabular structure so we need { // Loading and registering drivers
// ResultSet as it stores chunk of data into structures Class.forName("oracle.jdbc.OracleDriver");
ResultSet rs = st.executeQuery(query); // Establishing a connection
// Now we are having our data in object of ResultSet Connection con = DriverManager( "jdbc:oracle:thin:@localhost:1521:XE",
// which is no more tabular "username", "password");
// Here pointer is lagging with data for which we Statement st = con.createStatement();
// use next() method to take it to next record // Executing the query and storing the result
rs.next(); ResultSet rs = st.executeQuery( "select username from Students where Marks >= 70");
// Here we are fetching username column data // Processing the results
String name = rs.getString("username"); while (rs.next()) {
System.out.println(name); System.out.println(rs.getString(“username"));
// It is good practice to close the connection using close() method }
// Closing the statement first // Closing the connections
st.close(); con.close();
// Now close the connection also }
con.close();
}}

MME SAMEH HBAIEB-COURS JAVA AVANCEE 21 MME SAMEH HBAIEB-COURS JAVA AVANCEE 22

Exploitation des résultats: la classe ResultSet Variante 1


 L’objet de ResultSet maintient un public static void main(String[ ] args) throws SQLException{
curseur pointant vers une ligne d’une …
table. Initialement, le curseur pointe ResultSet monResultat = monInstruction.executeQuery(
avant la première ligne. "select numfilm, titre from film where titre like 'A%'");
while(monResultat.next( )){
 On peut parcourir les lignes de Stringtitre = monResultat.getString("titre");
l’objet ResultSet avec la méthode int numero = monResultat.getInt("numFilm");
next( ). Cette méthode renvoie VRAI System.out.println(numero + "\t" + titre);
s’il reste des lignes à lire et FAUX }

MME SAMEH HBAIEB-COURS JAVA AVANCEE 23 MME SAMEH HBAIEB-COURS JAVA AVANCEE 24
Variante 2 Variante 3
public static void main(String[ ] args) throws SQLException{ public static void main(String[ ] args) throws SQLException{
… …
ResultSet monResultat = monInstruction.executeQuery( ResultSet monResultat = monInstruction.executeQuery(
"select numfilm, titre from film where titre like 'A%'"); "select numfilm, titre from film where titre like 'A%'");
while(monResultat.next( )){ while(monResultat.next( )){
Stringtitre = monResultat.getString(2); for (int c = 1; c <= 2; c++)
int numero = monResultat.getInt(1); System.out.print(monResultat.getString(c) + "\t");
System.out.println(numero + "\t" + titre); System.out.println(" ");
} }
… …
} /*du main*/ } /*du main*

MME SAMEH HBAIEB-COURS JAVA AVANCEE 25 MME SAMEH HBAIEB-COURS JAVA AVANCEE 26

Variante 4 (avec ResultSetMetaData) Interface ResultSetMetaData


 Elle fournit des informations concernant les types et les propriétés des
public static void main(String[ ] args) throws SQLException{
… colonnes d’une instance de ResultSet
ResultSet monResultat = monInstruction.executeQuery(
"select numfilm, titre from film where titre like 'A%'"); • Combien d’attributs contient le ResultSet ?
while(monResultat.next( )){
for (int c = 1; c <= monResultat.getMetaData().getColumnCount(); c++) • Les noms des attributs sont-ils sensibles à la casse ?
System.out.print(monResultat.getString(c) + "\t");
• Est-il possible de rechercher des données dans la colonne de son choix ?
System.out.println(" ");
} • Quel est le nom d’un attribut ?

} /*du main*/ • A quelle table appartient un attribut ?
• De quel type est un attribut ?

MME SAMEH HBAIEB-COURS JAVA AVANCEE 27 MME SAMEH HBAIEB-COURS JAVA AVANCEE 28
Contenu de l’interface ResultSetMetaData Exemple avec ResultSetMetaData
ResultSet monResultat =
monInstruction.executeQuery("select numfilm, titre from film");
ResultSetMetaData rsmd=monResultat.getMetaData();
int nbColonnes = rsmd.getColumnCount();
for(int i=1; i<=nbColonnes; i++){
String nomColonne = rsmd.getColumnName(i);
String nomType = rsmd.getColumnTypeName(i);
System.out.println("La colonne "+i+" est “ +nomColonne+" dont le
nom de type Oracle est “ +nomType);
}

MME SAMEH HBAIEB-COURS JAVA AVANCEE 29 MME SAMEH HBAIEB-COURS JAVA AVANCEE 30

L’interface PreparedStatement Exemple avec PreparedStatement


Créons d’abord la table Users comme suit :
 Elle permet de transférer une seule fois le code SQL d’une requête au
CREATE TABLE users(
serveur de façon à en accélérer l’exécution lorsqu’on veut répéter plusieurs id NUMBER(5),
nom VARCHAR2(100)
fois cette requête (un seule « compilation » et un seul calcul d’un plan de );

requête) Insérons maintenant des enregistrements dans cette table à l’aide du code
suivant: PreparedStatement stmt = conn.prepareStatement("INSERT INTO users
 Elle est utilisée pour exécuter une requête paramétrée values(?,?)");
stmt.setInt(1, 200); //1 : spécifie le premier paramètre de la requête
• Nom de classe : java.sql.PreparedStatement stmt.setString(2, "Alex"); //2 : spécifie le deuxiéme paramètre de la requête
int i = stmt.executeUpdate();
• Classe mère : java.sql.Statement System.out.println(i+" inséré avec succés");
conn.close();
• Sous-classe directe : java.sql.CallableStatement
• Disponible depuis la version 1.1 du JDK
MME SAMEH HBAIEB-COURS JAVA AVANCEE 31 MME SAMEH HBAIEB-COURS JAVA AVANCEE 32
PreparedStatement: Gestion des paramètres
Paramètrage :
nomstatement.setXXX(rang, valeur)
PATRON POUR LA PERSISTANCE DES
Exemples :
setAsciiStream(), setBigDecimal(), setBinaryStream(), setBoolean(), setByte(),
DONNÉES (DATA ACCESS OBJECT:
setBytes(), setDate(), setDouble(), setFloat(), setInt(), setLong(), setNull(),
setObject(), setShort(), setString(), setTime(), setTimestamp(),
DAO)
setUnicodeStream()

MME SAMEH HBAIEB-COURS JAVA AVANCEE 33 MME SAMEH HBAIEB-COURS JAVA AVANCEE 34

Le pattern DAO Principe du pattern DAO


 Proposer, pour les objets métiers : une interface de la gestion de la
 Pattern MVC: est utilisé pour l'interaction entre les couches métiers et
persistance (services CRUD)
présentation
• Create : création d'une nouvelle entité
 Pattern DAO (Data Access Object ): est utilisé pour le modèle, on détaille
• Read/ Retrieve : lire / rechercher des entités
l'implémentation des accès aux données
• Update : modifier une entité
Objectif:
• Delete : supprimer un entité
 Isoler la gestion de la persistance dans des objets spécifiques
 Indépendante de la source de données
 Découpler Métier / Persistance (CRUD)
 Permet de séparer accès aux données (BDD) et objets métiers (POJO : Plain
Old Java Object ).
MME SAMEH HBAIEB-COURS JAVA AVANCEE 35 MME SAMEH HBAIEB-COURS JAVA AVANCEE 36
Exemple d’implémentation DAO Exemple d’implémentation DAO
public class Student {
Create Value Object. private String name;
Data Access Object Interface - This interface defines the private int rollNo;
Student.java public Student(String name, int rollNo){
standard operations to be performed on a model object(s).
this.name = name;
Data Access Object concrete class - This class implements this.rollNo = rollNo;
above interface. This class is responsible to get data from a }
data source which can be database / xml or any other public String getName() {
storage mechanism. return name; }
public void setName(String name) {
Model Object or Value Object - This object is simple POJO this.name = name; }
containing get/set methods to store data retrieved using public int getRollNo() {
DAO class. return rollNo; }
public void setRollNo(int rollNo) {
this.rollNo = rollNo; } }

MME SAMEH HBAIEB-COURS JAVA AVANCEE 37 MME SAMEH HBAIEB-COURS JAVA AVANCEE 38

Exemple d’implémentation DAO Exemple d’implémentation DAO


import java.util.ArrayList;
import java.util.List;
import java.util.List;
Create Data Access Object Create concrete class public class StudentDaoImpl implements StudentDao {
Interface. public interface StudentDao { implementing above interface.
public List<Student> getAllStudents(); //list is working as a database
StudentDao.java public Student getStudent(int rollNo); StudentDaoImpl.java List<Student> students;
public void updateStudent(Student student);
public void deleteStudent(Student student); public StudentDaoImpl(){
} students = new ArrayList<Student>();
Student student1 = new Student("Robert",0);
Student student2 = new Student("John",1);
students.add(student1);
students.add(student2);
}

MME SAMEH HBAIEB-COURS JAVA AVANCEE 39 MME SAMEH HBAIEB-COURS JAVA AVANCEE 40
Exemple d’implémentation DAO Exemple d’implémentation DAO
@Override public class DaoPatternDemo {
public void deleteStudent(Student student) { public static void main(String[] args) {
students.remove(student.getRollNo()); StudentDao studentDao = new StudentDaoImpl();
Create concrete class System.out.println("Student: Roll No " + student.getRollNo() + ", deleted Use the StudentDao to //print all students
implementing above interface. from database"); demonstrate DAO pattern usage. for (Student student : studentDao.getAllStudents()) {
} System.out.println("Student: [RollNo : " + student.getRollNo() + ", Name : "
StudentDaoImpl.java //retrive list of students from the database DaoPatternDemo.java + student.getName() + " ]");
@Override }
public List<Student> getAllStudents() { return students; } //update student
@Override Student student =studentDao.getAllStudents().get(0);
public Student getStudent(int rollNo) { return students.get(rollNo); } student.setName("Michael");
@Override studentDao.updateStudent(student);
public void updateStudent(Student student) { //get the student
students.get(student.getRollNo()).setName(student.getName()); studentDao.getStudent(0);
System.out.println("Student: Roll No " + student.getRollNo() + ", updated in System.out.println("Student: [RollNo : " + student.getRollNo() + ", Name : " +
the database"); } } student.getName() + " ]"); }}

MME SAMEH HBAIEB-COURS JAVA AVANCEE 41 MME SAMEH HBAIEB-COURS JAVA AVANCEE 42

Vous aimerez peut-être aussi