Alternativas ao JPA Hibernate. O que usar quando o JPA não atende meu projeto?

MyBatis

O MyBatis (antigo iBatis) é um framework muito bom e bastante utilizado no mercado de trabalho. Tem diversas funcionalidades, mas nesse poste veremos apenas algumas.

O código do projeto que veremos nessa página pode ser encontrado aqui: https://github.com/uaihebert/MyBatisCrud

Para começar a utilizar o MyBatis é necessário instanciar uma fábrica (Factory) de sessões. É bem simples e a documentação diz que essa fábrica deve/pode ser estática:

MyBatis01

Esse código precisa ser executado apenas uma vez em um projeto que use o MyBatis, por isso o bloco de código estático. O XML de configuração (mybatis.xml) é um arquivo bem simples que pode ser visto abaixo:

MyBatis02

O Mapper (atributo visto no xml acima) é responsável por detalhar as consultas encontradas no projeto assim como quem traduzirá os dados retornados em objecto Java. É possível utilizar o Mapper por XML ou por Interface. Vamos ver abaixo o Mapper encontrado no arquivo crud_query.xml:

MyBatis03

Veja que é um arquivo bem simples e fácil de entender. A primeira configuração vista é um ResultMap que aponta para o tipo do resultado da consulta, nesse caso foi definida a classe “uai.model.Customer“. Como temos um atributo onde o nome dele é diferente do nome encontrado no banco de dados, essa diferença foi descrita no XML.

A query nativa fica descrita com um ID único que será utilizado pela sessão do MyBatis. No início do arquivo é possível ver a declaração de um namespace que funciona como um pacote do Java, que englobará todas as consultas e resultMapps encontrados no arquivo XML.

Outra fato interessante do MyBatis é a possibilidade de utilizar Interfaces + Anotações no lugar de XML. O Mapper do arquivo crud_query.xml detalhado acima poderia ser traduzido em:

MyBatis04

Por praticidade apenas os métodos de leitura foram criados na Interface, mas os outros métodos de CRUD encontrados no crud_query.xml poderiam estar presentes sem problemas.

Vamos ver primeiramente como ficaria uma consulta utilizando o mapeamento por XML:

MyBatis05

A conversão do objeto já é automática e o método fica fácil de ler. Para executar a consulta basta passar a combinação do namespace + query id vistos no arquivo crud_query.xml acima.

Se o desenvolvedor optar pela abordagem de Anotação + Interface o código da consulta ficará assim:

MyBatis06

Veja como a consulta utilizando a Interface é simples e em nenhum momento o desenvolvedor precisa se preocupar com instanciação da Interface.

E para atualizar, remover e inserir um registro do banco de dados seria necessário fazer:

MyBatis07

MyBatis08

MyBatis09

Sobre o MyBatis é possível afirmar que:

  • Excelente documentação: Durante todo o momento que fui ao site deles consegui tirar dúvidas sobre a arquitetura e o funcionamento do framework.
  • Flexível: Ao permitir XML e/ou Interface + Anotação o desenvolvedor poderá escolher qual abordagem utilizar. Lembre-se que ao utilizar Anotação + Interface a portabilidade entre bancos será bastante difícil, pois utilizando XML basta escolher qual o XML enviar dentro do artefato.
  • Integrações: Tem integração com ferramentas como Spring e Guice.
  • Query dinâmica: ele permite a criação de consultas em tempo de execução, como a criteria do JPA. Em uma consulta é possível colocar IFs para decidir quais atributos serão utilizados.
  • Transação: Se seu projeto não utilizar Spring ou Guice será necessário fazer o controle programático da transação.

