Parfait — j’ai analysé l’énoncé que vous avez fourni et je l’ai pris en compte pour
construire la base de données + l’application Java demandée. (Énoncé : EXAMEN DE
LANGAGE JAVA 2025).
Je vous fournis ci-dessous tout ce dont vous avez besoin pour :
1. Créer la base de données gestion_commande (script SQL à coller dans MySQL
Workbench).
2. Un projet Java complet (structure + code) en Swing + JDBC pour gérer Clients,
Articles, Commandes.
3. Instructions pas-à-pas pour configurer et exécuter (IntelliJ / VS Code, JDK,
MySQL Workbench).
4. Explications pédagogiques (JDBC, DAO, transactions, relations).
1) Script SQL — coller dans MySQL
Workbench et exécuter
Copiez-collez tout ce bloc dans MySQL Workbench et lancez-le. Il crée la base, les
tables (relations 1-N), et des données d’exemple.
-- DROP & CREATE DB
DROP DATABASE IF EXISTS gestion_commande;
CREATE DATABASE gestion_commande CHARACTER SET utf8mb4 COLLATE
utf8mb4_general_ci;
USE gestion_commande;
-- Table clients
CREATE TABLE clients (
id INT AUTO_INCREMENT PRIMARY KEY,
nom VARCHAR(100) NOT NULL,
prenom VARCHAR(100) NOT NULL,
sexe ENUM('M','F','Autre') DEFAULT 'Autre',
type_client VARCHAR(50),
contact VARCHAR(100),
email VARCHAR(100),
adresse VARCHAR(255),
etat TINYINT(1) DEFAULT 1, -- 1 = actif, 0 = désactivé
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;
-- Table articles
CREATE TABLE articles (
id INT AUTO_INCREMENT PRIMARY KEY,
designation VARCHAR(150) NOT NULL,
categorie VARCHAR(100),
prix DECIMAL(10,2) NOT NULL DEFAULT 0.00,
stock INT NOT NULL DEFAULT 0,
date_creation DATE DEFAULT (CURRENT_DATE),
etat TINYINT(1) DEFAULT 1,
description TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;
-- Table commandes (1 commande -> 1 client)
CREATE TABLE commandes (
id INT AUTO_INCREMENT PRIMARY KEY,
client_id INT NOT NULL,
date_commande DATETIME DEFAULT CURRENT_TIMESTAMP,
type_commande VARCHAR(50),
validated TINYINT(1) DEFAULT 0,
total DECIMAL(12,2) NOT NULL DEFAULT 0.00,
CONSTRAINT fk_comm_client FOREIGN KEY (client_id) REFERENCES
clients(id)
ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB;
-- Table commande_items (ligne de commande) -> multiple articles par
commande
CREATE TABLE commande_items (
id INT AUTO_INCREMENT PRIMARY KEY,
commande_id INT NOT NULL,
article_id INT NOT NULL,
quantite INT NOT NULL DEFAULT 1,
prix_unitaire DECIMAL(10,2) NOT NULL DEFAULT 0.00,
total_ligne DECIMAL(12,2) NOT NULL DEFAULT 0.00,
CONSTRAINT fk_item_commande FOREIGN KEY (commande_id) REFERENCES
commandes(id)
ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT fk_item_article FOREIGN KEY (article_id) REFERENCES
articles(id)
ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB;
-- Exemples de données
INSERT INTO clients (nom, prenom, sexe, type_client, contact, email,
adresse) VALUES
('Kabongo','David','M','Particulier','+243990000000','david@example.
com','Kinshasa');
INSERT INTO articles (designation, categorie, prix, stock,
description) VALUES
('Stylo Bic','Fournitures',0.50,100,'Stylo bille bleu'),
('Cahier A4 100p','Fournitures',2.00,50,'Cahier ligné 100 pages');
-- Vérifier
SELECT * FROM clients;
SELECT * FROM articles;
2) Structure du projet Java (proposée)
Je vous conseille un projet Maven (gère la dépendance mysql-connector-java).
Structure recommandée :
gestion-commande/
├─ [Link]
└─ src/main/java/
└─ com/gestioncommande/
├─ [Link] // main
├─ util/[Link] // connexion JDBC
├─ model/
│ ├─ [Link]
│ ├─ [Link]
│ ├─ [Link]
│ └─ [Link]
├─ dao/
│ ├─ [Link]
│ ├─ [Link]
│ └─ [Link]
└─ ui/
├─ [Link]
├─ [Link]
├─ [Link]
└─ [Link]
Je fournis ci-dessous les fichiers essentiels. Copiez-les (même sans Maven, vous
pouvez ajouter le .jar du connector dans le classpath).
[Link] (option Maven)
Si vous utilisez Maven (recommandé), créez ce [Link] pour récupérer le driver
MySQL.
<project xmlns="[Link] ...>
<modelVersion>4.0.0</modelVersion>
<groupId>[Link]</groupId>
<artifactId>gestion-commande</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<[Link]>17</[Link]>
<[Link]>17</[Link]>
</properties>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.1.0</version>
</dependency>
</dependencies>
</project>
Si vous n'utilisez pas Maven : téléchargez mysql-connector-java et ajoutez le jar
dans Project Structure -> Libraries d'IntelliJ.
3) Code Java (essentiel)
Remarque : adaptez l’URL/username/password de connexion dans DBConnection
(voir instructions plus bas).
[Link]
package [Link];
import [Link];
import [Link];
import [Link];
public class DBConnection {
// ADAPTEZ ces paramètres selon votre installation MySQL
private static final String URL =
"jdbc:mysql://localhost:3306/gestion_commande?serverTimezone=UTC&use
SSL=false";
private static final String USER = "root";
private static final String PASS = "votre_mot_de_passe";
static {
try {
[Link]("[Link]");
} catch (ClassNotFoundException e) {
[Link]("MySQL JDBC Driver introuvable.
Ajoutez le connector dans le classpath.");
[Link]();
}
}
public static Connection getConnection() throws SQLException {
return [Link](URL, USER, PASS);
}
}
model/[Link]
package [Link];
public class Client {
private int id;
private String nom;
private String prenom;
private String sexe;
private String typeClient;
private String contact;
private String email;
private String adresse;
private int etat; // 1 = actif, 0 = inactif
public Client() {}
public Client(int id, String nom, String prenom) {
[Link] = id; [Link] = nom; [Link] = prenom;
}
public Client(String nom, String prenom, String sexe, String
typeClient, String contact, String email, String adresse) {
[Link] = nom; [Link] = prenom; [Link] = sexe;
[Link] = typeClient;
[Link] = contact; [Link] = email; [Link] =
adresse; [Link] = 1;
}
// getters & setters
public int getId() { return id; }
public void setId(int id) { [Link] = id; }
public String getNom() { return nom; }
public void setNom(String nom) { [Link] = nom; }
public String getPrenom() { return prenom; }
public void setPrenom(String prenom) { [Link] = prenom; }
public String getSexe() { return sexe; }
public void setSexe(String sexe) { [Link] = sexe; }
public String getTypeClient() { return typeClient; }
public void setTypeClient(String typeClient) { [Link] =
typeClient; }
public String getContact() { return contact; }
public void setContact(String contact) { [Link] = contact;
}
public String getEmail() { return email; }
public void setEmail(String email) { [Link] = email; }
public String getAdresse() { return adresse; }
public void setAdresse(String adresse) { [Link] = adresse;
}
public int getEtat() { return etat; }
public void setEtat(int etat) { [Link] = etat; }
@Override
public String toString() {
return id + " - " + nom + " " + prenom;
}
}
model/[Link]
package [Link];
public class Article {
private int id;
private String designation;
private String categorie;
private double prix;
private int stock;
private int etat;
public Article() {}
public Article(String designation, String categorie, double
prix, int stock) {
[Link] = designation; [Link] = categorie;
[Link] = prix; [Link] = stock; [Link] = 1;
}
// getters & setters...
public int getId() { return id; }
public void setId(int id) { [Link] = id; }
public String getDesignation() { return designation; }
public void setDesignation(String designation) {
[Link] = designation; }
public String getCategorie() { return categorie; }
public void setCategorie(String categorie) { [Link] =
categorie; }
public double getPrix() { return prix; }
public void setPrix(double prix) { [Link] = prix; }
public int getStock() { return stock; }
public void setStock(int stock) { [Link] = stock; }
public int getEtat() { return etat; }
public void setEtat(int etat) { [Link] = etat; }
@Override
public String toString() {
return id + " - " + designation + " (stock: " + stock + ")";
}
}
model/[Link]
package [Link];
public class OrderItem {
private int id;
private Article article;
private int quantite;
private double prixUnitaire;
public OrderItem(Article article, int quantite) {
[Link] = article;
[Link] = quantite;
[Link] = [Link]();
}
public double getTotalLigne() { return prixUnitaire * quantite;
}
// getters & setters...
}
model/[Link]
package [Link];
import [Link];
import [Link];
import [Link];
public class Commande {
private int id;
private int clientId;
private LocalDateTime dateCommande;
private String typeCommande;
private boolean validated;
private double total;
private List<OrderItem> items = new ArrayList<>();
public void addItem(OrderItem it) {
[Link](it);
recomputeTotal();
}
public void recomputeTotal() {
total =
[Link]().mapToDouble(OrderItem::getTotalLigne).sum();
}
// getters & setters...
}
dao/[Link]
package [Link];
import [Link];
import [Link];
import [Link].*;
import [Link];
import [Link];
public class ClientDAO {
public void create(Client c) throws SQLException {
String sql = "INSERT INTO clients (nom, prenom, sexe,
type_client, contact, email, adresse, etat) VALUES
(?,?,?,?,?,?,?,?)";
try (Connection conn = [Link]();
PreparedStatement ps = [Link](sql,
Statement.RETURN_GENERATED_KEYS)) {
[Link](1, [Link]());
[Link](2, [Link]());
[Link](3, [Link]());
[Link](4, [Link]());
[Link](5, [Link]());
[Link](6, [Link]());
[Link](7, [Link]());
[Link](8, [Link]());
[Link]();
try (ResultSet rs = [Link]()) {
if ([Link]()) [Link]([Link](1));
}
}
}
public List<Client> findAll() throws SQLException {
List<Client> list = new ArrayList<>();
String sql = "SELECT id, nom, prenom, sexe, type_client,
contact, email, adresse, etat FROM clients";
try (Connection conn = [Link]();
Statement st = [Link]();
ResultSet rs = [Link](sql)) {
while ([Link]()) {
Client c = new Client();
[Link]([Link]("id"));
[Link]([Link]("nom"));
[Link]([Link]("prenom"));
[Link]([Link]("sexe"));
[Link]([Link]("type_client"));
[Link]([Link]("contact"));
[Link]([Link]("email"));
[Link]([Link]("adresse"));
[Link]([Link]("etat"));
[Link](c);
}
}
return list;
}
public void update(Client c) throws SQLException {
String sql = "UPDATE clients SET nom=?, prenom=?, sexe=?,
type_client=?, contact=?, email=?, adresse=?, etat=? WHERE id=?";
try (Connection conn = [Link]();
PreparedStatement ps = [Link](sql)) {
[Link](1, [Link]());
[Link](2, [Link]());
[Link](3, [Link]());
[Link](4, [Link]());
[Link](5, [Link]());
[Link](6, [Link]());
[Link](7, [Link]());
[Link](8, [Link]());
[Link](9, [Link]());
[Link]();
}
}
public void setEtat(int id, int etat) throws SQLException {
String sql = "UPDATE clients SET etat=? WHERE id=?";
try (Connection conn = [Link]();
PreparedStatement ps = [Link](sql)) {
[Link](1, etat);
[Link](2, id);
[Link]();
}
}
}
dao/[Link]
package [Link];
import [Link];
import [Link];
import [Link].*;
import [Link];
import [Link];
public class ArticleDAO {
public void create(Article a) throws SQLException {
String sql = "INSERT INTO articles (designation, categorie,
prix, stock, description, etat) VALUES (?,?,?,?,?,?)";
try (Connection conn = [Link]();
PreparedStatement ps = [Link](sql,
Statement.RETURN_GENERATED_KEYS)) {
[Link](1, [Link]());
[Link](2, [Link]());
[Link](3, [Link]());
[Link](4, [Link]());
[Link](5, "");
[Link](6, [Link]());
[Link]();
try (ResultSet rs = [Link]()) {
if ([Link]()) [Link]([Link](1));
}
}
}
public List<Article> findAll() throws SQLException {
List<Article> list = new ArrayList<>();
String sql = "SELECT id, designation, categorie, prix,
stock, etat FROM articles";
try (Connection conn = [Link]();
Statement st = [Link]();
ResultSet rs = [Link](sql)) {
while ([Link]()) {
Article a = new Article();
[Link]([Link]("id"));
[Link]([Link]("designation"));
[Link]([Link]("categorie"));
[Link]([Link]("prix"));
[Link]([Link]("stock"));
[Link]([Link]("etat"));
[Link](a);
}
}
return list;
}
public Article findById(int id) throws SQLException {
String sql = "SELECT id, designation, categorie, prix,
stock, etat FROM articles WHERE id=?";
try (Connection conn = [Link]();
PreparedStatement ps = [Link](sql)) {
[Link](1, id);
try (ResultSet rs = [Link]()) {
if ([Link]()) {
Article a = new Article();
[Link]([Link]("id"));
[Link]([Link]("designation"));
[Link]([Link]("categorie"));
[Link]([Link]("prix"));
[Link]([Link]("stock"));
[Link]([Link]("etat"));
return a;
}
}
}
return null;
}
public void updateStock(int articleId, int newStock) throws
SQLException {
String sql = "UPDATE articles SET stock=? WHERE id=?";
try (Connection conn = [Link]();
PreparedStatement ps = [Link](sql)) {
[Link](1, newStock);
[Link](2, articleId);
[Link]();
}
}
}
dao/[Link] (création de commande avec transaction)
package [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
public class CommandeDAO {
public int createCommande(Commande cmd) throws SQLException {
String insertCommande = "INSERT INTO commandes (client_id,
type_commande, validated, total) VALUES (?,?,?,?)