Quais são as vantagens do myBatis sobre o Hibernate? [fechadas]


33

Eu fiz algumas pesquisas por conta própria e entendi o conceito básico. Mas algumas idéias só podem ser obtidas através da experiência real.

Quais são as vantagens do myBatis que valeriam a pena aprender uma nova estrutura?
Em que caso você evitaria usá-lo?


3
Eu testei os dois e acabei usando Cayenne.
Deadalnix 26/07/12

Respostas:


38

Considere o que você está tentando alcançar. Normalmente, o modelo de Segregação de Resposta à Consulta de Comando funciona bem para domínios complexos.

O motivo é que você está tentando fazer uma de duas coisas normalmente:

  1. Criar / Atualizar / Excluir algumas entidades de domínio complexas
  2. Executar consultas de busca analítica (ou seja, consultas de soma / agregação)

O Hibernate funciona bem no caso 1, permitindo que você faça um POJO e persista / atualize. Ele também faz isso rapidamente, a menos que seu domínio seja muito grande.

O myBatis é ótimo para buscar consultas (caso 2) em que você apenas deseja uma resposta. O Hibernate tentaria carregar o gráfico inteiro do objeto e você precisaria começar a ajustar as consultas com os truques do LazyLoading para mantê-lo funcionando em um domínio grande. Isso é importante ao executar consultas analíticas complexas que nem retornam objetos de entidade. O Hibernate oferece apenas SqlQuery e Bean Transformers nesse caso com grandes tipos padrão como BigDecimal, enquanto o myBatis poderia facilmente mapear para uma simples não-entidade POJO.

Esses dois casos são a diferença entre os comandos nos quais você deseja alterar os dados do domínio e as respostas nas quais você deseja apenas buscar alguns dados.

Portanto, considere esses dois casos e o que seu aplicativo faz. Se você tem um domínio simples e apenas busca informações, use myBatis. Se você possui um domínio complexo e persiste entidades, use o Hibernate. Se você fizer as duas coisas, considere uma abordagem híbrida. É isso que usamos em nosso projeto, que possui milhares de entidades para mantê-lo sob controle. ;)


2
O Hibernate também funciona bem com o seu caso 2. Para um exemplo simples, veja: mkyong.com/hibernate/hibernate-native-sql-queries-examples
Mike Partridge

3
"O Hibernate tentaria carregar o gráfico inteiro do objeto" parece um erro de configuração. "Precisa começar a ajustar as consultas com os truques do LazyLoading" parece que você definiu fetch = ansioso em algum lugar. O JPA possui o JPQL, que é praticamente SQL, mas bem integrado ao Hibernate / JPA. Eu acho que faz # 2 muito bem. É comum as pessoas executarem a produção por um ano ou mais antes de ter um ORM configurado 100% corretamente. Não estou minimizando quando digo que é um erro de configuração - a configuração com essas ferramentas pode ser muito demorada e complicada!
precisa saber é o seguinte

3
@GlenPeterson Não estou dizendo que o Hibernate não pode ser domado, mas para a maioria das pessoas, prontas para uso, entidades complexas de domínio serão carregadas lentamente, a menos que sejam feitas otimizações, como você citou. Consultas analíticas complexas são mais diretas com o myBatis para a maioria dos usuários, embora o mesmo possa realmente ser alcançado com um ORM. A questão para muitos é se eles precisam da independência do fornecedor da ORM para seu produto.
Joseph Lust

10
O Hibernate finge que não há banco de dados por baixo e você apenas trata o modelo de dados como se ele fosse projetado usando coleções Java. O que muitas vezes não é o caso. No nível do banco de dados, a representação de dados pode ser muito diferente e tentar mapeá-la automaticamente em coleções Java não faz necessariamente nenhum sentido. É por isso que o Hibernate é um exemplo perfeito de "Abstração com vazamento". MyBatis é muito mais simples, fácil de entender, não há mágica e ... sim, há SQL que acho bom porque não há nada errado em usar o SQL para bancos de dados baseados em SQL.
21468 Marcin

2
@Marcin ótimo ponto. Eu já vi muitos problemas com a emulação de coleções no Hibernate. Por exemplo, alguns códigos chamam myBag.size () e o Hibernate tenta carregar objetos de 750K na memória antes de contá-los. Se você precisar apenas de SQL, use SQL.
Joseph Lust

19

MyBatis é centralizado em SQL. Ele ajuda você a chamar instruções SQL e mapear resultados (tabelas) para árvores de objetos.

O principal benefício é que não é um ORM. Ele não mapeia tabelas para objetar, para que não sofra a incompatibilidade de impedância da orm. Adapta-se bem a bancos de dados complexos ou herdados ou a usar recursos de banco de dados, como procedimentos armazenados, visualizações e outros.

