achref el mouelhi - lis-lab.fr · java: gerer une base de donn´ ees avec jdbc´ achref el mouelhi...

47
Java :g´ erer une base de donn´ ees avec JDBC Achref El Mouelhi Docteur de l’universit ´ e d’Aix-Marseille Chercheur en programmation par contrainte (IA) Ing ´ enieur en g ´ enie logiciel [email protected] H & H: Research and Training 1 / 41

Upload: others

Post on 18-Sep-2020

23 views

Category:

Documents


13 download

TRANSCRIPT

Page 1: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

Java : gerer une base de donnees avec JDBC

Achref El Mouelhi

Docteur de l’universite d’Aix-MarseilleChercheur en programmation par contrainte (IA)

Ingenieur en genie logiciel

[email protected]

H & H: Research and Training 1 / 41

Page 2: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

Plan

1 Introduction

2 Utilisation

3 Transactions

4 Restructuration du codeClasses connexion et daoDataSource et fichier de proprietes

H & H: Research and Training 2 / 41

Page 3: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Introduction

JDBC

Pour se connecter a une base de donnees

Il nous faut un JDBC (qui varie selon le SGBD utilise)

JDBC : Java DataBase Connectivity

SGBD : Systeme de Gestion de Bases de donnees

JDBC?

Une API (interface d’application) creee par Sun Microsystems

Il permet d’acceder aux bases de donnees en utilisant un driverJDBC

H & H: Research and Training 3 / 41

Page 4: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Introduction

JDBC

Pour se connecter a une base de donnees

Il nous faut un JDBC (qui varie selon le SGBD utilise)

JDBC : Java DataBase Connectivity

SGBD : Systeme de Gestion de Bases de donnees

JDBC?

Une API (interface d’application) creee par Sun Microsystems

Il permet d’acceder aux bases de donnees en utilisant un driverJDBC

H & H: Research and Training 3 / 41

Page 5: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Introduction

JDBC

JDBC 8.0.13

Aller surhttps://dev.mysql.com/downloads/file/?id=480292

Telecharger et Decompresser l’archive .zip

H & H: Research and Training 4 / 41

Page 6: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Introduction

JDBC

Integrer le driver dans votre projet

Faire un clic droit sur le nom du projet et aller dans New >Folder

Renommer le repertoire lib puis valider

Copier le .jar de l’archive decompressee dans lib

H & H: Research and Training 5 / 41

Page 7: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Introduction

JDBCAjouter JDBC au path du projet

Faire clic droit sur .jar qu’on a place dans lib

Aller dans Build Path et choisir Add to Build Path

Ou aussi

Faire clic droit sur le projet dans Package Explorer et aller dans PropertiesProperties

Dans Java Build Path, aller dans l’onglet Libraries

Cliquer sur Add JARs

Indiquer le chemin du .jar qui se trouve dans le repertoire lib du projet

Appliquer

Verifier qu’une section Referenced Libraries a apparu.

H & H: Research and Training 6 / 41

Page 8: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Introduction

JDBCAjouter JDBC au path du projet

Faire clic droit sur .jar qu’on a place dans lib

Aller dans Build Path et choisir Add to Build Path

Ou aussi

Faire clic droit sur le projet dans Package Explorer et aller dans PropertiesProperties

Dans Java Build Path, aller dans l’onglet Libraries

Cliquer sur Add JARs

Indiquer le chemin du .jar qui se trouve dans le repertoire lib du projet

Appliquer

Verifier qu’une section Referenced Libraries a apparu.

H & H: Research and Training 6 / 41

Page 9: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Introduction

JDBCAjouter JDBC au path du projet

Faire clic droit sur .jar qu’on a place dans lib

Aller dans Build Path et choisir Add to Build Path

Ou aussi

Faire clic droit sur le projet dans Package Explorer et aller dans PropertiesProperties

Dans Java Build Path, aller dans l’onglet Libraries

Cliquer sur Add JARs

Indiquer le chemin du .jar qui se trouve dans le repertoire lib du projet

Appliquer

Verifier qu’une section Referenced Libraries a apparu.

H & H: Research and Training 6 / 41

Page 10: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Utilisation

JDBC

Avant de commencer, voici le script SQL qui permet de creer la base dedonnees utilisee dans ce cours

CREATE DATABASE jdbc;

USE jdbc;

CREATE TABLE personne(num INT PRIMARY KEY AUTO_INCREMENT,nom VARCHAR(30),prenom VARCHAR(30));

SHOW TABLES;

