Aller au contenu principal

TP2.2 - Base de Données H2

Objectifs​

  • Comprendre la différence entre base de données en mémoire et persistante
  • Créer une entité JPA et un repository
  • Utiliser les 4 méthodes CRUD de base (save, findById, findAll, deleteById)
  • Accéder à la console H2

Partie 1: H2 en Mémoire (Données Temporaires)​

1.1 Création du Projet​

Aller sur: https://start.spring.io/

Configuration:

  • Project: Maven
  • Language: Java
  • Spring Boot: 3.2.0+
  • Group: com.example
  • Artifact: h2-memoire
  • Java: 17

Dépendances:

  • Spring Web
  • H2 Database
  • Spring Data JPA

Générer et décompresser dans votre workspace.


1.2 Créer l'Entité Employee​

Fichier: src/main/java/com/example/h2memoire/model/Employee.java

package com.example.h2memoire.model;

import jakarta.persistence.*;

@Entity
@Table(name = "tbl_employees")
public class Employee {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String firstName;
private String lastName;
private String email;

// Constructeurs
public Employee() {
}

public Employee(String firstName, String lastName, String email) {
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
}

// Getters et Setters
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }

public String getFirstName() { return firstName; }
public void setFirstName(String firstName) { this.firstName = firstName; }

public String getLastName() { return lastName; }
public void setLastName(String lastName) { this.lastName = lastName; }

public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
}

1.3 Créer le Repository​

Fichier: src/main/java/com/example/h2memoire/repository/EmployeeRepository.java

package com.example.h2memoire.repository;

import com.example.h2memoire.model.Employee;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
// Méthodes héritées: save(), findById(), findAll(), deleteById()
}

1.4 Configuration​

Fichier: src/main/resources/application.properties

# Console H2
spring.h2.console.enabled=true

# Base de données en MÉMOIRE
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=

# Hibernate
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.show-sql=true

1.5 Lancer l'Application​

mvn clean install -DskipTests spring-boot:run

1.6 Console H2​

URL: http://localhost:8080/h2-console/

Connexion:

  • JDBC URL: jdbc:h2:mem:testdb
  • Username: sa
  • Password: (vide)

1.7 Tester le CRUD​

CREATE - Insérer:

INSERT INTO TBL_EMPLOYEES (FIRST_NAME, LAST_NAME, EMAIL) 
VALUES ('Jean', 'Tremblay', 'jean@example.com');

INSERT INTO TBL_EMPLOYEES (FIRST_NAME, LAST_NAME, EMAIL)
VALUES ('Marie', 'Gagnon', 'marie@example.com');

READ - Consulter:

SELECT * FROM TBL_EMPLOYEES;

UPDATE - Modifier:

UPDATE TBL_EMPLOYEES 
SET EMAIL = 'nouveau@example.com'
WHERE FIRST_NAME = 'Jean';

DELETE - Supprimer:

DELETE FROM TBL_EMPLOYEES WHERE ID = 1;

1.8 Test de Persistance​

Test 1: Déconnexion/Reconnexion

  • Déconnectez-vous de H2
  • NE PAS arrêter l'application
  • Reconnectez-vous
  • Résultat: ✅ Données toujours là

Test 2: Arrêt/Redémarrage

  • Arrêtez l'application (Ctrl + C)
  • Redémarrez: mvn clean install -DskipTests spring-boot:run
  • Reconnectez-vous
  • Résultat: ❌ Table vide (données perdues)

Pourquoi? Mode mémoire + ddl-auto=create-drop


Partie 2: H2 Persistante (Données sur Disque)​

2.1 Nouveau Projet​

Option 1: Dupliquer le projet h2-memoire et renommer en h2-persistance

Option 2: Créer nouveau projet depuis Spring Initializr


2.2 Copier Entité et Repository​

Copiez les mêmes fichiers Employee.java et EmployeeRepository.java de la Partie 1.


2.3 Configuration Modifiée​

Fichier: src/main/resources/application.properties

# Console H2
spring.h2.console.enabled=true

# Base de données sur DISQUE (différence clé)
spring.datasource.url=jdbc:h2:file:C:/temp/test;DB_CLOSE_ON_EXIT=FALSE;AUTO_RECONNECT=TRUE
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=

# Hibernate
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

Changements clés:

  • jdbc:h2:mem: → jdbc:h2:file:C:/temp/test
  • ddl-auto=create-drop → ddl-auto=update

2.4 Lancer l'Application​

mvn clean install -DskipTests spring-boot:run

2.5 Console H2​

URL: http://localhost:8080/h2-console/

Connexion:

  • JDBC URL: jdbc:h2:file:C:/temp/test
  • Username: sa
  • Password: (vide)

2.6 Tester le CRUD​

INSERT INTO TBL_EMPLOYEES (FIRST_NAME, LAST_NAME, EMAIL) 
VALUES ('Pierre', 'Roy', 'pierre@example.com');

SELECT * FROM TBL_EMPLOYEES;

2.7 Test de Persistance​

Test: Arrêt/Redémarrage

  1. Insérez des données
  2. Arrêtez l'application (Ctrl + C)
  3. Redémarrez: mvn clean install -DskipTests spring-boot:run
  4. Reconnectez-vous
  5. Résultat: ✅ Données toujours là!

Vérification du fichier:

  • Aller dans C:\temp\
  • Fichier test.mv.db créé (votre base de données)

Comparaison: Mémoire vs Fichier​

AspectMode MémoireMode Fichier
URLjdbc:h2:mem:testdbjdbc:h2:file:C:/temp/test
ddl-autocreate-dropupdate
Persistance❌ Non✅ Oui
Fichier .mv.dbNon crééCréé sur disque
UsageTests, développementDéveloppement avec données

Résumé​

Points Clés​

  • Entité JPA avec @Entity et @Table - Hibernate crée la table automatiquement
  • Repository avec JpaRepository - 4 méthodes CRUD gratuites
  • H2 mémoire - Rapide mais temporaire
  • H2 fichier - Persistance des données sur disque
  • Console H2 - Interface pour tester le CRUD

4 Méthodes CRUD de Base​

MéthodeAction
save(entity)CREATE / UPDATE
findById(id)READ un
findAll()READ tous
deleteById(id)DELETE

Exercice​

Créez une nouvelle entité Product:

  • id, name, price, quantity
  • ProductRepository
  • Testez en mode mémoire
  • Testez en mode fichier

Retour au Module 2