0% ont trouvé ce document utile (0 vote)
2 vues66 pages

Support de Cours Java 2

Transféré par

blackwolffx15
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
2 vues66 pages

Support de Cours Java 2

Transféré par

blackwolffx15
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

🎓 Support de Cours Java, L2

Monsieur Diop, Serigne Mbacke


1. Les Collections en Java - Les Listes

1.1 Introduction aux Collections

Les collections en Java sont des structures de données qui permettent de stocker et manipuler des groupes d'objets.
Elles font partie du framework Java Collections (package [Link]).

1.2 ArrayList

ArrayList est une liste dynamique basée sur un tableau redimensionnable. Elle permet un accès rapide aux éléments
par index.

Caractéristiques:

Accès rapide par index

Insertion/Suppression lente au milieu

Taille dynamique

Autorise les doublons

Maintient l'ordre d'insertion


Exemple d'utilisation:

import [Link];

public class ExempleArrayList {


public static void main(String[] args) {
// Création d'une ArrayList
ArrayList<String> etudiants = new ArrayList<>();

// Ajout d'éléments
[Link]("Amadou");
[Link]("Fatou");
[Link]("Moussa");
[Link]("Awa");

// Accès par index


[Link]("Premier étudiant: " + [Link](0));

// Modification
[Link](1, "Fatoumata");

// Taille de la liste
[Link]("Nombre d'étudiants: " + [Link]());
// Parcours de la liste
for (String etudiant : etudiants) {
[Link]("Étudiant: " + etudiant);
}

// Suppression
[Link]("Moussa");
[Link](0); // Suppression par index

// Vérification
if ([Link]("Awa")) {
[Link]("Awa est dans la liste");
}
}
}

1.3 LinkedList

LinkedList est une liste doublement chaînée. Chaque élément pointe vers le suivant et le précédent.

Caractéristiques:

Insertion/Suppression rapide au début et à la fin


Accès par index plus lent

Consomme plus de mémoire (pointeurs supplémentaires)

Idéale pour les files et piles

Exemple d'utilisation:

import [Link];

public class ExempleLinkedList {


public static void main(String[] args) {
LinkedList<Integer> nombres = new LinkedList<>();

// Ajout en fin
[Link](10);
[Link](20);
[Link](30);

// Ajout au début
[Link](5);

// Ajout à la fin
[Link](40);
// Utilisation comme file (Queue)
[Link]("Premier élément: " + [Link]());
[Link]("Retirer premier: " + [Link]());

// Utilisation comme pile (Stack)


[Link](100); // Ajoute au début
[Link]("Sommet: " + [Link]());

// Parcours
for (Integer nombre : nombres) {
[Link](nombre);
}
}
}

💡 Conseil: Utilisez ArrayList pour un accès fréquent par index, et LinkedList pour des insertions/suppressions
fréquentes au début ou à la fin.

1.4 Set (Interface)

Set est une interface qui représente une collection ne contenant pas de doublons. Les principales implémentations
sont HashSet et TreeSet.
1.5 HashSet

HashSet utilise une table de hachage pour stocker les éléments. Il ne garantit pas l'ordre.

Caractéristiques:

Pas de doublons

Pas d'ordre garanti

Opérations rapides

Autorise un élément null

Exemple d'utilisation:

import [Link];

public class ExempleHashSet {


public static void main(String[] args) {
HashSet<String> villes = new HashSet<>();

// Ajout d'éléments
[Link]("Dakar");
[Link]("Saint-Louis");
[Link]("Thiès");
[Link]("Dakar"); // Ne sera pas ajouté (doublon)

[Link]("Taille: " + [Link]()); // Affiche 3

// Vérification
if ([Link]("Dakar")) {
[Link]("Dakar est dans le set");
}

// Parcours (ordre non garanti)


for (String ville : villes) {
[Link](ville);
}

// Suppression
[Link]("Thiès");

// Opérations ensemblistes
HashSet<String> autresVilles = new HashSet<>();
[Link]("Dakar");
[Link]("Ziguinchor");

// Union
HashSet<String> union = new HashSet<>(villes);
[Link](autresVilles);
// Intersection
HashSet<String> intersection = new HashSet<>(villes);
[Link](autresVilles);
}
}

1.6 TreeSet

TreeSet utilise un arbre rouge-noir pour stocker les éléments dans un ordre trié.

