26 - Inicializador de Dados no Banco H2

Olá pessoal! Em aplicações que utilizam o banco de dados H2 em memória, os dados são apagados toda vez que a aplicação é finalizada ou reiniciada. Para facilitar os testes e evitar que você precise cadastrar os dados manualmente sempre, podemos utilizar um recurso chamado CommandLineRunner.

Esse recurso permite executar um bloco de código automaticamente assim que a aplicação é iniciada. Utilizando essa funcionalidade, podemos inserir dados no banco assim que o Spring Boot for carregado.

Estrutura Criada

  • Pasta: configuracao
  • Arquivo: Inicializador.java

Estrutura do arquivo

package br.com.api.pessoa.configuracao;

// Importações
import br.com.api.pessoa.modelo.PessoaModelo;
import br.com.api.pessoa.repositorio.PessoaRepositorio;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

// Classe como um componente gerenciado pelo Spring, permitindo a injeção de dependência e execução na inicialização
@Component
public class Inicializador implements CommandLineRunner {

    // Atributo da classe
    @SuppressWarnings("unused")
    private final PessoaRepositorio pessoaRepositorio;

    // Construtor que injeta a dependência do PessoaRepositorio, permitindo o acesso ao banco de dados
    public Inicializador(PessoaRepositorio pessoaRepositorio) {
        this.pessoaRepositorio = pessoaRepositorio; 
    }

    // Método que é executado logo após a inicialização da aplicação
    @Override
    public void run(String... args) throws Exception {
       
        // Criar objetos que serão utilizados para armazenar na tabela de pessoas
        PessoaModelo pessoa1 = new PessoaModelo();
        pessoa1.setNome("João");
        pessoa1.setIdade(30);  
        pessoa1.setCidade("São Paulo");

        PessoaModelo pessoa2 = new PessoaModelo();
        pessoa2.setNome("Maria");
        pessoa2.setIdade(25);
        pessoa2.setCidade("Rio de Janeiro");

        PessoaModelo pessoa3 = new PessoaModelo();
        pessoa3.setNome("Carlos");
        pessoa3.setIdade(40);
        pessoa3.setCidade("Belo Horizonte");

        PessoaModelo pessoa4 = new PessoaModelo();
        pessoa4.setNome("Ana");
        pessoa4.setIdade(28);
        pessoa4.setCidade("São Paulo");

        PessoaModelo pessoa5 = new PessoaModelo();
        pessoa5.setNome("Luciano");
        pessoa5.setIdade(35);
        pessoa5.setCidade("Rio de Janeiro");

        PessoaModelo pessoa6 = new PessoaModelo();
        pessoa6.setNome("Suellen");
        pessoa6.setIdade(22);
        pessoa6.setCidade("Curitiba");

        PessoaModelo pessoa7 = new PessoaModelo();
        pessoa7.setNome("Felipe");
        pessoa7.setIdade(50);
        pessoa7.setCidade("Salvador");

        PessoaModelo pessoa8 = new PessoaModelo();
        pessoa8.setNome("Luana");
        pessoa8.setIdade(30);
        pessoa8.setCidade("Porto Alegre");

        PessoaModelo pessoa9 = new PessoaModelo();
        pessoa9.setNome("Ricardo");
        pessoa9.setIdade(40);
        pessoa9.setCidade("Florianópolis");

        PessoaModelo pessoa10 = new PessoaModelo();
        pessoa10.setNome("Sofia");
        pessoa10.setIdade(27);
        pessoa10.setCidade("Fortaleza");

        PessoaModelo pessoa11 = new PessoaModelo();
        pessoa11.setNome("Gustavo");
        pessoa11.setIdade(33);
        pessoa11.setCidade("Recife");

        PessoaModelo pessoa12 = new PessoaModelo();
        pessoa12.setNome("Fernanda");
        pessoa12.setIdade(45);
        pessoa12.setCidade("São Paulo");

        PessoaModelo pessoa13 = new PessoaModelo();
        pessoa13.setNome("Roberta");
        pessoa13.setIdade(26);
        pessoa13.setCidade("Manaus");

        PessoaModelo pessoa14 = new PessoaModelo();
        pessoa14.setNome("Eduardo");
        pessoa14.setIdade(38);
        pessoa14.setCidade("Campinas");

        PessoaModelo pessoa15 = new PessoaModelo();
        pessoa15.setNome("Camila");
        pessoa15.setIdade(31);
        pessoa15.setCidade("Belém");

        // Efetuar cadastros
        pessoaRepositorio.save(pessoa1);
        pessoaRepositorio.save(pessoa2);
        pessoaRepositorio.save(pessoa3);
        pessoaRepositorio.save(pessoa4);
        pessoaRepositorio.save(pessoa5);
        pessoaRepositorio.save(pessoa6);
        pessoaRepositorio.save(pessoa7);
        pessoaRepositorio.save(pessoa8);
        pessoaRepositorio.save(pessoa9);
        pessoaRepositorio.save(pessoa10);
        pessoaRepositorio.save(pessoa11);
        pessoaRepositorio.save(pessoa12);
        pessoaRepositorio.save(pessoa13);
        pessoaRepositorio.save(pessoa14);
        pessoaRepositorio.save(pessoa15);

    }
}

Explicação do Código

  • A classe foi anotada com @Component, tornando-a um bean gerenciado pelo Spring.
  • Ela implementa a interface CommandLineRunner, que contém o método run executado ao iniciar a aplicação.
  • Utilizamos a injeção de dependência via construtor para acessar o repositório de pessoas.
  • Dentro do método run, criamos objetos da classe PessoaModelo e os salvamos no banco com o método save.

Vantagens

  • Economiza tempo ao evitar a inserção manual de dados a cada execução.
  • Facilita os testes com rotas e funcionalidades do sistema.
  • Permite iniciar a aplicação com uma base consistente de dados.

Dica

Esse tipo de inicializador é especialmente útil em ambientes de desenvolvimento e testes. Em ambientes de produção, o ideal é utilizar outros mecanismos para inserção de dados, como migrações com ferramentas como Flyway ou Liquibase.

Clique aqui para se tornar membro do canal

Abaixo segue nossa aula no YouTube: