====== D3-TP04 : Projet gestion de clients(4) - Persistance des données (1) ======
* version "JDBC manuel" (Java DataBase Connectivity : API standard pour interagir avec les bases données relationnelles en Java) -> à passer en [[d3:TP04:JPA]] [[d3:TP06|JPA]](ORM)
* fichier configuration mariadb sur le serveur(sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf) à modifier (bind-address=0.0.0.0) pour accès distant
* relancer le serveur
* Mettre le .jar du jdbc dans les librairies du serveur web (C:\payara6\glassfish\domains\domain1\lib) et/ou ajouter la dépendance
* tester la configuration de l'accès à la bd dans Netbeans (Services -> Bases de données) avant de commencer.
===== avec MAVEN =====
Ajouter une dépendance (**pom.xml**) :
org.mariadb.jdbc
mariadb-java-client
3.3.3
===== Contexte =====
Nous poursuivons notre application de gestion des clients. Cette application doit permettre :
* De s'authentifier,
* De créer un nouveau client,
* De lister les clients
===== Travail déjà effectué =====
Le travail commencé a permis de gérer approximativement l'authentification et l'affichage d'un menu. Les pages permettant de créer un nouveau client ou de les lister sont créées, mais elles ne font rien.
===== Travail à faire =====
Désormais, il faudrait pouvoir afficher la liste des clients.
- Pour cela, vous allez créer la base de données **bdclient** qui contient pour l’instant la **table client(id, nom,prenom, mail), id autoincrémenté.**
- Créer un bean **Client** correspondant à la description de la table client de la base de données
- Mettre en place le **connecteur JDBC** (mariadb-java-client-3.5.6.jar sur le drive et voir SIO1/scannetteTP4)
- Copier le connecteur dans les librairies de Payara (ex :C:\payara6\glassfish\domains\domain1\lib)
- Depuis le Drive, récupérer la classe **Connexion** et la déposer dans l'application dans un nouveau package **com.test.bdd** créé au niveau du répertoire Source Packages. Cette classe permet d'établir une connexion à la base de données.
Par la suite, pour établir une connexion, il faudra écrire :
Connection theConnection = Connexion.getConnect( "192.168.100.100",
"bdclient",
"adminBDClient",
"mdpBDClient");
La méthode **getConnect** est une **méthode statique**, qui peut donc être utilisée sans avoir besoin d'instancier la classe Connexion. Elle a besoin de 4 paramètres : le serveur de base de données, le nom de la base de données, un user de connexion avec son mot de passe associé.
==== I. Création de la classe ClientMysql ====
Cette classe sera dédiée aux requêtes SQL concernant la table client. Elle disposera d'un attribut : **laConnexion** de type Connexion et nous y implanterons les méthodes **CRUD** :
- Une méthode permettant de créer une occurrence, méthode **create**
- Une méthode permettant de lire une occurrence, méthode **read**
- Une méthode permettant de mettre à jour une occurrence, méthode **update**
- Une méthode permettant de supprimer une occurrence, méthode **delete**
- Une méthode permettant de retrouver toutes les occurrences, méthode **readAll**
Créer la nouvelle classe Java **ClientMysql** dans le **package bdd**
- Déclarer et initialiser l'attribut laConnexion
- Écrire la méthode readAll. Cette méthode n'a pas besoin de paramètre, et retourne une collection de clients
Les requêtes SQL ont besoin d'un objet de type Statement qui contiendra la requête SQL executeQuery. Cette méthode retourne un objet de type ResultSet (jeu d'enregistrements). Il faut appliquer la méthode next() au ResultSet obtenu pour se positionner sur un enregistrement. Ensuite, les méthode getInt("nomAttribut") ou getString("nomAttribut) permettent de récupérer les valeurs des attributs.
Exemple :
public ArrayList readAll(){
ArrayList lesClients=new ArrayList<>();
try {
Statement stmt=theConnection.createStatement();
ResultSet resultQ=null;
resultQ=stmt.executeQuery("SELECT * FROM client;");
while (resultQ.next()){
Client resultat=new Client(resultQ.getInt("id"),resultQ.getString("nom"),resultQ.getString("prenom"),resultQ.getString("mail"));
lesClients.add(resultat);
}
resultQ.close();
stmt.close();
}
catch(SQLException ex){
System.out.println("SQLException:"+ex.getMessage());
System.out.println("SQLState:"+ex.getSQLState());
System.out.println("code Erreur:"+ex.getErrorCode());
}
return lesClients;
}
}
==== II. Modification de la servlet ListeServlet.java ====
Modifier la méthode doGet. Avant de solliciter la jsp, elle devra :
- Créer un objet de type ClientMysql
- Appeler la méthode readAll appliquée à cet objet
- transmettre la collection retournée (lesClients) par la méthode readAll à la vue par l'intermédiaire de l'objet request
==== III. Modification de la jsp listeclientsVue.jsp ====
La jsp devra afficher les clients présents dans la collection lesClients.
===== Optimisation du code =====
==== Fichier .env ====
Un fichier .env est un fichier de configuration qui permet de stocker des **variables d’environnement** nécessaires au fonctionnement de l'applications. Il joue un rôle crucial dans la gestion des paramètres sensibles tels que les clés API, **les informations sur les bases de données** ou d’autres configurations environnementales qui ne devraient pas être visibles dans le code source. Grâce à ce type de fichier, les développeurs peuvent garantir la **sécurité des données** tout en conservant une **flexibilité dans la configuration des projets**.
=== Avec Jakarta EE et serveur Payara ===
Le fichier .env peut être créé à la racine de ton projet (là où se trouvent le fichier pom.xml, le dossier src/) :
== Exemple de contenu : ==
DB_HOST=192.168.100.100
DB_NAME=bdclient
DB_USER=adminBDClient
DB_PASSWORD=mdpBDClient
Dans les fichiers de configuratin (Project Files-fichier pom.xml), ajouter une dépendance dotenv-java (librairie utilisable avec Maven) :
io.github.cdimascio
dotenv-java
3.0.0
Dans le code,
- importation de l librairie : import io.github.cdimascio.dotenv.Dotenv;
- exemple d'utilisation pour la connexion à la base de données :
// 1.Chargement du fichier .env à la racine du projet
Dotenv dotenv = Dotenv.load();
// 2. Initialisation des paramètres de connexion
String host = dotenv.get("DB_HOST"); // Serveur de bd
String dbname = dotenv.get("DB_NAME"); // Nom bd
String url = "jdbc:mariadb://" + host + "/" + dbname; // url de connexion
url += "?autoReconnect=true"; // Ajout 26/09/2021
System.out.println("url : "+url);
String user = dotenv.get("DB_USER"); // nom du user
System.out.println("nomUtil : "+user);
String passwd = dotenv.get("DB_PASSWORD"); // mot de passe
System.out.println("mdp : "+passwd);
// 3. Connexion
connect = (Connection) DriverManager.getConnection(url, user, passwd);
== Pour le déploiement ==
Dans pom.xml, configurer le plugin maven-resources-plugin pour que .env soit copié dans le target/ à chaque build.
org.apache.maven.plugins
maven-resources-plugin
3.3.1
copy-env
process-resources
copy-resources
${project.build.outputDirectory}
${basedir}
.env