Caractéristiques:

Pas de doublons

Éléments triés automatiquement

Opérations plus lentes que HashSet

N'autorise pas null

Exemple d'utilisation:
import [Link];

public class ExempleTreeSet {


public static void main(String[] args) {
TreeSet<Integer> notes = new TreeSet<>();

// Ajout d'éléments (seront triés automatiquement)


[Link](15);
[Link](12);
[Link](18);
[Link](10);
[Link](15); // Ne sera pas ajouté

// Parcours (ordre croissant)


for (Integer note : notes) {
[Link](note); // Affiche: 10, 12, 15, 18
}

// Méthodes spécifiques
[Link]("Plus petite note: " + [Link]());
[Link]("Plus grande note: " + [Link]());
[Link]("Note > 12: " + [Link](12));
[Link]("Note < 15: " + [Link](15));
// Sous-ensembles
[Link]("Notes >= 12 et < 18: " + [Link](12, 18));
[Link]("Notes < 15: " + [Link](15));
[Link]("Notes >= 15: " + [Link](15));
}
}

1.7 Tableau Comparatif

Collection Ordre Doublons Performance Utilisation

ArrayList Maintenu Oui Accès rapide Accès fréquent par index

LinkedList Maintenu Oui Insert/Delete rapide Files, piles

HashSet Non garanti Non Très rapide Unicité des éléments

TreeSet Trié Non Moyenne Éléments triés uniques


2. La Gestion des Exceptions

2.1 Introduction

Une exception est un événement qui perturbe le déroulement normal d'un programme. Java utilise un mécanisme
robuste pour gérer ces situations.

2.2 Hiérarchie des Exceptions

Throwable
├── Error (erreurs système graves)
└── Exception
├── RuntimeException (non vérifiées)
│ ├── NullPointerException
│ ├── ArrayIndexOutOfBoundsException
│ └── ArithmeticException
└── Exception vérifiées
├── IOException
├── SQLException
└── ClassNotFoundException
2.3 Try-Catch-Finally

public class ExempleExceptions {


public static void main(String[] args) {
// Exemple 1: Division par zéro
try {
int resultat = 10 / 0;
} catch (ArithmeticException e) {
[Link]("Erreur: Division par zéro!");
[Link]("Message: " + [Link]());
}

// Exemple 2: Accès à un tableau


try {
int[] tableau = {1, 2, 3};
[Link](tableau[5]);
} catch (ArrayIndexOutOfBoundsException e) {
[Link]("Index invalide!");
}

// Exemple 3: Multiple catch


try {
String texte = null;
[Link]([Link]());
} catch (NullPointerException e) {
[Link]("Objet null!");
} catch (Exception e) {
[Link]("Autre erreur: " + e);
}

// Exemple 4: Finally (toujours exécuté)


try {
int[] nombres = {1, 2, 3};
[Link](nombres[1]);
} catch (Exception e) {
[Link]("Erreur: " + e);
} finally {
[Link]("Bloc finally toujours exécuté");
}
}
}

2.4 Créer ses Propres Exceptions

// Définition d'une exception personnalisée


class NoteInvalideException extends Exception {
public NoteInvalideException(String message) {
super(message);
}
}

public class GestionNotes {


public static void verifierNote(int note) throws NoteInvalideException {
if (note < 0 || note > 20) {
throw new NoteInvalideException("La note doit être entre 0 et 20");
}
[Link]("Note valide: " + note);
}

public static void main(String[] args) {


try {
verifierNote(15); // OK
verifierNote(25); // Lance une exception
} catch (NoteInvalideException e) {
[Link]("Erreur: " + [Link]());
}
}
}

2.5 Try-with-Resources
Pour fermer automatiquement les ressources (fichiers, connexions, etc.):

import [Link].*;

public class TryWithResources {


public static void main(String[] args) {
// Les ressources sont fermées automatiquement
try (BufferedReader br = new BufferedReader(new FileReader("[Link]"))) {
String ligne = [Link]();
[Link](ligne);
} catch (IOException e) {
[Link]("Erreur de lecture: " + [Link]());
}
// Pas besoin de finally pour fermer br
}
}

⚠️ Important: Toujours gérer les exceptions de manière spécifique. Évitez d'utiliser catch(Exception e) sauf
nécessité absolue.
3. Manipulation des Fichiers