INSERT INTO personne (nom, prenom) VALUES ("Wick", "John"),("Dalton", "Jack");

SELECT * FROM personne;

H & H: Research and Training 7 / 41

Page 11: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Utilisation

JDBC

Trois etapes

Charger le driver JDBC (pour MySQL dans notre cas)

Etablir la connexion avec la base de donnees

Creer et executer des requetes SQL

H & H: Research and Training 8 / 41

Page 12: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Utilisation

JDBC

Avant de commencerTous les imports de ce chapitre sont de java.sql.*;

H & H: Research and Training 9 / 41

Page 13: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Utilisation

JDBCChargement du driver 5

try {Class.forName("com.mysql.jdbc.Driver");

}catch (ClassNotFoundException e) {

System.out.println(e.getMessage());}

Chargement du driver 8

try {Class.forName("com.mysql.cj.jdbc.Driver");

}catch (ClassNotFoundException e) {

System.out.println(e.getMessage());}

H & H: Research and Training 10 / 41

Page 14: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Utilisation

JDBC

Se connecter a la base de donnees

Il faut specifier l’URL (de la formejdbc:mysql://hote:port/nombd)

hote : le nom de l’hote sur lequel le serveur MySQL est installe(dans notre cas localhost ou 127.0.0.1)

port : le port TCP/IP utilise par defaut par MySQL est 3306

nombd : le nom de la base de donnees MySQL

Il faut aussi le nom d’utilisateur et son mot de passe (quipermettent de se connecter a la base de donnees MySQL)

H & H: Research and Training 11 / 41

Page 15: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Utilisation

JDBC

Connexion a la base

String url = "jdbc:mysql://localhost:3306/jdbc";String user = "root";String password = "";Connection connexion = null;try {

connexion = DriverManager.getConnection(url, user, password);} catch (SQLException e) {

e.printStackTrace();}finally {

if (connexion != null)try {

connexion.close();} catch (SQLException ignore) {

ignore.printStackTrace();}

}

H & H: Research and Training 12 / 41

Page 16: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Utilisation

JDBC

En cas de probleme avec le chargement du driver, modifier l’URLde connexion ainsi :

String url ="jdbc:mysql://localhost:3306/jdbc?useSSL=false&

serverTimezone=UTC";

H & H: Research and Training 13 / 41

Page 17: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Utilisation

JDBCPreparation et execution de la requete

// creation de la requete (statement)Statement statement = connexion.createStatement();

// Preparation de la requeteString request = "SELECT * FROM Personne;";

// Execution de la requeteResultSet result = statement.executeQuery(request);

On utilise

executeQuery() pour les requetes de lecture : select.

executeUpdate() pour les requetes d’ecriture : insert,update, delete et create.

H & H: Research and Training 14 / 41

Page 18: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Utilisation

JDBCPreparation et execution de la requete

// creation de la requete (statement)Statement statement = connexion.createStatement();

// Preparation de la requeteString request = "SELECT * FROM Personne;";

// Execution de la requeteResultSet result = statement.executeQuery(request);

On utilise

executeQuery() pour les requetes de lecture : select.

executeUpdate() pour les requetes d’ecriture : insert,update, delete et create.

H & H: Research and Training 14 / 41

Page 19: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Utilisation

JDBC

Recuperation des donnees

while (result.next()) {// on indique chaque fois le nom de la colonne

et le typeint num = result.getInt("num");String nom = result.getString("nom");String prenom = result.getString("prenom");System.out.println(num + " " + nom + " " +

prenom);}

H & H: Research and Training 15 / 41

Page 20: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Utilisation

JDBC

On peut faire aussi

while (result.next()) {// on peut indiquer aussi l’index de la colonne

et le typeint idPersonne = result.getInt(1);String nom = result.getString(2);String prenom = result.getString(3);

// pareil pour tous les autres attributsSystem.out.println(nom + " " + prenom);

}

H & H: Research and Training 16 / 41

Page 21: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Utilisation

JDBC

Pour faire une insertion

Statement statement = connexion.createStatement();String request = "INSERT INTO Personne (nom,prenom)

VALUES (’Wick’,’John’);";int nbr = statement.executeUpdate(request);if (nbr ! = 0)

System.out.println("insertion reussie");

La methode executeUpdate() retourne

0 en cas d’echec de la requete d’insertion, et 1 en cas de succes

le nombre de lignes respectivement mises a jour ou supprimees

H & H: Research and Training 17 / 41

Page 22: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Utilisation

JDBC

Pour faire une insertion

Statement statement = connexion.createStatement();String request = "INSERT INTO Personne (nom,prenom)

VALUES (’Wick’,’John’);";int nbr = statement.executeUpdate(request);if (nbr ! = 0)

System.out.println("insertion reussie");

La methode executeUpdate() retourne

0 en cas d’echec de la requete d’insertion, et 1 en cas de succes

le nombre de lignes respectivement mises a jour ou supprimees

H & H: Research and Training 17 / 41

Page 23: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Utilisation

JDBCPour recuperer la valeur de la cle primaire auto-generee

Statement statement = connexion.createStatement();String request = "INSERT INTO Personne (nom,prenom) VALUES (’

Wick’,’John’);";

