# TP - JDBC pour manipuler une base de données Programmation Orientée Objet avec Java – Coda 1 ère année – 2026 ## Exercice 1 - rpg_character ### 1.1 - Créez un nouveau projet maven Il doit compiler en java version 25. - groupId : celui que vous avez utilisé dans le TP du Maven - artifactId : `tp-jdbc` ### 1.2 - Ajoutez la dépendance du driver JDBC de SQLite - groupId : `org.xerial` - artifactId : `sqlite-jdbc` - version : `3.51.0.0` ### 1.3 - Créer un package Créez un package correspondant au `groupId` de votre projet maven suivi de `.tp.jdbc.test`. Ex: si votre groupId était `foo.bar.baz`, le nom de votre package serait `foo.bar.baz.tp.jdbc.test`. ### 1.4 - Créer un programme principal Dans le package que vous venez de créer. Ajouter une nouvelle classe java nommée `TestJdbc`. Dans ce fichier ajouter le nécessaire pour que votre programme soit exécutable. Faites en sorte que ce programme principal affiche le texte suivant dans la console : ```text Je vais utiliser une base de données. ``` ### 1.5 - Se connecter à une base de données Dans le programme principal, créer **une connexion** à la base de données en lui donnant l'URL suivante : ```text jdbc:sqlite:test.db ``` **Vous devez gérer les exceptions potentielles** > 💡une connexion à une base de données est une resource `AutoCloseable` En cas d'exception du type `SQLException`, affichez un message d'erreur similaire au suivant : `"Erreur lors de la connexion à la base de données :"` suivi du message correspondant à l'exception. **Exécutez le programme** Un fichier `test.db` devrait être apparu à la racine de votre projet. ### 1.6 - Création du modèle de données Dans votre programme, créez un `Statement`. > 💡un Statement est une resource `AutoCloseable` Exécutez la requête suivante à l'aide du statement. ```sql CREATE TABLE IF NOT EXISTS rpg_character ( id integer not null constraint rpg_character_pk primary key autoincrement, name varchar(255) not null, hp integer not null, def integer not null, money integer not null, atk integer, heal integer ) ``` En cas d'erreur `SQLException`, le message suivant doit être affiché : `"Erreur lors de création de la table rpg_character : "` suivi du message correspondant à l'exception. ### 1.7 - Ouvrir la base de données dans IntelliJ IntelliJ dispose d'outils intégrés pour afficher et modifier des bases de données. Double-cliquez sur le fichier `test.db` à la racine de votre projet. Si nécessaire, télécharger le Driver SQLite. ![[intellij-db-test-sqlite.png]] Vérifier la connexion en cliquant sur "Test Connection" ![[intellij-db-test-sqlite-verify-connection.png]] Valider en cliquant sur "OK" --- Ouvrir le menu latéral et les outils de base de données Déplier la base de données `table` jusqu'à voir les colonnes de la table `rpg_character` ![[intellij-db-unfold-table.png]] ### 1.8 - voir les données de la table Double-cliquer sur la table `rpg_character`. ![[intellij-db-open-table.png]] Une vue en tableau apparait. ### 1.9 - Ajouter des lignes Dans la vue tableau, ajouter des lignes. Puis "submit". ![[intellij-db-table-insert-row-submit.png]] La table devrait se mettre à jour; ![[intellij-db-table-rows-inserted.png]] ### 1.10 - Voir le code SQL exécuté par IntelliJ IntelliJ exécute du code SQL pour nous. Nous pouvons le voir dans la partie "Services" en dépliant "Database", puis `test`, puis `rpg_character`. ![[intellij-services-database-test-rpg_character.png]] Nous pourrons nous servir de ces requêtes par la suite dans notre programme. ### 1.11 - Utiliser la Query console - Retourner dans le menu de base de données - Jump to query console - Choisir la query console par défaut Une zone de texte apparait sur la gauche. Dans cette zone de texte, saisir la requête suivante : ```sql SELECT * FROM rpg_character; ``` Puis exécuter la requête. Le résultat s'affiche dans le menu "Services" en bas de l'écran. ![[intellij-query-console-select-rpg_character.png]] ### 1.12 - Écrire un record Retourner dans le programme Java. Dans un nouveau fichier, créer un **record** nommé `RpgCharacter`. Celui-ci doit contenir les attributs suivants : - `name` : chaîne de caractères - `hp` : nombre entier - `def` : nombre entier - `money` : nombre entier - `atk` : nombre entier ### 1.13 Écrire une requête SQL dans le code Java À partir du statement existant. Exécuter la requête suivante afin qu'elle retourne un `ResultSet`. ``` SELECT name, hp, def, money, atk FROM rpg_character ``` Tant que le `ResultSet` a des lignes : Récupérer les valeurs des colonnes : - `name` - `hp` - `def` - `money` - `atk` Instancier un `RpgCharacter` à partir de ces valeurs. Afficher le contenu du `RpgCharacter` dans la console. Le résultat devrait ressembler à ceci : ```text RpgCharacter[name=Rincevent, hp=30, def=1, money=34, atk=2] RpgCharacter[name=Cohen le barbare, hp=120, def=2, money=78, atk=5] RpgCharacter[name=Deuxfleurs, hp=20, def=0, money=350, atk=0] ``` <!-- ## Exercice 1 : Les cadeaux des lutins 0 - Créez un nouveau projet maven --- 1 - Écrire une classe (ou un record) `GiftType` Avec 3 attributs (chaine de caractère) : `name`, `icon` , `description` --- 2 - Dans `GiftType`, implémenter les méthodes `equals` et `hashcode` pour que l'égalité se fasse sur l'attribut `name`. --- 3 - Écrire une classe `GiftTypes` Qui contient en attribut privé une collection de `GiftType`. Le choix du type de collection est à votre discrétion (`List`, `Set`, `Map`, `Queue` ). N'hésitez pas à changer en cours de route si votre choix ne vous semble pas idéal. --- 4 - Dans `GiftTypes` implémentez les méthodes : 4.1 - `void add(GiftType giftType)` : ajoute un nouveau type de cadeau Lève une exception custom unchecked si l'élément est déjà présent. --- 4.2 `Optional<GiftType> findByName(String name)` Retourne un type de cadeau s'il existe (ou pas). --- 4.3 - `void update(GiftType giftType)` Modifie un type de cadeau existant. Lève une exception custom unchecked si l'élément n'existe pas. --- 4.4 - `__________ findAll()` Retourne tous les types de cadeau. À vous de choisir un type de retour adapté. --- 4.5 - `void deleteByName(String name)` Supprime un type de cadeau. --- 5 - Dans une nouvelle classe, érire un petit programme en ligne de commandes **interactif** qui permet de réaliser les opérations courantes sur les types de cadeaux. > Exemple de ce à quoi ça pourrait ressembler : https://asciinema.org/a/uFnr1c6a1Dmx6niD Sentez-vous libre de proposer une interface à votre image mais rappelez-vous qu'il y a encore des exercices après. --- 5.1 - affiche l'aide ```text l : lister les types de cadeau a : ajouter un type de cadeau s : supprimer un type de cadeau m : modifier un type de cadeau q : quitter ``` --- 5.2 - quitter Quand on saisit `q`, le programme se ferme --- 5.3 - ajouter un type de cadeau Quand on saisit `a`, le programme invite à saisir interactivement - Nom - Logo - Libellé Quand les informations sont saisies, le type de cadeau est ajouté via une instance de `GiftTypes`. Les informations du type de cadeau sont affichés avec un message de succès Ex. ```text Ajouter un type de cadeau Nom : doll Logo : 🪆 Libellé : Poupée russe ``` ``` Type de cadeau ajouté : doll 🪆 Poupée ``` Si le type de cadeau existe déjà, une erreur est affichée dans la sortie d'erreur. ``` Le type de cadeau n'a pas pu être ajouté ! ``` --- 5.4 - lister les types de cadeau Quand on saisit `l`, le programme affiche la liste des types de cadeau ligne par ligne. Si aucun type de cadeau n'est présent, affiche un message pour le signifier. --- 5.5 - modifier un type de cadeau Quand on saisit `s`, le programme 1. affiche une **liste des noms** de types de cadeau pour pouvoir savoir lequel modifier 2. invite à saisir le nom d'un cadeau 3. Supprime le type de cadeau --- 5.6 - modifier un type de cadeau Quand on saisit `m`, le programme 1. affiche une liste des noms de types de cadeau pour pouvoir savoir lequel modifier 2. invite à saisir le nom d'un cadeau 3. invite à saisir le logo 4. invite à saisir le libellé 5. Modifie le type de cadeau - Si le cadeau a été modifié, afficher un message de succès - Si le cadeau n'a pas pu être modifié, afficher un message d'erreur dans la sortie d'erreur ## Exercice 2 : Based ! Dans le même projet que l'exercice 1. 1 - Ajouter la **dépendance maven** du **driver JDBC** pour SQLite dans le `pom.xml` du projet. ```xml <dependency> <groupId>org.xerial</groupId> <artifactId>sqlite-jdbc</artifactId> <version>3.51.0.0</version> </dependency> ``` --- 2 - Dans un code Java, initier une connexion à une base de données sur un fichier local. La chaine de connexion jdbc à utiliser : `jdbc:sqlite:gifts.db` ```java Connection con = DriverManager.getConnection("jdbc:sqlite:gifts.db"); ``` En exécutant le programme, le fichier de base de données `gifts.db` devrait être présent à la racine de ce projet. > 💡 vous pouvez vous aider des [outils de base de données](https://www.jetbrains.com/help/idea/2025.3/database-tool-window.html?reference.tools.datasource&utm_source=product&utm_medium=link&utm_campaign=IU&utm_content=2025.3) de IntelliJ Idea > pour voir et manipuler le contenu de la base de données SQLite --- 3 - Écrire du code Java pour créer une table en base de données si elle n'existe pas Table `gift` | Nom de colonne | Type | Clé primaire | |----------------|--------------|--------------| | name | varchar(20) | Oui | | icon | varchar(2) | | | label | varchar(100) | | --- 4 - Renommez la classe `GiftTypes` en `InMemoryGiftTypes`. > 💡 Astuce : Intellij vous permet de le faire de façon safe --- 5 - Extrayez une interface depuis `InMemoryGiftTypes` en exposant les méthodes publiques de celle-ci et nommez la `GiftTypes`. ```java public interface GiftTypes{ void add(GiftType giftType); // ... // findByName // update // findAll // deleteByName // ... } ``` ```java public class InMemoryGiftTypes implements GiftTypes{ void add(GiftType giftType){ // ... } // ... // findByName // update // findAll // deleteByName // ... } ``` --- 6 - Assurez-vous que le programme de l'exercice 1 fonctionne toujours. > 💡 Indice : Utilisez le polymorphisme et appuyez-vous sur l'interface `GiftTypes` --- 7 - Implémentez une nouvelle classe `JdbcSqliteGiftTypes` qui implémente `GiftTypes` Elle doit avoir le même comportement que la classe `InMemoryGiftTypes` mais en utilisant la base de données SqLite. --- 8 - Dans votre programme, remplacez l'utilisation de `InMemoryGiftTypes` par `JdbcSqliteGiftTypes`. Normalement, le changement ne devrait pas impacter le programme de ligne de commandes significativement. ## Bonus Remplacer la base de données SQLite par une autre base de données (PostgreSQL, MySQL, MariaDb) Qu'observez-vous ? Comment faire ? ->