3.1 Lecture de Fichiers

Méthode 1: BufferedReader

import [Link].*;

public class LectureFichier {


public static void main(String[] args) {
String nomFichier = "[Link]";

try (BufferedReader br = new BufferedReader(new FileReader(nomFichier))) {


String ligne;
while ((ligne = [Link]()) != null) {
[Link](ligne);
}
} catch (FileNotFoundException e) {
[Link]("Fichier non trouvé: " + nomFichier);
} catch (IOException e) {
[Link]("Erreur de lecture: " + [Link]());
}
}
}

Méthode 2: Scanner

import [Link].*;
import [Link];

public class LectureAvecScanner {


public static void main(String[] args) {
try {
File fichier = new File("[Link]");
Scanner scanner = new Scanner(fichier);

while ([Link]()) {
String ligne = [Link]();
[Link](ligne);
}

[Link]();
} catch (FileNotFoundException e) {
[Link]("Fichier introuvable");
}
}
}

3.2 Écriture dans les Fichiers

Méthode 1: BufferedWriter

import [Link].*;

public class EcritureFichier {


public static void main(String[] args) {
String nomFichier = "[Link]";

try (BufferedWriter bw = new BufferedWriter(new FileWriter(nomFichier))) {


[Link]("Première ligne");
[Link]();
[Link]("Deuxième ligne");
[Link]();
[Link]("Troisième ligne");

[Link]("Écriture réussie!");
} catch (IOException e) {
[Link]("Erreur d'écriture: " + [Link]());
}
}
}

Méthode 2: PrintWriter

import [Link].*;

public class EcritureAvecPrintWriter {


public static void main(String[] args) {
try (PrintWriter pw = new PrintWriter(new FileWriter("[Link]", true))) {
// true pour ajouter à la fin (append)
[Link]("Amadou: 15");
[Link]("Fatou: 18");
[Link]("Moussa: %d%n", 16);

[Link]("Notes enregistrées!");
} catch (IOException e) {
[Link]();
}
}
}

3.3 Opérations sur les Fichiers

import [Link];

public class OperationsFichiers {


public static void main(String[] args) {
File fichier = new File("[Link]");

// Vérifier l'existence
if ([Link]()) {
[Link]("Le fichier existe");

// Informations sur le fichier


[Link]("Nom: " + [Link]());
[Link]("Chemin: " + [Link]());
[Link]("Taille: " + [Link]() + " octets");
[Link]("Lecture: " + [Link]());
[Link]("Écriture: " + [Link]());
[Link]("Fichier: " + [Link]());
[Link]("Dossier: " + [Link]());
} else {
[Link]("Le fichier n'existe pas");
}

// Créer un fichier
try {
if ([Link]()) {
[Link]("Fichier créé");
}
} catch (IOException e) {
[Link]();
}

// Supprimer un fichier
if ([Link]()) {
[Link]("Fichier supprimé");
}

// Créer un dossier
File dossier = new File("mon_dossier");
if ([Link]()) {
[Link]("Dossier créé");
}

// Lister les fichiers d'un dossier


File repertoire = new File(".");
String[] fichiers = [Link]();
if (fichiers != null) {
for (String nom : fichiers) {
[Link](nom);
}
}
}
}
4. Les Threads - Programmation Concurrente

4.1 Introduction aux Threads

