Vous êtes sur la page 1sur 5

INSEA

Institut National des Statistiques et Année Universitaire 2020-2021


d’Economie Appliquée Pr. ELHARI Kaoutar
Persistance des données
S5 - Informatique

TP1 : Rappel de JDBC – Injection SQL : Partie 1 et Partie 2

Objectifs

JDBC est l'API de base pour la persistance des données d'un programme Java dans une base de
données relationnelle. Ce TP rappelle, dans un premier temps, cette API et implémente ses
méthodes pour accéder à une table dans une base de données prédéfinie via des instructions
simples. Dans un second lieu, il utilise des instructions paramétrées qui réduisent le risque de
l’injection SQL.

Environnements requis

§ Java SE Development Kit 8 :


https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-
2133151.html
§ Eclipse IDE 2019-06 R : https://www.eclipse.org/downloads/packages/ (Choisir Eclipse
IDE for Enterprise Java Developers)
§ Mysql Community Server 8.0.17: https://dev.mysql.com/downloads/mysql/ (lors de
l’installation mettre : root rootroot)
§ Mysql Workbench 8.0.17: https://dev.mysql.com/downloads/workbench/
§ Mysql Connector J 8.0.17: https://dev.mysql.com/downloads/connector/j/ (Choisir
“Platform Independent”)

Partie I : Création de la base de données

1. Créez via Workbench le schéma la base de données My SQL : Incident


2. Créez la table « Vehicule »
3. Créez les colonnes suivantes :

Colonne Type
id INT, AutoIncrement
code_interne VARCHAR
immatriculation VARCHAR
dateMiseEnCirculation DATE

NB : vous pouvez utiliser le script suivant pour la création en cas d’erreur

Use Incident;
CREATE TABLE `Vehicule` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`code_interne` varchar(45) DEFAULT NULL,
`immatriculation` varchar(45) DEFAULT NULL,
`dateMiseEnCirculation` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;


4. Afin de faire quelques tests dans le présent TP, insérez les lignes suivantes dans la table
« Vehicule » :

INSERT INTO `Incident`.`Vehicule` (`code_interne`, `immatriculation`,
`dateMiseEnCirculation`) VALUES ('124', 'VV-CC-JJ', '2012-12-26 00:00:00');
INSERT INTO `Incident`.`Vehicule` (`code_interne`, `immatriculation`,
`dateMiseEnCirculation`) VALUES ('114', 'AA-BB-CC', '2014-12-26 00:00:00');
INSERT INTO `Incident`.`Vehicule` (`code_interne`, `immatriculation`,
`dateMiseEnCirculation`) VALUES ('120', 'DD-RB-HC', '2016-10-07 00:00:00');
INSERT INTO `Incident`.`Vehicule` (`code_interne`, `immatriculation`,
`dateMiseEnCirculation`) VALUES ('120', 'DD-RB-HC', '2018-11-09 00:00:00');

Partie II : JDBC – Instructions simples

On voudrait exploiter la table « Vehicule » à travers une classe Java utilisant JDBC.

1. Dans Eclipse, créez un projet nommé « JDBC ». (File->New->JavaProject)



2. Ajoutez mysql-connector.jar dans les librairies du projet :

Clic droit sur le projet -- > Properties--> build path -- > configure build path
Dans l’onglet Libraries cliquez sur Add External Jar et Selectionnez le jar
correspondant.

3. Créez le package « persistance»



4. A l’intérieur du package, créez la classe « TestJDBC.java » dont le contenu est :

public class TestJDBC {


// Nom du driver JDBC et URL de la BD
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost:3306/Incident";

// initialisation des variables de la BD


static final String USER = "root";
static final String PASS = "rootroot";
static Connection conn = null;

public static void main(String[] args) {


try {
TestJDBC.conn = TestJDBC.initConnection(TestJDBC.conn);
/* Appel des méthodes */
TestJDBC.listerVehicules();

} catch (SQLException se) {


// Erreurs du JDBC
se.printStackTrace();
} finally {
TestJDBC.closeConnection(TestJDBC.conn);
}
}
}

Les méthodes initConnection (Connection) et closeConnection (Connection) sont des méthodes de


la classe permettant respectivement d’ouvrir et de fermer la connexion. Le corps de ces deux
méthodes est :

private static Connection initConnection(Connection conn) throws