É muito simples e fácil de aprender, assim também se encaixa em equipes pouco qualificadas, porque não há necessidade de ter um guru de hibernação entre elas.

Dê uma olhada no jpetstore 6 http://mybatis.org/spring/sample.html


2
Essas "equipes pouco qualificadas" ainda precisam conhecer o SQL.
Perp

Boa resposta concisa, as duas principais diferenças são: db cêntrico + curva de aprendizado superficial. Mas não concordo totalmente com "Se encaixa bem em bancos de dados complexos ou herdados". A vantagem de ser centrada em db se torna mais aparente quando você tem mais controle sobre o design de db.
DPM

5

Como a pergunta se refere ao meu comentário , eis o que eu tinha em mente ao escrevê-lo.

Antes de tudo, é derivado do contexto da sua pergunta original. Em outras circunstâncias, eu poderia dar um conselho diferente. O ponto que me fez sugerir MyBatis é o seguinte:

... encontramos alguns problemas de desempenho.

Decidimos deixar o hibernate em favor do Jdbc comum para obter desempenho do banco de dados ...

Em um dos projetos anteriores, nossa equipe considerou mudar do Hibernate pelos motivos que você descreve. Assim como você, mudaríamos para o JDBC, mas colegas de outro projeto nos recomendaram o MyBatis. A equipe decidiu tentar, mantendo o JDBC como uma opção de fallback no caso de algo der errado.

Naquele momento, eu não sabia nada sobre o MyBatis, mas tinha experiência suficiente com o JDBC para garantir que ele fizesse o trabalho. Apesar disso, eu estava apoiando fortemente a ideia de experimentar o MyBatis, a principal razão é que, de acordo com minha experiência passada, a quantidade de código padrão que precisaríamos escrever com o JDBC seria assustadora.

  • Para ser justo, eu gosto do JDBC por ser simples de entender, confiável e por proporcionar uma boa sensação de controle sobre a interação do banco de dados, mas o preço pago é realmente alto. Meus dedos começam a doer toda vez que lembro quanto clichê eu tive que digitar com o JDBC.

Enfim, tentamos o MyBatis e funcionou como anunciado. Por isso escrevi o comentário sobre o qual você pergunta.

Caso você espere que eu dê uma visão geral detalhada da tecnologia, ou de alguma forma elogie sua superioridade - desculpe, não posso fazer isso. Se eu pudesse - eu já escreveria isso em uma resposta separada para sua pergunta original, em vez de fazer um breve comentário. Eu mencionei que não sabia nada sobre o MyBatis naquela época - bem, ainda tenho muito pouco conhecimento sobre isso. A transição do Hibernate foi feita por outros membros da equipe e não afetou o código no qual estou trabalhando. Recordei apenas as principais conclusões (com base nas quais fiz meu comentário), a saber: 1) o MyBatis resolveu os problemas que tínhamos com o Hibernate, 2) não apresentava problemas próprios e 3) nos permitiu evitar escrever o código padrão I estava esperando no caso, se mudarmos para JDBC. Isso é tudo.


3

O Hibernate é conhecido por muita magia , comportamento inesperado e grande curva de aprendizado. Existem outras estruturas por aí mais focadas na simplicidade e permitem que você esteja no controle.

myBatis é um deles, meu projeto MentaBean é outro. Eu escrevi um post sobre isso que pode ajudar.


6
Oi Sergio e bem vindo. Nossa comunidade geralmente desaprova a autopromoção e exigimos que você divulgue claramente sua afiliação em suas respostas. Editei sua resposta para apontar que o MentaBean é um projeto com o qual você está envolvido e que escreveu o post do blog para o qual aponta, se você não gosta do fraseado, sinta-se à vontade para alterá-lo, mas mantenha alguns tipos de divulgação que você está envolvido com o MentaBean. Leia a seção relevante em nossas Perguntas frequentes para obter mais detalhes.
yannis

Oi Yannis. Eu vou fazer isso. Obrigado pela atenção. :)
Sergio Oliveira Jr.

-1

Eu usei o Hibernate para um projeto de carregamento e transformação de dados há 5 anos, usando o Hibernate 3 e achei maravilhoso. Estou fazendo um pequeno aplicativo de comércio eletrônico e tentei usar o Hibernate 4 e fiquei extremamente decepcionado. Eles removeram as ferramentas e totalmente integrados ao IDE. Eu experimentei o MyBatis e vou trabalhar tudo em uma única noite e estou muito satisfeito com a facilidade de integração em um aplicativo. Eu acho que o Hibernate ficou muito inchado e eu usaria o EJB 3 sobre o Hibernate neste momento.


1
Como o EJB 3 e o Hibernate se comparam ???
314 Jose Jose
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.