3°IIR
TP6
Exercice 1
Écrivez un programme Java qui effectue les opérations suivantes :
Lisez un fichier texte "data.txt" ligne par ligne et copie son contenu un autre fichier en
ajoutant "Début"comme première ligne du fichier et "Fin" comme dernière ligne du
fichier.
Exercice 2
Lire un fichier de type texte ligne par ligne et de reproduire ce qui est lu directement à l'écran.
On propose pour cela l’utilisation d’un BufferdReader avec un FileReader.
Chaque ligne contient les coordonnes d’un point en 3D de type int (11 12 13) séparé par un
espace. Récupérer les coordonnées et calculer les sommes de chaque point.
Ajouter d’autres points 3D, récupérer le tous dans un tableau(x).
Exercice 3
• Ecrire une classe qui représente les employés avec les attributs: nom, adresse, SSN et
numéro.
• Ecrire une classe pour sérialiser un employé. (L’attribut SSN n’est pas sérialisable).
• Ecrire une classe pour désérialiser un employé.
***************************************************************************
Important : lorsque la connexion n'est plus utile, il faut explicitement invoquer
sa méthode close() afin de libérer toutes les autres ressources de la base de
données.
JDBC (Java DataBase Connectivity) est une API de bas niveau de Java SE pour permettre un
accès aux bases de données avec Java. Elle permet de se connecter à une base de données et
d'interagir avec en exécutant des requêtes SQL.
L'architecture de JDBC permet d'utiliser la même API pour accéder aux différentes bases de
données grâce à l'utilisation de pilotes (drivers) qui fournissent une implémentation
spécifique à la base de données à utiliser. Chaque base de données a alors la responsabilité de
fournir un pilote qui assure l'interface entre l'API et les actions exécutées de manière
propriétaire sur la base de données.
Les 4 types de base de JDBC sont : DriverManager, Connection, Statement, et ResultSet,
chacune correspondant à une étape de l'accès aux données.
1
3°IIR
Classe/interface Rôle
Charger et configurer le driver de la base de
DriverManager
données
Réaliser la connexion et l'authentification à la base
Connection
de données
Statement (et ses interfaces Encapsuler la requête SQL et la transmettre pour
filles PreparedStatement) exécution à la base de données
Parcourir les informations retournées par la base
ResultSet de données dans le cas d'une sélection de
données
Pour interagir avec une base de données requière plusieurs étapes :
Obtenir une instance de Connection qui se connecte à la base de données
Obtenir une instance de Statement à partir de la connexion
Configurer et exécuter une requête SQL via le Statement
Exploiter les résultats retournés par la base de données
Fermer les différentes instances utilisées
L'exécution de requêtes SQL
Les requêtes SQL sont exécutées avec les méthodes d'un objet de type
Statement que l'on obtient à partir d'un objet Connection.
Une instance de type Statement est utilisée pour exécuter une requête
SQL statique et renvoyer les résultats qu'elle produit.
Si l'objet Statement encapsule une requête SQL avec une instruction SELECT alors il
faut invoquer la méthode executeQuery() qui renvoie un objet de type ResultSet.
Si l'objet Statement encapsule une requête SQL qui modifie des données alors il faut
invoquer la méthode executeUpdate() qui retourne un entier de type int dont la valeur
indique le nombre d'enregistrements impactés.
Si l'objet Statement encapsule une requête SQL donc le type n'est pas connu alors il
faut invoquer la méthode execute() qui renvoient un booléen
2
3°IIR
Le résultat d'une requête d'interrogation est renvoyé dans un objet de la classe ResultSet par la
méthode executeQuery().
Méthode Rôle
Retourner sous forme d'entier le contenu de la colonne dont le
getInt(int)
numéro est passé en paramètre
Retourner sous forme d'entier le contenu de la colonne dont le
getInt(String)
nom est passé en paramètre
Retourner sous forme d'un nombre flottant le contenu de la
getFloat(int)
colonne dont le numéro est passé en paramètre
Retourner sous forme d'un nombre flottant le contenu de la
getFloat(String)
colonne dont le nom est passé en paramètre
Retourner sous forme de date le contenu de la colonne dont le
getDate(int)
numéro est passé en paramètre
Retourner sous forme de date le contenu de la colonne dont le
getDate(String)
nom est passé en paramètre
Se déplacer sur le prochain enregistrement : retourne false si la fin
next()
est atteinte
close() Fermer le ResultSet
La méthode next() déplace le curseur sur le prochain
enregistrement. Le curseur pointe initialement juste avant le
premier enregistrement : il est donc nécessaire de faire un
premier appel à la méthode next() pour se placer sur le
premier enregistrement.
L'utilisation d'un objet de type PreparedStatement
L'interface PreparedStatement définit les méthodes pour un objet qui va encapsuler une
requête précompilée à laquelle il est possible de définir des paramètres. Ce type de requête est
particulièrement adapté pour une exécution répétée d'une même requête avec des paramètres
différents. Cette interface hérite de l'interface Statement.
3
3°IIR
Lors de l'utilisation d'un objet de type PreparedStatement, la requête est envoyée au moteur de
la base de données pour que celui-ci prépare son exécution.
Un objet qui implémente l'interface PreparedStatement est obtenu en utilisant la méthode
preparedStatement() d'un objet de type Connection. Cette méthode attend en paramètre une
chaîne de caractères contenant la requête SQL. Dans cette chaîne, chaque paramètre est
représenté par un caractère «?».
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.UUID;
public class Test_3 {
private static int employeeCount = 10;
public static void main(String[] args) throws Exception {
creatDB();
addEmployee("prenom_1","nom_1","address_1",20,"M",123);
for(int i=0;i<20;i++)
addEmployee(randomStr(),randomStr(),randomStr(),20,"M",(int)
(1000*Math.random()));
getEmployee(11);
getEmployee(12);
changeprenom(10,"aaa");
deleteEmployee(11);
}
//====================================================
public static String randomStr() {
return UUID.randomUUID()
.toString()
.replaceAll("_", "")
.replaceAll("-", "")
.substring(0,10);
}
//====================================================
public static Connection getConnection() throws Exception{
try{
4
3°IIR
String driver = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/mysql";
String username = "root";
String password = "nabil";
//STEP 2: Register JDBC driver
Class.forName(driver);// Chargement du pilote pour une base
//STEP 3: Open a connection
Pour se connecter à une base de données, il faut obtenir une instance de type Connection en
invoquant la méthode getconnection() de la classe DriverManager en lui précisant sous forme
d'une URL la base de données à accéder.
System.out.println("Connecting to a selected database...");
Connection conn = DriverManager.getConnection(url,username,password);
System.out.println("Connected database successfully...");
return conn;
} catch(Exception e){System.out.println(e);}
return null;
}
//=======================================================
public static void creatDB() throws Exception{
Connection conn = getConnection();
Statement State = conn.createStatement();
String DB="CREATE TABLE IF NOT EXISTS EMP_DB ( "
+"employee_id INT AUTO_INCREMENT,"
+"prenom VARCHAR(50) NOT NULL,"
+"nom VARCHAR(50) NOT NULL,"
+"address VARCHAR(75) NOT NULL,"
+"age INT NOT NULL,"
+"gender VARCHAR(1) NOT NULL,"
+"Salaire INT NOT NULL,"
+"PRIMARY KEY (employee_id)"
+")";
State.executeUpdate(DB);
}
//=======================================================
// public boolean addEmployees(Employee emp)
public static void addEmployee( String prenom, String nom,
String address, int age, String gender,
int Salaire) throws Exception {
Connection conn = getConnection();
5
3°IIR
//Statement State = conn.createStatement();
PreparedStatement ps =
conn.prepareStatement("INSERT INTO EMP_DB VALUES (?, ?, ?, ?, ?, ?, ?)");
ps.setInt(1, 0);
ps.setString(2, prenom);
ps.setString(3, nom);
ps.setString(4, address);
ps.setInt(5, age);
ps.setString(6, gender);
ps.setInt(7, Salaire);
ps.executeUpdate();
//State.executeUpdate(query1);
employeeCount++;
//State.close();
ps.close();
}
//=================================================================
public static void getEmployee(int ID) throws Exception {
//String query = "SELECT prenom FROM EMP_DB WHERE employee_id ='"+ID + "'";
String query = "SELECT * FROM EMP_DB WHERE employee_id = '" + ID + "'";
Connection conn = getConnection();
Statement State = conn.createStatement();
try (ResultSet rst = State.executeQuery(query)) {
if (rst.next()) {
System.out.print(rst.getString("prenom")+" / ");
System.out.print(rst.getString("nom")+" / ");
System.out.print(rst.getString("address")+" / ");
System.out.print(rst.getInt("age")+" / ");
System.out.print(rst.getString("gender")+" / ");
System.out.print(rst.getInt("Salaire")+" \n ");
}
} catch (Exception e) {
System.err.println("Exception "+e.getMessage());
}
}
//================================================================
6
3°IIR
public static void changeprenom(int ID,String prenom) throws Exception {
String query ="UPDATE EMP_DB SET prenom= " + prenom + " WHERE employee_id =
"+ ID;
Connection conn = getConnection();
Statement State = conn.createStatement();
try {
State.executeUpdate(query);
}catch (Exception e) {
System.err.println("Exception "+e.getMessage());
}
State.close();
}
//=================================================================
public static void deleteEmployee(int ID) throws Exception {
String query = "DELETE FROM EMP_DB WHERE employee_id = '" + ID + "'";
Connection conn = getConnection();
Statement State = conn.createStatement();
try {
State.executeUpdate(query);
}catch (Exception e) {
System.err.println("Exception "+e.getMessage());
}
State.close();
//=================================================================
public static int getCount() {
return employeeCount;
}
}