Pular para o conteúdo principal

TP2.2 - Banco de Dados H2

Objetivos​

  • Compreender a diferença entre banco de dados em memória e persistente
  • Criar uma entidade JPA e um repositório
  • Utilizar os 4 métodos CRUD básicos (save, findById, findAll, deleteById)
  • Acessar o console H2

Parte 1: H2 em Memória (Dados Temporários)​

1.1 Criação do Projeto​

Acesse: https://start.spring.io/

Configuração:

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

Dependências:

  • Spring Web
  • H2 Database
  • Spring Data JPA

Gere e descompacte no seu workspace.


1.2 Criar a Entidade Employee​

Arquivo: 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 Criar o Repository​

Arquivo: 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 Configuração​

Arquivo: src/main/resources/application.properties

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

# Base de dados em MEMÓRIA
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 Rodar a Aplicação​

mvn clean install -DskipTests spring-boot:run

1.6 Console H2​

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

Conexão:

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

1.7 Testar o CRUD​

CREATE - Inserir:

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 - Consultar:

SELECT * FROM TBL_EMPLOYEES;

UPDATE - Modificar:

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

DELETE - Remover:

DELETE FROM TBL_EMPLOYEES WHERE ID = 1;

1.8 Teste de Persistência​

Teste 1: Desconectar/Reconectar

  • Desconecte do H2
  • NÃO pare a aplicação
  • Reconecte
  • Resultado: ✅ Dados ainda presentes

Teste 2: Parar/Reiniciar

  • Pare a aplicação (Ctrl + C)
  • Reinicie: mvn clean install -DskipTests spring-boot:run
  • Reconecte
  • Resultado: ❌ Tabela vazia (dados perdidos)

Por quê? Modo memória + ddl-auto=create-drop


Parte 2: H2 Persistente (Dados em Disco)​

2.1 Novo Projeto​

Opção 1: Duplique o projeto h2-memoire e renomeie para h2-persistance

Opção 2: Crie um novo projeto pelo Spring Initializr


2.2 Copiar Entidade e Repository​

Copie os mesmos arquivos Employee.java e EmployeeRepository.java da Parte 1.


2.3 Configuração Modificada​

Arquivo: src/main/resources/application.properties

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

# Base de dados em DISCO (diferença chave)
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

Mudanças principais:

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

2.4 Rodar a Aplicação​

mvn clean install -DskipTests spring-boot:run

2.5 Console H2​

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

Conexão:

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

2.6 Testar o CRUD​

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

SELECT * FROM TBL_EMPLOYEES;

2.7 Teste de Persistência​

Teste: Parar/Reiniciar

  1. Insira alguns dados
  2. Pare a aplicação (Ctrl + C)
  3. Reinicie: mvn clean install -DskipTests spring-boot:run
  4. Reconecte
  5. Resultado: ✅ Dados ainda presentes!

Verificação do arquivo:

  • Vá para C:\temp\
  • Arquivo test.mv.db criado (seu banco de dados)

Comparação: Memória vs Arquivo​

AspectoModo MemóriaModo Arquivo
URLjdbc:h2:mem:testdbjdbc:h2:file:C:/temp/test
ddl-autocreate-dropupdate
Persistência❌ Não✅ Sim
Arquivo .mv.dbNão criadoCriado em disco
UsoTestes, desenvolvimentoDesenvolvimento com dados

Resumo​

Pontos-Chave​

  • Entidade JPA com @Entity e @Table - Hibernate cria a tabela automaticamente
  • Repository com JpaRepository - 4 métodos CRUD prontos
  • H2 memória - Rápido, mas temporário
  • H2 arquivo - Persistência dos dados em disco
  • Console H2 - Interface para testar o CRUD

4 Métodos CRUD Básicos​

MétodoAção
save(entity)CREATE / UPDATE
findById(id)READ um
findAll()READ todos
deleteById(id)DELETE

Exercício​

Crie uma nova entidade Product:

  • id, name, price, quantity
  • ProductRepository
  • Teste em modo memória
  • Teste em modo arquivo

Voltar ao Módulo 2