¿Cuáles son las ventajas de myBatis sobre Hibernate? [cerrado]

33

He investigado por mi cuenta y entiendo el concepto básico. Pero algunas ideas solo se pueden obtener a través de la experiencia real.

¿Cuáles son las ventajas de myBatis que harían que valiera la pena aprender un nuevo marco?
¿En qué caso evitarías usarlo?

Kshitiz Sharma
fuente
3
Probé ambos y terminé usando Cayenne.
deadalnix

Respuestas:

38

Considera lo que estás tratando de lograr. Normalmente, el modelo de segregación de respuesta de consulta de comando funciona bien para dominios complejos.

La razón es que normalmente estás intentando hacer una de dos cosas:

  1. Crear / actualizar / eliminar algunas entidades de dominio complejas
  2. Ejecute consultas de búsqueda analítica (es decir, consultas de suma / agregación)

Hibernate funciona bien para el caso 1, lo que le permite hacer un POJO y persistir / actualizarlo. También lo hace rápidamente, a menos que su dominio sea bastante grande.

myBatis es ideal para buscar consultas (caso 2) donde solo desea una respuesta. Hibernate intentaría cargar todo el gráfico de objetos y necesitaría comenzar a ajustar las consultas con trucos de LazyLoading para que funcione en un dominio grande. Esto es importante cuando se ejecutan consultas analíticas complejas que ni siquiera devuelven objetos de entidad. Hibernate solo ofrece transformadores SqlQuery y Bean en este caso con enormes tipos predeterminados como BigDecimal, mientras que myBatis podría mapearse fácilmente a una simple no entidad POJO.

Estos dos casos son la diferencia entre los Comandos donde desea cambiar los datos del dominio y las Respuestas donde solo desea obtener algunos datos.

Por lo tanto, considere estos dos casos y lo que hace su aplicación. Si tiene un dominio simple y solo busca información, use myBatis. Si tiene un dominio complejo y entidades persistentes, use Hibernate. Si haces ambas cosas, considera un enfoque híbrido. Eso es lo que usamos en nuestro proyecto que tiene miles de entidades para mantenerlo bajo control. ;)

Joseph Lust
fuente
2
Hibernate también funciona bien con su caso 2. Para un ejemplo simple, ver: mkyong.com/hibernate/hibernate-native-sql-queries-examples
Mike Partridge el
3
"Hibernate intentaría cargar todo el gráfico del objeto" esto suena como un error de configuración. "Necesito comenzar a ajustar consultas con trucos de LazyLoading" suena como si hubieras configurado fetch = ansioso en alguna parte. JPA tiene JPQL, que es prácticamente SQL, pero está bien integrado con Hibernate / JPA. Creo que hace el # 2 muy bien. Es común que las personas corran en producción durante un año o más antes de tener un ORM configurado 100% correctamente. No minimizo cuando digo que es un error de configuración: ¡la configuración con estas herramientas puede llevar mucho tiempo y ser complicada!
GlenPeterson el
3
@GlenPeterson No estoy diciendo que Hibernate no pueda ser domesticado, pero para la mayoría de las personas, las entidades de dominio complejas se cargarán lentamente a menos que se realicen optimizaciones, como lo citó. Las consultas analíticas complejas son más sencillas con myBatis para la mayoría de los usuarios, aunque lo mismo puede lograrse con un ORM. La pregunta para muchos es si necesitan la independencia del proveedor de ORM para su producto.
Joseph Lust el
10
Hibernate simula que no hay una base de datos debajo y solo trata su modelo de datos como si estuviera diseñado utilizando colecciones Java. Lo que a menudo no es el caso. En el nivel de base de datos, la representación de datos puede ser muy diferente y tratar de mapearlo automáticamente en colecciones de Java no tiene necesariamente ningún sentido. Es por eso que Hibernate es un ejemplo perfecto de "abstracción permeable". MyBatis es mucho más simple, fácil de comprender, no hay magia y ... sí, hay SQL, lo cual me parece bueno porque no hay nada de malo en usar SQL para bases de datos basadas en SQL.
Marcin
2
@Marcin gran punto. He visto demasiados problemas con la emulación de colecciones en Hibernate. Por ejemplo, algunas llamadas de código myBag.size () e Hibernate intenta cargar 750K objetos en la memoria antes de contarlos. Si solo necesita SQL, use SQL.
Joseph Lust
19

MyBatis está centrado en SQL. Le ayuda a llamar a sentencias SQL y mapear resultados (tablas) a árboles de objetos.

El principal beneficio es que no es un ORM. No asigna tablas a objetos, por lo que no sufre la falta de coincidencia de impedancia de orm. Se adapta bien para bases de datos complejas o heredadas o para usar características de db como procedimientos almacenados, vistas, etc.