// on demande le renvoi des valeurs attribuees a la cleprimaire

statement.executeUpdate(request,Statement.RETURN_GENERATED_KEYS);

// on parcourt les valeurs attribuees a l’ensemble de tuplesajoutes

ResultSet resultat = statement.getGeneratedKeys();

// on verifie s’il contient au moins une valeurif (resultat.next()) {

System.out.println("Le numero genere pour cette personne :" + resultat.getInt(1));

}

H & H: Research and Training 18 / 41

Page 24: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Utilisation

JDBC

Pour eviter les injections SQL, il faut utiliser les requetes preparees(pour la consultation, l’ajout, la suppression et la modification)

String request = "INSERT INTO Personne (nom,prenom)VALUES (?,?);";

PreparedStatement ps = connexion.prepareStatement(request,PreparedStatement.RETURN_GENERATED_KEYS);

ps.setString(1, "Wick");ps.setString(2, "John");ps.executeUpdate();ResultSet resultat = ps.getGeneratedKeys();if (resultat.next())

System.out.println("Le numero genere pour cettepersonne : " + resultat.getInt(1));

Attention a l’ordre des attributs

H & H: Research and Training 19 / 41

Page 25: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Utilisation

JDBC

Pour eviter les injections SQL, il faut utiliser les requetes preparees(pour la consultation, l’ajout, la suppression et la modification)

String request = "INSERT INTO Personne (nom,prenom)VALUES (?,?);";

PreparedStatement ps = connexion.prepareStatement(request,PreparedStatement.RETURN_GENERATED_KEYS);

ps.setString(1, "Wick");ps.setString(2, "John");ps.executeUpdate();ResultSet resultat = ps.getGeneratedKeys();if (resultat.next())

System.out.println("Le numero genere pour cettepersonne : " + resultat.getInt(1));

Attention a l’ordre des attributs

H & H: Research and Training 19 / 41

Page 26: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Transactions

JDBC

Les transactions

ensemble de requete SQL

appliquant le principe soit tout (toutes les requete SQL) soit rien

activees par defaut avec MySQL

pouvant etre desactivees et gerees par le developpeur

H & H: Research and Training 20 / 41

Page 27: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Transactions

JDBC

Pour desactiver l’auto-commit

connection.setAutoCommit(false);

Pour valider une transaction

connection.commit(false);

Pour annuler une transaction

connection.rollback(false);

H & H: Research and Training 21 / 41

Page 28: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Transactions

JDBCExemple avec les transactions

// desactiver l’auto-commitconnexion.setAutoCommit(false);

String request = "INSERT INTO Personne (nom,prenom) VALUES(?,?);";

PreparedStatement ps = connexion.prepareStatement(request,PreparedStatement.RETURN_GENERATED_KEYS);

ps.setString(1, "Wick");ps.setString(2, "John");ps.executeUpdate();

// valider l’insertionconnexion.commit();

ResultSet resultat = ps.getGeneratedKeys();if (resultat.next())

System.out.println("Le numero genere pour cette personne :" + resultat.getInt(1));

H & H: Research and Training 22 / 41

Page 29: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Restructuration du code Classes connexion et dao

JDBC

Organisation du code

Il faut mettre toutes les donnees (url, nomUtilisateur,motDePasse...) relatives a notre connexion dans une classeconnexion

Pour chaque table de la base de donnees, on cree une classejava ayant comme attributs les colonnes de cette table

Il faut mettre tout le code correspondant a l’acces aux donnees(de la base de donnees) dans des nouvelles classes et interfaces(qui constitueront la couche DAO : Data Access Object)

H & H: Research and Training 23 / 41

Page 30: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Restructuration du code Classes connexion et dao

La classe MyConnection