Un thread (fil d'exécution) est une unité d'exécution indépendante au sein d'un programme. Les threads permettent
d'exécuter plusieurs tâches simultanément (multitâche).

📌 Pourquoi utiliser les threads ?


Améliorer les performances sur les processeurs multi-cœurs

Effectuer des tâches en arrière-plan (téléchargements, calculs)

Garder l'interface utilisateur réactive

Gérer plusieurs clients simultanément (serveurs)

4.2 Créer un Thread - Méthode 1: Hériter de Thread

public class MonThread extends Thread {


private String nom;
public MonThread(String nom) {
[Link] = nom;
}

@Override
public void run() {
// Code exécuté par le thread
for (int i = 1; i <= 5; i++) {
[Link](nom + " - Compteur: " + i);

try {
// Pause de 1 seconde
[Link](1000);
} catch (InterruptedException e) {
[Link](nom + " interrompu");
}
}
[Link](nom + " terminé!");
}

public static void main(String[] args) {


// Créer et démarrer les threads
MonThread thread1 = new MonThread("Thread-1");
MonThread thread2 = new MonThread("Thread-2");
[Link](); // Démarre l'exécution
[Link]();

[Link]("Threads démarrés!");
}
}

4.3 Créer un Thread - Méthode 2: Implémenter Runnable (Recommandé)

Cette méthode est préférable car elle permet d'hériter d'une autre classe.

public class MonRunnable implements Runnable {


private String nom;

public MonRunnable(String nom) {


[Link] = nom;
}

@Override
public void run() {
for (int i = 1; i <= 5; i++) {
[Link](nom + " - Compteur: " + i);
try {
[Link](1000);
} catch (InterruptedException e) {
[Link]();
}
}
}

public static void main(String[] args) {


// Créer les Runnable
MonRunnable runnable1 = new MonRunnable("Runnable-1");
MonRunnable runnable2 = new MonRunnable("Runnable-2");

// Créer les threads avec les Runnable


Thread thread1 = new Thread(runnable1);
Thread thread2 = new Thread(runnable2);

// Démarrer
[Link]();
[Link]();
}
}
4.4 Créer un Thread - Méthode 3: Expression Lambda (Java 8+)

public class ThreadLambda {


public static void main(String[] args) {

// Avec expression lambda


Thread thread1 = new Thread(() -> {
for (int i = 1; i <= 5; i++) {
[Link]("Lambda Thread - " + i);
try {
[Link](500);
} catch (InterruptedException e) {
[Link]();
}
}
});

[Link]();

// Version encore plus courte


new Thread(() -> {
[Link]("Thread rapide exécuté!");
}).start();
}
}

4.5 Cycle de Vie d'un Thread

// États d'un thread:


// 1. NEW - Thread créé mais pas démarré
Thread t = new Thread(runnable);

// 2. RUNNABLE - Thread en cours d'exécution


[Link]();

// 3. BLOCKED/WAITING - Thread en attente


// 4. TIMED_WAITING - Thread en attente avec timeout
[Link](1000);

// 5. TERMINATED - Thread terminé

4.6 Méthodes Importantes des Threads


public class MethodesThreads {
public static void main(String[] args) throws InterruptedException {

Thread thread = new Thread(() -> {


for (int i = 0; i < 10; i++) {
[Link]("Travail en cours... " + i);
try {
[Link](500);
} catch (InterruptedException e) {
[Link]("Thread interrompu!");
return; // Sortir si interrompu
}
}
});

[Link]();

// Obtenir le nom du thread


[Link]("Nom: " + [Link]());

// Définir un nom
[Link]("MonThreadPersonnalisé");

// Obtenir la priorité (1-10, défaut: 5)


[Link]("Priorité: " + [Link]());

// Définir la priorité
[Link](Thread.MAX_PRIORITY); // 10

// Vérifier si le thread est vivant


[Link]("Est vivant: " + [Link]());

// Attendre que le thread se termine


[Link](); // Le thread principal attend

[Link]("Thread terminé");

// Obtenir le thread actuel


Thread threadActuel = [Link]();
[Link]("Thread principal: " + [Link]());
}
}

4.7 Synchronisation - Éviter les Problèmes de Concurrence

Quand plusieurs threads accèdent aux mêmes données, il faut synchroniser l'accès.
Problème sans synchronisation:

class Compteur {
private int compte = 0;

public void incrementer() {


compte++; // Opération non atomique!
}

public int getCompte() {


return compte;
}
}

public class ProblemeSynchronisation {


public static void main(String[] args) throws InterruptedException {
Compteur compteur = new Compteur();

// Créer 1000 threads qui incrémentent


Thread[] threads = new Thread[1000];
for (int i = 0; i < 1000; i++) {
threads[i] = new Thread(() -> {
for (int j = 0; j < 100; j++) {
[Link]();
}
});
threads[i].start();
}

// Attendre tous les threads


for (Thread t : threads) {
[Link]();
}

// Résultat attendu: 100000, mais souvent inférieur!


[Link]("Compte final: " + [Link]());
}
}

Solution avec synchronized:

class CompteurSynchronise {
private int compte = 0;

// Méthode synchronisée
public synchronized void incrementer() {
compte++;
}

public synchronized int getCompte() {


return compte;
}
}

public class SolutionSynchronisation {


public static void main(String[] args) throws InterruptedException {
CompteurSynchronise compteur = new CompteurSynchronise();

Thread[] threads = new Thread[1000];


for (int i = 0; i < 1000; i++) {
threads[i] = new Thread(() -> {
for (int j = 0; j < 100; j++) {
[Link]();
}
});
threads[i].start();
}

for (Thread t : threads) {


[Link]();
}
// Résultat garanti: 100000
[Link]("Compte final: " + [Link]());
}
}

Bloc synchronized:

class GestionRessource {
private int valeur = 0;

public void modifier() {


// Code non synchronisé
[Link]("Préparation...");

// Seul ce bloc est synchronisé


synchronized(this) {
valeur++;
[Link]("Valeur: " + valeur);
}

// Code non synchronisé


[Link]("Terminé");
}
}

4.8 Exemple Pratique: Producteur-Consommateur

import [Link];
import [Link];

class Buffer {
private Queue<Integer> queue = new LinkedList<>();
private int capacite = 5;

public synchronized void produire(int valeur) throws InterruptedException {


// Attendre si le buffer est plein
while ([Link]() == capacite) {
[Link]("Buffer plein, producteur en attente...");
wait();
}

[Link](valeur);
[Link]("Produit: " + valeur + " | Taille: " + [Link]());

// Notifier les consommateurs


notifyAll();
}

public synchronized int consommer() throws InterruptedException {


// Attendre si le buffer est vide
while ([Link]()) {
[Link]("Buffer vide, consommateur en attente...");
wait();
}

int valeur = [Link]();


[Link]("Consommé: " + valeur + " | Taille: " + [Link]());

// Notifier les producteurs


notifyAll();
return valeur;
}
}

public class ProducteurConsommateur {


public static void main(String[] args) {
Buffer buffer = new Buffer();

// Thread producteur
Thread producteur = new Thread(() -> {
for (int i = 1; i <= 10; i++) {
try {
[Link](i);
[Link](500);
} catch (InterruptedException e) {
[Link]();
}
}
});

// Thread consommateur
Thread consommateur = new Thread(() -> {
for (int i = 1; i <= 10; i++) {
try {
[Link]();
[Link](1000);
} catch (InterruptedException e) {
[Link]();
}
}
});

[Link]();
[Link]();
}
}

4.9 ExecutorService - Gestion Avancée des Threads

ExecutorService facilite la gestion d'un pool de threads.

import [Link].*;

public class ExempleExecutor {


public static void main(String[] args) {

// Créer un pool de 3 threads


ExecutorService executor = [Link](3);

// Soumettre des tâches


for (int i = 1; i <= 10; i++) {
final int taskId = i;
[Link](() -> {
[Link]("Tâche " + taskId +
" exécutée par " + [Link]().getName());
try {
[Link](2000);
} catch (InterruptedException e) {
[Link]();
}
});
}

// Arrêter l'executor (important!)


[Link]();

try {
// Attendre que toutes les tâches soient terminées
if (![Link](60, [Link])) {
[Link]();
}
} catch (InterruptedException e) {
[Link]();
}

[Link]("Toutes les tâches sont terminées");


}
}

4.10 Callable et Future - Threads avec Valeur de Retour


import [Link].*;

public class ExempleCallable {


public static void main(String[] args) throws Exception {

ExecutorService executor = [Link]();

// Callable retourne une valeur


Callable<Integer> tache = () -> {
[Link]("Calcul en cours...");
[Link](3000);
return 42; // Résultat du calcul
};

// Soumettre la tâche et obtenir un Future


Future<Integer> future = [Link](tache);

[Link]("Tâche soumise, en attente du résultat...");

// Faire autre chose pendant le calcul


[Link]("Je peux faire autre chose ici!");

// Obtenir le résultat (bloque jusqu'à ce que disponible)


Integer resultat = [Link]();
[Link]("Résultat: " + resultat);

[Link]();
}
}

⚠️ Points Importants sur les Threads:

Toujours utiliser start() et non run() pour démarrer un thread

Synchroniser l'accès aux ressources partagées

Fermer les ExecutorService avec shutdown()

Gérer les InterruptedException correctement

Éviter les deadlocks (verrouillages mortels)


5. Connexion aux Bases de Données avec JDBC

5.1 Introduction à JDBC

JDBC (Java Database Connectivity) est une API Java permettant de se connecter et d'interagir avec des bases de
données relationnelles.

5.2 Étapes de Connexion

1. Charger le pilote JDBC

2. Établir la connexion

3. Créer un Statement

4. Exécuter des requêtes SQL

5. Traiter les résultats

6. Fermer les ressources

5.3 Exemple Complet avec MySQL


📌 Prérequis: Ajouter le driver MySQL ([Link]) au classpath du projet.

import [Link].*;

public class ExempleJDBC {


// Informations de connexion
private static final String URL = "jdbc:mysql://localhost:3306/ma_base";
private static final String USER = "root";
private static final String PASSWORD = "motdepasse";

public static void main(String[] args) {


Connection conn = null;
Statement stmt = null;
ResultSet rs = null;

try {
// 1. Charger le driver (optionnel depuis JDBC 4.0)
[Link]("[Link]");

// 2. Établir la connexion
conn = [Link](URL, USER, PASSWORD);
[Link]("Connexion réussie!");
// 3. Créer un Statement
stmt = [Link]();

// 4. Exécuter une requête SELECT


String sql = "SELECT * FROM etudiants";
rs = [Link](sql);

// 5. Traiter les résultats


while ([Link]()) {
int id = [Link]("id");
String nom = [Link]("nom");
String prenom = [Link]("prenom");
int age = [Link]("age");

[Link]("ID: " + id + ", Nom: " + nom +


" " + prenom + ", Age: " + age);
}

} catch (ClassNotFoundException e) {
[Link]("Driver non trouvé: " + [Link]());
} catch (SQLException e) {
[Link]("Erreur SQL: " + [Link]());
[Link]();
} finally {
// 6. Fermer les ressources (dans l'ordre inverse)
try {
if (rs != null) [Link]();
if (stmt != null) [Link]();
if (conn != null) [Link]();
} catch (SQLException e) {
[Link]();
}
}
}
}

5.4 Insertion de Données

public class InsertionJDBC {


public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/ma_base";
String user = "root";
String password = "motdepasse";

try (Connection conn = [Link](url, user, password);


Statement stmt = [Link]()) {

// Insertion simple
String sql = "INSERT INTO etudiants (nom, prenom, age) " +
"VALUES ('Diop', 'Amadou', 22)";
int rowsAffected = [Link](sql);

[Link](rowsAffected + " ligne(s) insérée(s)");

} catch (SQLException e) {
[Link]("Erreur: " + [Link]());
}
}
}

