Concrete Logo
Hamburger button

Spring Boot e Apache MyBatis

  • Blog
  • 13 de Março de 2017
Share

Uma alternativa ao Hibernate e ao JDBC? Quem sabe…

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 odeia o JBDC ou sei lá… =P. Das antigas conhecido como IBatis, apresento o hoje chamado de MyBatis.

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? Bora lá!

image00

Nesse exemplo básico, vamos usar o facilitador para geração de projetos Spring Boot, o Spring InitializrO pré-requisito é que as dependências MyBatis, H2 e Lombok estejam selecionadas.

image02

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 post. 

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:

image01

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:

image04

Com isso, assim que o spring boot subir, nossa tabela será criada.

Nossa pequena estrutura de banco de dados pronta, vamos criar então 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).

image03

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:

image06

Na minha opinião, esse é o método mais legal. Ele será nosso método para a pesquisa dinâmica.

Mas calma lá… lembra do XML que comentei no início do post? 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

image05

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.

image08

Uma alternativa para o insert de people é a utilização de methods reference do Java8, que tal?

image07

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:

image11

Agora vamos ao selectAll()

image09

saída:

image10

O deleteById(), deletando o registro John Wick com ID 1

image12

Saída:

image13

E agora o meu preferido, o search:

——–>> SEARCH BY FIRSTNAME <<——–

image14

Saída:

image15

——–>> SEARCH BY LASTNAME<<——–

image16

Saída:

image17

——–>> SEARCH BY FIRSTNAME AND AGE<<——–

image18

Saída:

image19

E é isso! Espero que tenham gostado. Aqui está o 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!

 

É desenvolvedor Java e gostaria de trabalhar em um time ágil e multidisciplinar? Clique aqui.