package org.eclipse.config;public class MyConnection {private static String url = "jdbc:mysql://localhost:3306/jdbc?useSSL=

false&serverTimezone=UTC";private static String utilisateur = "root";private static String motDePasse = "";private static Connection connexion = null;private MyConnection() {

try {Class.forName("com.mysql.cj.jdbc.Driver");connexion = DriverManager.getConnection( url, utilisateur,

motDePasse );} catch ( Exception e ) {

e.printStackTrace();}

}public static Connection getConnection() {

if (connexion == null) {new MyConnection();

}return connexion;

}

H & H: Research and Training 24 / 41

Page 31: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Restructuration du code Classes connexion et dao

JDBC

La classe MyConnection (suite)

public static void stop() {if (connexion != null) {try {connexion.close();

} catch (SQLException e) {e.printStackTrace();

}}

}}

H & H: Research and Training 25 / 41

Page 32: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Restructuration du code Classes connexion et dao

JDBC

La classe Personne

package org.eclipse.model;

public class Personne{

private int num;private String nom;private String prenom;

// + getters + setters + constructeur sans parametre + constructeur avec 2 parametres nom etprenom + constructeur avec 3 parametres

}

H & H: Research and Training 26 / 41

Page 33: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Restructuration du code Classes connexion et dao

JDBC

L’interface PersonneDao

package org.eclipse.dao;

import java.util.List;

import org.eclipse.model.Personne;

public interface PersonneDao {Personne save(Personne personne);void remove(Personne personne);Personne update(Personne personne);Personne findById(int id);List<Personne> getAll();

}

H & H: Research and Training 27 / 41

Page 34: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Restructuration du code Classes connexion et dao

La classe PersonneDaoImpl definie dans org.eclipse.dao