5.5 PreparedStatement (Recommandé)

PreparedStatement est plus sûr et plus performant que Statement.

public class PreparedStatementExample {


public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/ma_base";
String user = "root";
String password = "motdepasse";

// Requête avec paramètres


String sql = "INSERT INTO etudiants (nom, prenom, age) VALUES (?, ?, ?)";

try (Connection conn = [Link](url, user, password);


PreparedStatement pstmt = [Link](sql)) {

// Définir les paramètres (index commence à 1)


[Link](1, "Fall");
[Link](2, "Fatou");
[Link](3, 21);

// Exécuter
int rows = [Link]();
[Link](rows + " ligne(s) insérée(s)");

// Réutiliser le PreparedStatement
[Link](1, "Sow");
[Link](2, "Moussa");
[Link](3, 23);
[Link]();

} catch (SQLException e) {
[Link]();
}
}
}

5.6 Mise à Jour et Suppression

public class UpdateDeleteJDBC {


public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/ma_base";

try (Connection conn = [Link](url, "root", "motdepasse")) {

// UPDATE
String updateSQL = "UPDATE etudiants SET age = ? WHERE nom = ?";
try (PreparedStatement pstmt = [Link](updateSQL)) {
[Link](1, 24);
[Link](2, "Diop");
int rows = [Link]();
[Link](rows + " ligne(s) mise(s) à jour");
}

// DELETE
String deleteSQL = "DELETE FROM etudiants WHERE age < ?";
try (PreparedStatement pstmt = [Link](deleteSQL)) {
[Link](1, 18);
int rows = [Link]();
[Link](rows + " ligne(s) supprimée(s)");
}

} catch (SQLException e) {
[Link]();
}
}
}