Es bastante simple y fácil de aprender, por lo que se adapta bien a los equipos poco calificados porque no hay necesidad de tener un gurú de hibernación entre ellos.

Echa un vistazo a jpetstore 6 http://mybatis.org/spring/sample.html

Diego
fuente
2
Esos "equipos poco calificados" todavía necesitan saber SQL.
perp
Buena respuesta concisa, las dos diferencias principales son las siguientes: db céntrica + curva de aprendizaje superficial. Pero no estoy totalmente de acuerdo con "Se adapta bien para bases de datos complejas o heredadas". La ventaja de estar centrado en db se hace más evidente cuando tienes más control sobre el diseño de db.
DPM
5

Como la pregunta se refiere a mi comentario , esto es lo que tenía en mente al escribirlo.

En primer lugar, se deriva del contexto de su pregunta original. En otras circunstancias, podría dar un consejo diferente. El punto que me hizo sugerir MyBatis es este:

... encontramos algunos problemas de rendimiento.

Decidimos dejar de hibernar a favor de Jdbc para ganar rendimiento en la base de datos ...

En uno de los proyectos anteriores, nuestro equipo ha considerado mudarse de Hibernate por las razones que usted describe. Al igual que usted, íbamos a cambiar a JDBC, pero colegas de otro proyecto nos recomendaron MyBatis. El equipo decidió intentarlo, manteniendo JDBC como una opción alternativa en el caso de que las cosas salgan mal.

En ese momento, no sabía nada sobre MyBatis, pero tenía suficiente experiencia con JDBC para asegurarme de que haría el trabajo. A pesar de esto, había apoyado firmemente la idea de probar MyBatis, la razón principal es que, según mi experiencia anterior, la cantidad de código repetitivo que tendríamos que escribir con JDBC sería desalentador.

  • Para ser justos, me gusta JDBC por ser simple de entender, confiable y por dar una buena sensación de control sobre la interacción de la base de datos, pero el precio que uno paga es realmente alto. Mis dedos comienzan a dolerme cada vez que recuerdo cuánto repetitivo tuve que escribir con JDBC.

De todos modos, probamos MyBatis y funcionó como se anuncia. Es por eso que escribí el comentario que preguntas.

En caso de que espere que le dé una descripción detallada de la tecnología, o de alguna manera elogie su superioridad, lo siento, no puedo hacer eso. Si pudiera, ya lo escribiría en una respuesta separada a su pregunta original, en lugar de dar un breve comentario. Mencioné que no sabía nada sobre MyBatis en ese entonces, bueno, todavía tengo muy poco conocimiento de eso, lo siento. La transición desde Hibernate fue realizada por otros miembros del equipo y no afectó el código en el que he estado trabajando. Solo recordé las conclusiones clave (en base a las cuales hice mi comentario), a saber, que 1) MyBatis resolvió los problemas que teníamos con Hibernate, 2) no introdujo problemas propios y 3) nos permitió evitar escribir código repetitivo I esperaba en caso de que cambiemos a JDBC. Eso es todo.

mosquito
fuente
3

Hibernate es conocido por demasiada magia , comportamiento inesperado y gran curva de aprendizaje. Existen otros marcos que están más enfocados en la simplicidad y le permitirán tener el control.

myBatis es uno de ellos, mi proyecto MentaBean es otro. He escrito una publicación de blog sobre eso que podría ayudar.

Sergio Oliveira Jr.
fuente
66
Hola Sergio y bienvenido. Nuestra comunidad generalmente desaprueba la autopromoción abierta y le exigimos que revele claramente su afiliación en sus respuestas. He editado su respuesta para señalar que MentaBean es un proyecto en el que está involucrado, y que ha escrito la publicación de blog que señala, si no le gusta la redacción, siéntase libre de cambiarla, pero por favor mantenga algunos tipos de divulgación de que estás involucrado con MentaBean. Lea la sección correspondiente en nuestras Preguntas frecuentes para obtener más detalles.
Yannis
Hola yannis Lo haré. Gracias por el aviso. :)
Sergio Oliveira Jr.
-1

Utilicé Hibernate para un proyecto de carga y transformación de datos hace 5 años utilizando Hibernate 3 y pensé que era maravilloso. Estoy haciendo una pequeña aplicación de comercio electrónico e intenté usar Hibernate 4 y quedé extremadamente decepcionado. Han eliminado las herramientas y se han integrado estrechamente al IDE. Probé MyBatis y todo funciona en una sola noche y estoy muy contento con lo fácil que es integrarlo en una aplicación. Creo que Hibernate se ha hinchado demasiado y usaría EJB 3 sobre Hibernate en este punto.

marland
fuente
1
¿Cómo se comparan EJB 3 e Hibernate?
José