public class PersonneDaoImpl implements PersonneDao {@Overridepublic Personne save(Personne personne) {

Connection c = MyConnection.getConnection();if (c != null) {

try {PreparedStatement ps = c.prepareStatement("insert into

personne (nom,prenom) values (?,?); ", PreparedStatement.RETURN_GENERATED_KEYS);

ps.setString(1, personne.getNom());ps.setString(2, personne.getPrenom());ps.executeUpdate();ResultSet resultat = ps.getGeneratedKeys();if (resultat.next()) {personne.setNum(resultat.getInt(1));return personne;

}} catch (SQLException e) {e.printStackTrace();

}}return null;

}

H & H: Research and Training 28 / 41

Page 35: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Restructuration du code Classes connexion et dao

Exemple de la methode save en utilisant les transactions

public Personne save(Personne personne) {Connection c = MyConnection.getConnection();if (c != null) {

try {c.setAutoCommit(false);PreparedStatement ps = c.prepareStatement("insert into

personne (nom,prenom) values (?,?); ", PreparedStatement.RETURN_GENERATED_KEYS);

ps.setString(1, personne.getNom());ps.setString(2, personne.getPrenom());ps.executeUpdate();ResultSet resultat = ps.getGeneratedKeys();if (resultat.next()) {c.commit();personne.setNum(resultat.getInt(1));return personne;

}} catch (SQLException e) {e.printStackTrace();

}}return null;

}

H & H: Research and Training 29 / 41

Page 36: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Restructuration du code Classes connexion et dao

JDBCLa classe PersonneDaoImpl (suite)

@Overridepublic Personne findById(int id) {

Personne personne = null;Connection c = MyConnection.getConnection();if (c != null) {

try {PreparedStatement ps = c.prepareStatement("select * from

personne where num = ?; ");ps.setInt(1, id);ResultSet r =ps.executeQuery();if (r.next())personne = new Personne(r.getInt("num"),r.getString("nom"),r.

getString("prenom"));} catch (SQLException e) {e.printStackTrace();

}}return personne;

}}

Il faut implementer toutes les methodes de l’interface PersonneDao

H & H: Research and Training 30 / 41

Page 37: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Restructuration du code Classes connexion et dao

Le Main pour tester toutes ces classes

package org.eclipse.classes;

import org.eclipse.dao.PersonneDaoImpl;import org.eclipse.model.Personne;

public class Main {

public static void main(String args []) {

PersonneDaoImpl personneDaoImpl = new PersonneDaoImpl();Personne personne = new Personne ("Wick","John");Personne insertedPersonne = personneDaoImpl.save(personne);

if (insertedPersonne != null)System.out.println("personne numero " + insertedPersonne.

getNum() + " a ete inseree");elseSystem.out.println("probleme d’insertion");

}}

H & H: Research and Training 31 / 41

Page 38: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Restructuration du code Classes connexion et dao

JDBC

Remarque

N’oublions pas d’implementer les quatre autres methodes del’interface Dao

H & H: Research and Training 32 / 41

Page 39: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Restructuration du code Classes connexion et dao

JDBC

Utilisation de la genericite avec les DAO

Nous devons creer autant d’interfaces DAO que tables de labases de donnees

Pour eviter cela, on peut utiliser une seule interface Dao avec untype generique que toutes les classes d’acces aux donneesdoivent l’implementer.

H & H: Research and Training 33 / 41

Page 40: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Restructuration du code Classes connexion et dao

JDBC

L’interface Dao

package org.eclipse.dao;

import java.util.List;

public interface Dao <T> {T save(T obj);void remove(T obj);T update(T obj);T findById(int id);List<T> getAll();

}

H & H: Research and Training 34 / 41

Page 41: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Restructuration du code Classes connexion et dao

JDBC

La classe PersonneDaoImpl

package org.eclipse.dao;

public class PersonneDaoImpl implements Dao<Personne>{

...

Rien ne change pour le reste

H & H: Research and Training 35 / 41

Page 42: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Restructuration du code DataSource et fichier de proprietes

JDBC

Encore de la restructuration du code

Mettre les donnees (url, nomUtilisateur, motDePasse...) relatives anotre connexion dans un fichier de proprietes que nous appelonsdb.properties (utilise par certain framework comme Spring)

Creer une nouvelle classe (DataSourceFactory) qui va lire etconstruire les differentes proprietes de la connexion

Utiliser DataSourceFactory dans MyConnection

H & H: Research and Training 36 / 41

Page 43: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Restructuration du code DataSource et fichier de proprietes

JDBC

Le fichier db.properties situe a la racine du projet (ayant laforme cle = valeur, le nom de la cle est a choisir parl’utilisateur)

url=jdbc:mysql://localhost:3306/jdbc?useSSL=false&serverTimezone=UTC

username=rootpassword=root

H & H: Research and Training 37 / 41

Page 44: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Restructuration du code DataSource et fichier de proprietes

Creons la classe MyDataSourceFactory dans org.eclipse.config

import java.io.FileInputStream;import java.io.IOException;import java.util.Properties;import javax.sql.DataSource;import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

public class MyDataSourceFactory {public static DataSource getMySQLDataSource() {

Properties props = new Properties();FileInputStream fis = null;MysqlDataSource mysqlDataSource = null;try {

fis = new FileInputStream("db.properties");props.load(fis);mysqlDataSource = new MysqlDataSource();mysqlDataSource.setURL(props.getProperty("url"));mysqlDataSource.setUser(props.getProperty("username"));mysqlDataSource.setPassword(props.getProperty("password"));

} catch (IOException e) {e.printStackTrace();

}return mysqlDataSource;

}}

H & H: Research and Training 38 / 41

Page 45: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Restructuration du code DataSource et fichier de proprietes

JDBC

Remarque

Dans MyDataSourceFactory, on ne precise pas le drivercom.mysql.jdbc.Driver car on utilise un objet de la classeMysqlDataSource qui charge lui meme le driver.

H & H: Research and Training 39 / 41

Page 46: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Restructuration du code DataSource et fichier de proprietes

La classe MyConnection du package org.eclipse.config

import java.sql.Connection;import java.sql.SQLException;import javax.sql.DataSource;

public class MyConnection {

private static Connection connexion = null;

private MyConnection() {

DataSource dataSource = MyDataSourceFactory.getMySQLDataSource();try {

connexion = dataSource.getConnection();} catch (SQLException e) {

e.printStackTrace();}

}public static Connection getConnection() {

if (connexion == null) {new MyConnection();

}return connexion;

}

H & H: Research and Training 40 / 41

Page 47: Achref El Mouelhi - lis-lab.fr · Java: gerer une base de donn´ ees avec JDBC´ Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en programmation par contrainte

c© Achref EL MOUELHI c©

Restructuration du code DataSource et fichier de proprietes

Relancons le Main et verifier que tout fonctionne correctement

package org.eclipse.classes;

import org.eclipse.dao.PersonneDaoImpl;import org.eclipse.model.Personne;

public class Main {

public static void main(String args []) {

PersonneDaoImpl personneDaoImpl = new PersonneDaoImpl();Personne personne = new Personne ("Wick","John");Personne insertedPersonne = personneDaoImpl.save(personne);

if (insertedPersonne != null)System.out.println("personne numero " + insertedPersonne.

getNum() + " a ete inseree");elseSystem.out.println("probleme d’insertion");

}}

H & H: Research and Training 41 / 41