5.7 Gestion des Transactions

public class TransactionExample {


public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/ma_base";

try (Connection conn = [Link](url, "root", "motdepasse")) {

// Désactiver l'auto-commit
[Link](false);

try (PreparedStatement pstmt1 = [Link](


"INSERT INTO etudiants (nom, prenom, age) VALUES (?, ?, ?)");
PreparedStatement pstmt2 = [Link](
"UPDATE etudiants SET age = age + 1 WHERE nom = ?")) {

// Première opération
[Link](1, "Ndiaye");
[Link](2, "Awa");
[Link](3, 20);
[Link]();

// Deuxième opération
[Link](1, "Diop");
[Link]();

// Valider la transaction
[Link]();
[Link]("Transaction réussie!");

} catch (SQLException e) {
// En cas d'erreur, annuler la transaction
[Link]();
[Link]("Transaction annulée: " + [Link]());
}

} catch (SQLException e) {
[Link]();
}
}
}
6. Java Swing - Initiation aux Interfaces Graphiques

6.1 Introduction à Swing

Java Swing est une bibliothèque graphique pour créer des interfaces utilisateur (GUI). Elle fait partie de Java
Foundation Classes (JFC).

6.2 Première Fenêtre

import [Link].*;

public class PremierefenFenetre {


public static void main(String[] args) {
// Créer une fenêtre
JFrame fenetre = new JFrame("Ma Première Fenêtre");

// Définir la taille
[Link](400, 300);

// Positionner au centre de l'écran


[Link](null);
// Définir l'action de fermeture
[Link](JFrame.EXIT_ON_CLOSE);

// Rendre visible
[Link](true);
}
}

