Hoje, vamos falar sobre um framework de persistência para banco de dados relacionais, com uma estrutura de mapeamento SQL personalizado e que pode ser uma alternativa para quem não gosta do Hibernate, ou o JBDC, ou sei lá… Das antigas, conhecido como IBatis, apresento o hoje chamado de MyBatis.
O MyBatis é uma estrutura de persistência de dados com suporte customizado para SQL, stored procedures e mapeamentos avançados. O MyBatis elimina grande parte do código JDBC, assim como configurações de parâmetros e códigos adicionais para recuperação de dados da base. O MyBatis pode ser utilizado com um simples XML ou algumas anotações básicas de configuração e mapeamento de métodos em suas interfaces.
E o melhor, o Spring Boot oferece suporte para o Apache MyBatis!
Bom… vamos ver código!
Nesse exemplo básico, vamos usar o facilitador para geração de projetos Spring Boot, o Spring Initializr. O pré-requisito é que as dependências MyBatis, H2 e Lombok estejam selecionadas.
Apenas para fins de curiosidade, as dependencies:
- MyBatis (o fundamento desse artigo): é aquela que vai nos proporcionar a mágica do negócio;
- H2: nosso famoso banco de dados em memória;
- Lombok: Reducing Boilerplate Code with Project Lombok. Quem, hoje em dia, não gosta de ver um código limpo e funcional? O projeto Lombok visa reduzir a escrita de código em suas classes de Modelo com annotations para suprimir a declaração de getters and setters… Mas calma! Ainda assim é possível manter a integridade e o encapsulamento de suas classes com annotations específicas para os marrrvados SETTERSSSSS. Mas esse nível de detalhe é assunto para um próximo artigo.
Até lá, quem se interessar pode dar uma olhadinha no doc do projeto bem aqui.
Após o download do projeto, aguarde até que as dependências sejam todas baixadas em sua IDE e mãos à obra…
Para exemplo desta demo, vamos primeiramente criar uma classe modelo para nossa aplicação, e para não quebrar o tabu, nossa classe será a famosa “Person”, com os seguintes atributos:
Repare as @annotations da classe Person. Elas são as responsáveis por gerar getters, setters, um construtor com ou sem argumentos e também o toString. Lembrando… Nesse exemplo básico não iremos entrar no mérito do encapsulamento, mas o Lombok permite essa customização dos atributos para tal.
Agora, com nossa classe modelo pronta, vamos criar um arquivo dentro de src/main/resources chamado schema.sql. Dentro desse arquivo, vamos colocar nossa query para criar a tabela person no banco H2. O arquivo ficará da seguinte forma:
Com isso, assim que o spring boot subir, nossa tabela será criada.
Com nossa pequena estrutura de banco de dados pronta, vamos criar uma interface (PersonMapper) que terá o papel de “mapeador” para nosso banco de dados H2. Vamos usar as seguintes operações como exemplo: insert(), selectAll(), deleteById() e search(um método super legal para pesquisas dinâmicas por mais de um campo).
Repare as @annotations em nossa interface. Elas serão responsáveis por traduzir nossa classe modelo (em sintaxes SQL) e preparar os dados para serem enviados ao nosso banco de dados. Primeiramente @Mapper, que irá dizer ao MyBatis que ali existem objetos que precisam ser mapeados e persistidos no banco.
Veja no método insert() que utilizamos a anotação @Option(useGeneratedKeys=true) para dizer ao myBatis que ele deverá criar nossa sequência de chaves primárias automaticamente. E na anotação @Insert(), utilizamos uma expressão SQL, mas passando dentro de “values”, nossos valores como campos chave, que receberão os valores passados dentro da classe Person.
Agora, observe o método search:
Na minha opinião, esse é o método mais legal. Ele será nosso método para a pesquisa dinâmica.
Mas calma lá… Você se lembra do XML que comentei no início do artigo? Agora é a hora de criarmos! Mas fique tranquilo, apesar de ser um XML, ele é simples, fácil e expressivo.
Então, vamos lá! Dentro de resources, crie um pacote chamado com.concrete.mapper e, dentro dele, um arquivo chamado PersonMapper.xml
Segue o nosso arquivo .XML. O que achou? Simples né? Apesar de ser um XML cheio de tags, ele facilita uma leitura do que está sendo proposto. Esse arquivo permitirá que nosso método search() faça uma pesquisa com um ou mais parâmetros. Note que o tipo do retorno esperado desse método é um objeto Person.
Então, agora, vamos ver se esse negócio funciona mesmo!
Dentro da nossa classe “MAIN”, vamos declarar um @Bean utilizando a interface CommandLineRunner do Spring Boot para inserir informações em nosso banco de dados e realizar nossas pesquisas.
Uma alternativa para o insert de people é a utilização de methods reference do Java8, que tal?
Obs: Possivelmente, quando utilizar o @Data em sua classe Modelo e, posteriormente, quando for criar seus objetos, sua IDE provavelmente vai acusar erro, informando que você está tentando criar objetos utilizando um construtor com parâmetros, mas sua classe não tem esse construtor. Isso ocorre porque, por default, sua IDE não reconhece as magias do Lombok. Para resolver esse problema, basta baixar um plugin específico para sua IDE. Eu, particularmente, gosto do Intellij (clique aqui para baixá-lo).
Gastando um pouco do nosso Java8, vamos inserir 4 registros no banco por meio do método insert() da interface PersonMapper. Com a ajuda do bom e velho DEBUG System.out.println(), podemos ver os dados que foram enviados para o banco de dados H2, formatado pela annotation @ToString da nossa classe Person:
Agora, vamos ao selectAll():
Saída:
O deleteById(), deletando o registro John Wick com ID 1:
Saída:
E agora o meu preferido, o search:
——–>> SEARCH BY FIRSTNAME <<——–
Saída:
Saída:
——–>> SEARCH BY FIRSTNAME AND AGE<<——–
Saída:
E é isso! Espero que tenham gostado. Aqui está o link do GIT para quem quiser baixar esse código e se divertir. E aqui tem a referência da documentação do MyBatis.
Se você tiver alguma dúvida ou algo a dizer, aproveite os campos abaixo.
Até a próxima!
***
Artigo publicado originalmente em: http://www.concretesolutions.com.br/2017/03/13/spring-boot-e-apache-mybatis/