CouleurDao
package com.example.dao;
// Importations nécessaires pour la manipulation de SQL, les requêtes HTTP et l'écriture de réponses
import java.sql.*;
import javax.servlet.http.*;
import com.example.util.ResultSetTableDisplay;
import com.example.util.ServletUtils;
import javax.json.JsonObject;
// Classe CouleurDAO implémente l'interface IGenericCRUD pour gérer les opérations CRUD sur les couleurs
public class CouleurDAO implements IGenericCRUD {
private DatabaseConnection dbConnection;
// Constructeur pour initialiser avec une instance de DatabaseConnection
public CouleurDAO(DatabaseConnection dbConnection) {
this.dbConnection = dbConnection;
}
// Méthode pour gérer les requêtes GET et renvoyer une réponse HTML
public void handleGetHTML(HttpServletRequest request, HttpServletResponse response) throws SQLException, IOException {
dbConnection.connect(); // Connexion à la base de données
response.setContentType("text/html"); // Définit le type de contenu de la réponse
PrintWriter out = response.getWriter(); // Obtient un PrintWriter pour écrire la réponse
// Appelle une méthode utilitaire pour afficher les résultats sous forme de tableau HTML
ResultSetTableDisplay.displayHtmlTable(listAllCouleurs(), out);
// Convertit les résultats en HTML pour un affichage ultérieur ou pour le débogage
String couleurHtml = ResultSetTableDisplay.toHtmlTable(listAllCouleurs());
System.out.println(couleurHtml);
dbConnection.disconnect(); // Déconnexion de la base de données
}
// Méthode pour gérer les requêtes GET et renvoyer une réponse JSON
@Override
public void handleGet(HttpServletRequest request, HttpServletResponse response) throws SQLException, IOException {
try {
dbConnection.connect(); // Connexion à la base de données
ResultSet resultSet = listAllCouleurs(); // Exécute une requête pour lister toutes les couleurs
// Convertit le résultat en JSON
String jsonResponse = ServletUtils.convertResultSetToJson(resultSet);
// Envoie la réponse JSON
ServletUtils.sendJsonResponse(response, jsonResponse);
resultSet.close(); // Ferme le ResultSet
dbConnection.disconnect(); // Déconnexion de la base de données
} catch (SQLException ex) {
// Gère les exceptions SQL et envoie une réponse d'erreur
ServletUtils.handleSqlException(response, ex);
} catch (Exception ex) {
// Gère les autres exceptions et envoie une réponse d'erreur
ServletUtils.sendErrorResponse(response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Server error: " + ex.getMessage());
}
}
// Méthode pour gérer les requêtes POST (création de couleur) et renvoyer une réponse JSON
@Override
public void handlePost(HttpServletRequest request, HttpServletResponse response) throws SQLException, IOException {
try {
JsonObject jsonObject = ServletUtils.parseJsonRequest(request); // Parse le corps JSON de la requête
// Récupère les valeurs 'nom' et 'hexadecimal_rvb' du JSON
String nom = jsonObject.getString("nom", "");
String hexadecimal_rvb = jsonObject.getString("hexadecimal_rvb", "");
ServletUtils.validateRequestData(jsonObject, "nom", "hexadecimal_rvb"); // Valide les données
// Insère la nouvelle couleur et obtient un ResultSet pour la couleur insérée
ResultSet resultSet = insertCouleurAndGet(nom, hexadecimal_rvb);
// Convertit le ResultSet en JSON
String jsonResponse = ServletUtils.convertResultSetToJson(resultSet);
// Envoie la réponse JSON
ServletUtils.sendJsonResponse(response, jsonResponse);
} catch (SQLException ex) {
// Gère les exceptions SQL
ServletUtils.handleSqlException(response, ex);
} catch (IOException ex) {
// Gère les exceptions d'entrée/sortie
ServletUtils.sendErrorResponse(response, HttpServletResponse.SC_BAD_REQUEST, ex.getMessage());
} catch (Exception ex) {
// Gère les autres exceptions
ServletUtils.sendErrorResponse(response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Error inserting color: " + ex.getMessage());
}
}
// Méthode pour gérer les requêtes PUT (mise à jour de couleur) et renvoyer une réponse JSON
@Override
public void handlePut(HttpServletRequest request, HttpServletResponse response) throws SQLException, IOException {
try {
JsonObject jsonObject = ServletUtils.parseJsonRequest(request); // Parse le corps JSON de la requête
// Récupère les données 'id', 'nom', et 'hexadecimal_rvb' du JSON
int id = jsonObject.getInt("id");
String nomCouleur = jsonObject.getString("nom", "");
String hexadecimal_rvb = jsonObject.getString("hexadecimal_rvb", "");
// Validation des données
if (nomCouleur.isEmpty() || hexadecimal_rvb.isEmpty()) {
ServletUtils.sendErrorResponse(response, HttpServletResponse.SC_BAD_REQUEST, "Missing required fields");
return;
}
// Mise à jour de la couleur
boolean updated = updateCouleur(id, nomCouleur, hexadecimal_rvb);
// Envoie une réponse en fonction du succès de la mise à jour
if (updated) {
ServletUtils.sendJsonResponse(response, "{\"message\": \"Color updated successfully.\"}");
} else {
ServletUtils.sendErrorResponse(response, HttpServletResponse.SC_NOT_FOUND, "Color not found or not updated");
}
} catch (NumberFormatException ex) {
// Gère les exceptions de format de nombre
ServletUtils.sendErrorResponse(response, HttpServletResponse.SC_BAD_REQUEST, "Invalid format for ID");
} catch (SQLException ex) {
// Gère les exceptions SQL
ServletUtils.handleSqlException(response, ex);
} catch (Exception ex) {
// Gère les autres exceptions
ServletUtils.sendErrorResponse(response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Server error: " + ex.getMessage());
}
}
// Méthode pour gérer les requêtes DELETE (suppression de couleur) et renvoyer une réponse JSON
@Override
public void handleDelete(HttpServletRequest request, HttpServletResponse response) throws SQLException, IOException {
try {
JsonObject jsonObject = ServletUtils.parseJsonRequest(request); // Parse le corps JSON de la requête
// Récupère l'ID de la couleur à supprimer
int id = jsonObject.getInt("id");
// Supprime la couleur
boolean deleted = deleteCouleur(id);
// Envoie une réponse en fonction du succès de la suppression
if (deleted) {
ServletUtils.sendJsonResponse(response, "{\"message\": \"Color deleted successfully.\"}");
} else {
ServletUtils.sendErrorResponse(response, HttpServletResponse.SC_NOT_FOUND, "Color not found or not deleted");
}
} catch (NumberFormatException ex) {
// Gère les exceptions de format de nombre
ServletUtils.sendErrorResponse(response, HttpServletResponse.SC_BAD_REQUEST, "Invalid format for ID");
} catch (SQLException ex) {
// Gère les exceptions SQL
ServletUtils.handleSqlException(response, ex);
} catch (Exception ex) {
// Gère les autres exceptions
ServletUtils.sendErrorResponse(response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Server error: " + ex.getMessage());
}
}
// Méthode pour traiter les requêtes GET avec un paramètre ID spécifique
@Override
public void handleFindById(HttpServletRequest request, HttpServletResponse response) throws SQLException, IOException {
try {
// Extrayez l'ID de la couleur à partir des paramètres de la requête
int id = Integer.parseInt(request.getParameter("id"));
// Récupérez la couleur par son ID
ResultSet resultSet = findById(id);
// Convertissez le ResultSet en JSON
String jsonResponse = ServletUtils.convertResultSetToJson(resultSet);
// Envoyez la réponse JSON
ServletUtils.sendJsonResponse(response, jsonResponse);
// Fermez le ResultSet et déconnectez-vous de la base de données
resultSet.close();
dbConnection.disconnect();
} catch (NumberFormatException ex) {
// Gérez les exceptions de format de nombre
ServletUtils.sendErrorResponse(response, HttpServletResponse.SC_BAD_REQUEST, "Invalid ID format");
} catch (SQLException ex) {
// Gérez les exceptions SQL
ServletUtils.handleSqlException(response, ex);
} catch (Exception ex) {
// Gérez les autres exceptions
ServletUtils.sendErrorResponse(response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Server error: " + ex.getMessage());
}
}
// Méthode pour traiter les requêtes GET avec un paramètre 'name' spécifique
@Override
public void handleFindByName(HttpServletRequest request, HttpServletResponse response) throws SQLException, IOException {
try {
String name = request.getParameter("name");
ResultSet resultSet = findByName(name);
String jsonResponse = ServletUtils.convertResultSetToJson(resultSet);
ServletUtils.sendJsonResponse(response, jsonResponse);
resultSet.close();
dbConnection.disconnect();
} catch (SQLException ex) {
// Gérez les exceptions SQL
ServletUtils.handleSqlException(response, ex);
} catch (Exception ex) {
// Gérez les autres exceptions
ServletUtils.sendErrorResponse(response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Server error: " + ex.getMessage());
}
}
// Insère une couleur dans la base de données et renvoie un ResultSet avec la couleur insérée
public ResultSet insertCouleurAndGet(String nom, String hexadecimal_rvb) throws SQLException {
String insertSql = "INSERT INTO couleur (nom, hexadecimal_rvb) VALUES (?, ?)";
String selectSql = "SELECT * FROM couleur WHERE id = ?";
dbConnection.connect(); // Établissement de la connexion
// Préparation de la requête d'insertion avec récupération des clés générées
PreparedStatement insertStatement = dbConnection.getJdbcConnection().prepareStatement(insertSql, Statement.RETURN_GENERATED_KEYS);
insertStatement.setString(1, nom); // Paramètre 'nom'
insertStatement.setString(2, hexadecimal_rvb); // Paramètre 'hexadecimal_rvb'
insertStatement.executeUpdate(); // Exécution de la requête d'insertion
// Récupération de l'identifiant généré pour la nouvelle couleur
ResultSet generatedKeys = insertStatement.getGeneratedKeys();
if (!generatedKeys.next()) {
throw new SQLException("Creating color failed, no ID obtained.");
}
int newColorId = generatedKeys.getInt(1); // ID de la nouvelle couleur
insertStatement.close(); // Fermeture de la déclaration d'insertion
// Récupération de la couleur insérée en utilisant l'ID généré
PreparedStatement selectStatement = dbConnection.getJdbcConnection().prepareStatement(selectSql);
selectStatement.setInt(1, newColorId); // Paramètre 'id'
ResultSet resultSet = selectStatement.executeQuery(); // Exécution de la requête de sélection
return resultSet; // Retourne le ResultSet contenant la couleur insérée
}
// Liste toutes les couleurs présentes dans la base de données
public ResultSet listAllCouleurs() throws SQLException {
String sql = "SELECT * FROM couleur"; // Requête SQL pour sélectionner toutes les couleurs
dbConnection.connect(); // Établissement de la connexion
Statement statement = dbConnection.getJdbcConnection().createStatement();
ResultSet resultSet = statement.executeQuery(sql); // Exécution de la requête
return resultSet; // Retourne le ResultSet avec toutes les couleurs
}
// Met à jour une couleur spécifiée par son ID dans la base de données
public boolean updateCouleur(int id, String nomCouleur, String hexadecimal_rvb) throws SQLException {
String sql = "UPDATE couleur SET nom = ?, hexadecimal_rvb = ? WHERE id = ?";
dbConnection.connect(); // Établissement de la connexion
PreparedStatement statement = dbConnection.getJdbcConnection().prepareStatement(sql);
statement.setString(1, nomCouleur); // Paramètre 'nom'
statement.setString(2, hexadecimal_rvb); // Paramètre 'hexadecimal_rvb'
statement.setInt(3, id); // Paramètre 'id'
boolean rowUpdated = statement.executeUpdate() > 0; // Exécution de la mise à jour et vérification du succès
statement.close(); // Fermeture de la déclaration
dbConnection.disconnect(); // Déconnexion de la base de données
return rowUpdated; // Retourne vrai si la mise à jour a réussi
}
// Supprime une couleur spécifiée par son ID de la base de données
public boolean deleteCouleur(int id) throws SQLException {
String sql = "DELETE FROM couleur WHERE id = ?";
dbConnection.connect(); // Établissement de la connexion
PreparedStatement statement = dbConnection.getJdbcConnection().prepareStatement(sql);
statement.setInt(1, id); // Paramètre 'id'
boolean rowDeleted = statement.executeUpdate() > 0; // Exécution de la suppression et vérification du succès
statement.close(); // Fermeture de la déclaration
dbConnection.disconnect(); // Déconnexion de la base de données
return rowDeleted; // Retourne vrai si la suppression a réussi
}
// Récupère la dernière couleur insérée dans la base de données
public ResultSet getLastInsertedColor() throws SQLException {
String sql = "SELECT * FROM couleur ORDER BY id DESC LIMIT 1";
// Établissement de la connexion non nécessaire ici car déjà connecté
Statement statement = dbConnection.getJdbcConnection().createStatement();
ResultSet resultSet = statement.executeQuery(sql); // Exécution de la requête
return resultSet; // Retourne le ResultSet contenant la dernière couleur insérée
}
// Recherche une couleur par son ID
public ResultSet findById(int id) throws SQLException {
String sql = "SELECT * FROM couleur WHERE id = ?";
dbConnection.connect(); // Établissement de la connexion
PreparedStatement statement = dbConnection.getJdbcConnection().prepareStatement(sql);
statement.setInt(1, id); // Paramètre 'id'
ResultSet resultSet = statement.executeQuery(); // Exécution de la requête
return resultSet; // Retourne le ResultSet contenant la couleur recherchée
}
// Recherche une couleur par son nom
public ResultSet findByName(String name) throws SQLException {
String sql = "SELECT * FROM couleur WHERE nom = ?";
dbConnection.connect(); // Établissement de la connexion
PreparedStatement statement = dbConnection.getJdbcConnection().prepareStatement(sql);
statement.setString(1, name); // Paramètre 'nom'
return statement.executeQuery(); // Exécution de la requête et retourne le ResultSet
}
}
Le contrôleur CouleurDAO (Data Access Object) dans Java est un composant clé dans l'architecture de développement d'applications web qui interagit avec une base de données pour effectuer des opérations CRUD (Create, Read, Update, Delete) sur les données de couleur. Voici une explication détaillée adaptée à un cours Java :
Rôle et Fonctionnalité de CouleurDAO
-
Interaction avec la Base de Données :
CouleurDAOsert de pont entre l'application Java et la base de données.- Il utilise JDBC (Java Database Connectivity) pour se connecter à la base de données et exécuter des requêtes SQL.
-
Opérations CRUD :
- Create (Créer) : Insère de nouvelles données de couleur dans la base de données.
- Read (Lire) : Récupère les informations des couleurs depuis la base de données.
- Update (Mettre à jour) : Modifie les données existantes de couleur dans la base de données.
- Delete (Supprimer) : Efface les données de couleur de la base de données.
-
Gestion des Requêtes HTTP :
CouleurDAOgère les requêtes HTTP envoyées par les clients (comme un navigateur web ou une application mobile).- Pour chaque type de requête (GET, POST, PUT, DELETE), il y a une méthode correspondante dans
CouleurDAOqui traite la requête et génère une réponse.
-
Conversion des Données :
- Les données récupérées de la base de données sont converties en format JSON pour être facilement transmises et interprétées par le client.
- Pour les requêtes GET spécifiques, il peut également convertir les résultats en un tableau HTML.
-
Sécurité et Gestion des Exceptions :
CouleurDAOintègre des mesures pour gérer les exceptions SQL et les erreurs de connexion à la base de données.- Il assure la sécurité des données en empêchant les injections SQL et en gérant correctement les entrées utilisateurs.
Avantages de l'Utilisation de CouleurDAO
- Modularité : Sépare la logique d'accès aux données de la logique métier de l'application.
- Réutilisabilité : Peut être utilisé par différentes parties de l'application pour effectuer des opérations sur les données de couleur.
- Maintenabilité : Facilite la maintenance et les mises à jour du code, car les modifications de la base de données ne nécessitent des changements que dans
CouleurDAO.
Méthodes Appelées par les Gestionnaires dans CouleurDAO
-
insertCouleur(String nom, String hexadecimal_rvb)- Fonction : Insère une nouvelle couleur dans la base de données.
- Processus : Prend le nom de la couleur et sa valeur hexadécimale comme paramètres, puis exécute une requête SQL
INSERTpour ajouter ces données dans la base.
-
insertCouleurAndGet(String nom, String hexadecimal_rvb)- Fonction : Insère une couleur et récupère les informations de cette couleur insérée.
- Processus :
- Insère la couleur comme dans
insertCouleur. - Récupère l'ID généré automatiquement lors de l'insertion.
- Utilise cet ID pour récupérer et retourner les données de la couleur insérée.
- Insère la couleur comme dans
-
listAllCouleurs()- Fonction : Récupère toutes les couleurs de la base de données.
- Processus : Exécute une requête SQL
SELECT *pour récupérer toutes les entrées de la table des couleurs.
-
updateCouleur(int id, String nomCouleur, String hexadecimal_rvb)- Fonction : Met à jour les informations d'une couleur spécifique dans la base de données.
- Processus :
- Reçoit l'ID de la couleur à mettre à jour, le nouveau nom et la valeur hexadécimale.
- Exécute une requête SQL
UPDATEpour appliquer ces mises à jour.
-
deleteCouleur(int id)- Fonction : Supprime une couleur spécifique de la base de données.
- Processus : Reçoit l'ID de la couleur à supprimer et exécute une requête SQL
DELETE.
-
findById(int id)etfindByName(String name)- Fonction : Récupèrent respectivement une couleur par son ID ou son nom.
- Processus : Exécutent des requêtes SQL
SELECTbasées sur l'ID ou le nom pour retourner la ou les couleurs correspondantes.
-
getLastInsertedColor()- Fonction : Récupère la dernière couleur insérée dans la base de données.
- Processus : Exécute une requête SQL
SELECTavecORDER BY id DESC LIMIT 1pour récupérer la couleur la plus récemment ajoutée.
Conclusion
CouleurDAO est un élément crucial dans l'architecture MVC (Modèle-Vue-Contrôleur) des applications Java, assurant une interaction efficace et sécurisée entre l'application et la base de données. Son utilisation favorise un code propre, organisé et facile à gérer.
Chaque méthode dans CouleurDAO est conçue pour effectuer une tâche spécifique liée à la gestion des données de couleur. Ces méthodes sont appelées par les gestionnaires handleXXX en fonction du type de requête HTTP reçue (GET, POST, PUT, DELETE, etc.), permettant ainsi une gestion centralisée et efficace des opérations sur les données. La modularité et la clarté des méthodes dans CouleurDAO rendent le code plus lisible, maintenable et réutilisable, conformément aux bonnes pratiques de la programmation orientée objet en Java.