6.3 Composants de Base

JLabel - Étiquette

import [Link].*;
import [Link].*;

public class ExempleLabel {


public static void main(String[] args) {
JFrame fenetre = new JFrame("Exemple Label");
[Link](400, 200);
[Link](JFrame.EXIT_ON_CLOSE);
[Link](new FlowLayout());
// Créer un label
JLabel label = new JLabel("Bonjour Monsieur Diop!");
[Link](new Font("Arial", [Link], 16));
[Link]([Link]);

[Link](label);
[Link](true);
}
}

JButton - Bouton

import [Link].*;
import [Link].*;
import [Link].*;

public class ExempleBouton {


public static void main(String[] args) {
JFrame fenetre = new JFrame("Exemple Bouton");
[Link](300, 150);
[Link](JFrame.EXIT_ON_CLOSE);
[Link](new FlowLayout());
JLabel label = new JLabel("Cliquez sur le bouton");
JButton bouton = new JButton("Cliquer ici");

// Ajouter un événement au bouton


[Link](new ActionListener() {
public void actionPerformed(ActionEvent e) {
[Link]("Bouton cliqué!");
[Link](fenetre, "Vous avez cliqué!");
}
});

[Link](label);
[Link](bouton);
[Link](true);
}
}

JTextField - Champ de texte

import [Link].*;
import [Link].*;
import [Link].*;
public class ExempleTextField {
public static void main(String[] args) {
JFrame fenetre = new JFrame("Formulaire");
[Link](350, 150);
[Link](JFrame.EXIT_ON_CLOSE);
[Link](new FlowLayout());

JLabel labelNom = new JLabel("Nom:");


JTextField champNom = new JTextField(15);
JButton boutonValider = new JButton("Valider");
JLabel resultat = new JLabel("");

[Link](new ActionListener() {
public void actionPerformed(ActionEvent e) {
String nom = [Link]();
[Link]("Bonjour " + nom + "!");
}
});

[Link](labelNom);
[Link](champNom);
[Link](boutonValider);
[Link](resultat);
[Link](true);
}
}

6.4 Layouts (Gestionnaires de Disposition)

FlowLayout

// Les composants sont placés de gauche à droite


[Link](new FlowLayout());
[Link](bouton1);
[Link](bouton2);
[Link](bouton3);

BorderLayout

// 5 zones: NORTH, SOUTH, EAST, WEST, CENTER


[Link](new BorderLayout());
[Link](boutonHaut, [Link]);
[Link](boutonBas, [Link]);
[Link](boutonGauche, [Link]);
[Link](boutonDroit, [Link]);
[Link](panneauCentral, [Link]);

GridLayout

// Grille de lignes et colonnes