20 thoughts on “Alternativas ao JPA Hibernate. O que usar quando o JPA não atende meu projeto?

  1. Excelente artigo, Hebert!

    Passei a usar primordialmente Spring JDBC Template depois de algumas experiências amargas com JPA. Encontrei também muitos desenvolvedores em caminhos parecidos.

    Ao mesmo tempo que o JPA diminui um pouco a quantidade de código e abstrai o SQL, o desenvolvedor sente-se mais “amarrado”. Ao voltar para o “JDBC”, vem uma sensação de liberdade que vários colegas já descreveram.

    Talvez possa usar uma analogia: o JPA é como um caminhão grande que tem uma grande carga e capacidade, e o JDBC seja como um carrinho pequeno, que é que mais ágil de manobrar, porém com menos funcionalidades.

    Abraço e sucesso!

  2. Olá Hebert, tudo bem?
    Antes de comentar preciso lhe agradecer e parabenizar pelo trabalho cuidadoso e profissional que vc dispensa nesse canal de informação muito importante para nós brasileiros. Obrigado mesmo!
    Na sua lista, se possível, acrescentaria o Apache Cayenne[1] e o
    DataNucleus-JDO[2]. Do Cayenne posso falar um pouco(o conheci ao
    estudar e trabalhar com o Apache Click[3] ou framework fantástico), ferramente esplêndida e produtiva. Já o JDO é o vovô das especificações por isso merece todo respeito.
    [1] http://cayenne.apache.org/
    [2] http://www.datanucleus.org/products/accessplatform_4_0/jdo/api.html
    [2] http://click.apache.org/ | http://click.avoka.com/click-examples/cayenne/tabbed-cayenne-form-page.htm#

    • Gilberto, boa tarde.

      Fico honrado pelas palavras de apoio, muito obrigado.

      Valeu pelas contribuições, assim que possível, vou adicioná-las ao post.

  3. Herbert
    Vi sua apresentacao no infoQ (http://www.infoq.com/br/presentations/quando-jpa-nao-atende), foi bem legal! Parabéns!
    O Hibernate já me tirou muitas noites de sono depois de ter que fazer “ALTER TABLE” na manutenção do banco. Além de ter descartado JPA em projetos com banco legado com muitas procedures, queries complexas e tabelas sem integridade referencial.
    Como mencionado pelos colegas, corri para o bom e velho “JDBCzão”.

  4. como de costume ótimo post. Hebert só uma sugestão, esse menu flutuante das redes sociais no lado direito do site atrapalha bastante a leitura, tirando isso parabéns pelo blog!!

  5. Olá amigo, parabéns pelo post.

    Sugiro que crie no final uma matriz relacionando as bibliotecas com o que foi avaliado:
    documentação, facilidade de uso inicial etc…

    Vai da uma incrementada legal a ele.

    • Onezino, boa noite.

      Primeiro, me perde a demora em responder. Estou muito pegado no trabalho, para você ter idéia, estou te respondendo dele enquanto um deploy não termina.

      Obrigado pela idéia, caso um dia eu venha a editar esse post com certeza colocarei a matriz.

      E, quando eu criar outros posts desse tipo, colocarei a matriz ao final.

      Obrigado por tudo.

  6. Ótimo review das ferramentas de integração cmo SGBD. Só fiquei meio frustrado por você não ter conseguido executar um projeto com jOOQ. Vim seco para ler este post querendo saber sua opinião sobre ele. Acho que merece um post a parte ou uma atualização aqui… =)

  7. Ótimo Post. Mas tipo, eu estou começando uma aplicação agora e irei fazer o teste da troca pois irei trabalhar com um site que será melhor tratado se não tiver os enormes processos do JPA/Hibernate. Mas estou enfrentando o cenario de Versionamento/Concorrencia dos dados utilizando o Spring JDBCTemplate. Hebert você conhece algum framework que trate isso, ou irei ter de implementar na mão? Abraços !

    • José, boa tarde.

      Honestamente o primeiro framework que veio em minha mentem foi o JPA. (:

      Eu só não entendi o que seria “enormes processos” do JPA. Eu honestamente só vi problema quando o JPA foi mau utilizado ou então quando existia milhares de requisições por segundo.

      Como você está usando o JDBCTemplate eu te aconselho a procurar por “spring jdbctemplate concurrency” no google e ver o que o pessoal fala.

      De cabeça não me lembro de nada que se “acople” ao Spring para fazer esse tratamento.

Leave a Comment