SQLException {
try {
// Enregistrer le JDBC Driver
Class.forName(TestJDBC.JDBC_DRIVER);
// Ouvrir la connection
conn = DriverManager.getConnection(TestJDBC.DB_URL,
TestJDBC.USER, TestJDBC.PASS);
} catch (ClassNotFoundException e) {
throw new SQLException("Impossible de trouver le driver JDBC
: " + e.getMessage());
}
return conn;
}

private static void closeConnection(Connection conn) {


try {
if (conn != null) {
conn.close();
System.out.println("Fermeture de la connexion!");
}
} catch (SQLException e) {
}


5. Créez une méthode qui permet de lister tous les véhicules, dont le corps est :

private static void listerVehicules() {


Statement stmt = null;
// Excécution du requête
System.out.println("Statement listerVehicule...");
try {
stmt = TestJDBC.conn.createStatement();
String sql;
sql = "select id, code_interne, immatriculation,
dateMiseEnCirculation from Vehicule;";
ResultSet rs = stmt.executeQuery(sql);

// Extraction des données du resultset


while (rs.next()) {
// par nom de colonne
int id = rs.getInt("id");
String codeInterne = rs.getString("code_interne");
String immatriculation =
rs.getString("immatriculation");
String dateMiseEnCirculation =
rs.getString("dateMiseEnCirculation");
// Ecrire les valeurs
System.out.print("ID: " + id);
System.out.print(", Code interne: " + codeInterne);
System.out.print(", Immatriculation : " +
immatriculation);
System.out.println(", Date de mise en circulation: " +
dateMiseEnCirculation);
} // Fermer ce qui est ouvert
rs.close();
stmt.close();

} catch (SQLException se) {


// erreurs du JDBC
se.printStackTrace();
} finally {
// finally forcer la fermeture du statement
try {
if (stmt != null) {
stmt.close();
}
} catch (SQLException se2) {
}

} // try
}


Testez le résultat dans le main dans la partie : /*Appel des méthodes*/

6. Créez une méthode qui a comme arguments : code_interne, immatriculation,
dateMiseEnCirculation et qui permet d’insérer le véhicule (1998, HH-KK-LL, 2019-09-01)
dans la table en utilisant une instruction sql simple. Testez la dans le main dans la partie :
/*Appel des méthodes*/en utilisant le jeu de données suivant :

String date = "2019-09-01";


java.sql.Date SqlDate = java.sql.Date.valueOf(date);
TestJdbc.insererVehicule("5", "12A45", SqlDate);



7. Créez une méthode qui permet de lister un véhicule dont le code interne est mentionné
par l’utilisateur. Testez la dans le main dans la partie : /*Appel des méthodes*/

Indications :

System.out.println("Statement listerVehicule...");
Scanner sc = new Scanner(System.in);
System.out.println("Veuillez saisir le code interne :");
String code_interne = sc.nextLine();
try {

stmt = TestJDBC.conn.createStatement();

String sql;
sql = "select id, code_interne, immatriculation,
dateMiseEnCirculation from Vehicule where code_interne = "
+ code_interne + ";";
System.out.println(sql);
ResultSet rs = stmt.executeQuery(sql);


8. On suppose dans cette question que les données d’un véhicule ne sont connues que par
l’utilisateur (chauffeur par ex) qui connaît le code interne du véhicule qui le concerne.
Normalement, il peut connaître les données du véhicule en exécutant la requête de la
question 7.
A travers l’exécution de la question 7, un chauffeur a réussi de lister tous les véhicules.
Comment a-t-il pu faire ?

9. On voudrait dans cette question faire une mise à jour d’une immatriculation d’un véhicule
en saisissant le code interne . Ecrivez la méthode (qui n’a pas d’arguments) qui permet de
la faire et testez la dans le main dans la partie : /*Appel des méthodes*/

10. Un utilisateur a pu modifier à travers la méthode de la question 9 toutes les
immatriculations. Comment a t il fait ? Comparez l’impact de cette manœuvre par rapport
à la manœuvre de la question 8.

11. Dans cette question et à l’instar des questions précédentes, il est question d’écrire une
méthode qui supprime un véhicule dont le code est saisi par l’utilisateur.

12. Un utilisateur a réussi à supprimer toutes les données juste grâce à la question 11. Simulez
sa saisie. Comparez l’impact de sa manœuvre par rapport aux questions 8 et 10.

13. Quelles conclusions peut-on tirer de ces exemples.