[Link](new GridLayout(3, 2)); // 3 lignes, 2 colonnes
[Link](new JButton("1"));
[Link](new JButton("2"));
[Link](new JButton("3"));
[Link](new JButton("4"));
[Link](new JButton("5"));
[Link](new JButton("6"));

6.5 Application Complète

import [Link].*;
import [Link].*;
import [Link].*;

public class CalculatriceSimple extends JFrame {


private JTextField champNombre1;
private JTextField champNombre2;
private JLabel labelResultat;

public CalculatriceSimple() {
// Configuration de la fenêtre
setTitle("Calculatrice Simple");
setSize(350, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setLayout(new GridLayout(5, 2, 10, 10));

// Création des composants


JLabel label1 = new JLabel("Nombre 1:");
champNombre1 = new JTextField();

JLabel label2 = new JLabel("Nombre 2:");


champNombre2 = new JTextField();

JButton btnAddition = new JButton("Addition");


JButton btnSoustraction = new JButton("Soustraction");
JButton btnMultiplication = new JButton("Multiplication");
JButton btnDivision = new JButton("Division");

JLabel labelRes = new JLabel("Résultat:");


labelResultat = new JLabel("0");
[Link](new Font("Arial", [Link], 16));

// Ajout des événements


[Link](e -> calculer('+'));
[Link](e -> calculer('-'));
[Link](e -> calculer('*'));
[Link](e -> calculer('/'));

// Ajout des composants


add(label1);
add(champNombre1);
add(label2);
add(champNombre2);
add(btnAddition);
add(btnSoustraction);
add(btnMultiplication);
add(btnDivision);
add(labelRes);
add(labelResultat);

setVisible(true);
}

private void calculer(char operation) {


try {
double nb1 = [Link]([Link]());
double nb2 = [Link]([Link]());
double resultat = 0;

switch (operation) {
case '+':
resultat = nb1 + nb2;
break;
case '-':
resultat = nb1 - nb2;
break;
case '*':
resultat = nb1 * nb2;
break;
case '/':
if (nb2 != 0) {
resultat = nb1 / nb2;
} else {
[Link](this,
"Division par zéro impossible!");
return;
}
break;
}
[Link]([Link](resultat));

} catch (NumberFormatException e) {
[Link](this,
"Veuillez entrer des nombres valides!");
}
}

public static void main(String[] args) {


new CalculatriceSimple();
}
}

6.6 Autres Composants Utiles

// JCheckBox - Case à cocher


JCheckBox caseJava = new JCheckBox("Java");
JCheckBox casePython = new JCheckBox("Python");

// JRadioButton - Bouton radio (sélection unique)


JRadioButton radioHomme = new JRadioButton("Homme");
JRadioButton radioFemme = new JRadioButton("Femme");
ButtonGroup groupe = new ButtonGroup();
[Link](radioHomme);
[Link](radioFemme);

// JComboBox - Liste déroulante


String[] villes = {"Dakar", "Thiès", "Saint-Louis", "Ziguinchor"};
JComboBox<String> comboVilles = new JComboBox<>(villes);

// JTextArea - Zone de texte multiligne


JTextArea textArea = new JTextArea(5, 20);
JScrollPane scrollPane = new JScrollPane(textArea);

// JPasswordField - Champ mot de passe


JPasswordField champMotDePasse = new JPasswordField(15);

💡 Conseil: Pour créer des interfaces plus modernes, explorez JavaFX qui est la technologie GUI
recommandée pour les nouvelles applications Java.
Conclusion
Ce support de cours couvre les bases essentielles du développement Java:

Collections: ArrayList, LinkedList, HashSet, TreeSet pour gérer des groupes de données

Exceptions: Gestion robuste des erreurs avec try-catch-finally

Fichiers: Lecture et écriture de fichiers avec différentes méthodes

Threads: Programmation concurrente et multitâche

JDBC: Connexion et manipulation de bases de données

Swing: Création d'interfaces graphiques utilisateur

📚 Pour aller plus loin:


Pratiquez régulièrement avec des exercices

Consultez la documentation officielle Java

Créez des projets personnels pour appliquer vos connaissances

Explorez les frameworks modernes (Spring, Hibernate, JavaFX)


Bon apprentissage, Monsieur Diop! 🎓

Vous aimerez peut-être aussi