Quels sont les avantages de myBatis par rapport à Hibernate? [fermé]

33

J'ai moi-même fait des recherches et je comprends le concept de base. Mais certaines connaissances ne peuvent être acquises que par l'expérience réelle.

Quels sont les avantages de myBatis qui rendraient l’apprentissage d’un nouveau cadre intéressant?
Dans quel cas éviterais-tu de l'utiliser?

Kshitiz Sharma
la source
3
J'ai testé les deux et j'ai fini par utiliser Cayenne.
deadalnix

Réponses:

38

Considérez ce que vous essayez d'atteindre. En règle générale, le modèle de séparation des réponses de requête de commande fonctionne bien pour les domaines complexes.

La raison en est que vous essayez généralement de faire l'une des deux choses suivantes:

  1. Créer / Mettre à jour / Supprimer des entités de domaine complexes
  2. Exécuter des requêtes d'extraction analytique (c'est-à-dire des requêtes de totalisation / agrégation)

Hibernate fonctionne bien pour le cas 1 vous permettant de créer un POJO et de le conserver / mettre à jour. Il le fait également rapidement, à moins que votre domaine ne soit assez volumineux.

myBatis est idéal pour les requêtes d'extraction (cas 2) pour lesquelles vous voulez juste une réponse. Hibernate essaierait de charger tout le graphe d'objet et vous auriez besoin de commencer à ajuster les requêtes avec des astuces LazyLoading pour qu'il continue à fonctionner sur un grand domaine. Ceci est important lors de l'exécution de requêtes analytiques complexes qui ne renvoient même pas d'objets d'entité. Hibernate n'offre dans ce cas que des transformateurs SqlQuery et bean Transformers avec d'énormes types par défaut tels que BigDecimal, tandis que myBatis pourrait facilement être mappé sur une simple non-entité POJO.

Ces deux cas sont la différence entre les commandes pour lesquelles vous souhaitez modifier les données du domaine et les Réponses pour lesquelles vous souhaitez simplement extraire des données.

Alors, considérons ces deux cas et ce que fait votre application. Si vous avez un domaine simple et récupérez simplement des informations, utilisez myBatis. Si vous avez un domaine complexe et des entités persistantes, utilisez Hibernate. Si vous faites les deux, envisagez une approche hybride. C’est ce que nous utilisons dans notre projet qui compte des milliers d’entités pour le garder sous contrôle. ;)

Joseph Lust
la source
2
Hibernate fonctionne bien avec votre cas 2 également. Pour un exemple simple, voir: mkyong.com/hibernate/hibernate-native-sql-queries-examples
Mike Partridge
3
"Hibernate essaierait de charger le graphe d'objet entier", cela ressemble à une erreur de configuration. "Il est nécessaire de commencer à paramétrer les requêtes avec des astuces LazyLoading", comme si vous aviez défini fetch = désireux quelque part. JPA a JPQL qui est pratiquement SQL, mais bien intégré avec Hibernate / JPA. Je pense que c'est très bien # 2. Il est courant que des personnes travaillent en production pendant un an ou plus avant de configurer un ORM à 100% correctement. Je ne minimise pas quand je dis que c'est une erreur de configuration - la configuration avec ces outils peut prendre beaucoup de temps et être délicate!
GlenPeterson
3
@GlenPeterson Je ne dis pas que Hibernate ne peut pas être apprivoisé, mais pour la plupart des gens, les entités de domaine complexes seront chargées lentement, à moins que des optimisations ne soient effectuées, comme vous l'avez indiqué plus haut. Les requêtes analytiques complexes sont plus simples avec myBatis pour la plupart des utilisateurs, bien que la même chose puisse être obtenue avec un ORM. Pour beaucoup, la question est de savoir s'ils ont besoin de l'indépendance du fournisseur d'ORM pour leur produit.
Joseph Lust
10
Hibernate prétend qu'il n'y a pas de base de données en dessous et que vous traitez votre modèle de données comme s'il avait été conçu à l'aide de collections Java. Ce qui est très souvent pas le cas. Au niveau de la base de données, la représentation des données peut être très différente et essayer de le mapper automatiquement dans des collections Java n’a aucun sens. C'est pourquoi Hibernate est un exemple parfait de "l'abstraction qui fuit". MyBatis est beaucoup plus simple, facile à comprendre, il n'y a pas de magie et .. oui, il y a du SQL que je trouve bien, car il n'y a rien de mal à utiliser SQL pour les bases de données SQL.
Marcin
2
@Marcin excellent point. J'ai vu trop de problèmes d'émulation de collections dans Hibernate. Par exemple, certains codes appellent myBag.size () et Hibernate essaie de charger des objets de 750K en mémoire avant de les compter. Si vous avez seulement besoin de SQL, utilisez SQL.
Joseph Lust
19

MyBatis est centré sur SQL. Il vous permet d’appeler des instructions SQL et d’affecter des résultats (tables) à des arborescences d’objets.

Le principal avantage est que ce n'est pas un ORM. Il ne mappe pas les tables sur les objets et ne souffre donc pas du désadaptation des impédances orm. Convient aux bases de données complexes ou existantes ou à l'utilisation de fonctionnalités de base de données telles que les procédures stockées, les vues, etc.

Il est assez simple et facile à apprendre, il convient donc également aux équipes peu qualifiées, car il n’est pas nécessaire d’avoir un gourou en veille prolongée parmi elles.

Jetez un coup d'œil à jpetstore 6 http://mybatis.org/spring/sample.html

Diego
la source
2
Les "équipes peu qualifiées" doivent toujours connaître SQL.
perp
Bonne réponse concise, les deux différences principales sont celles-ci: courbe d’apprentissage centrée + superficielle. Mais je ne suis pas tout à fait d’accord avec «convient bien aux bases de données complexes ou traditionnelles». L'avantage d'être centré sur la base de données devient plus évident lorsque vous avez plus de contrôle sur la conception de la base de données.
DPM
5

Puisque la question fait référence à mon commentaire , voici ce que j'avais en tête de l'écrire.

Tout d'abord, cela découle du contexte de votre question initiale. Dans d'autres circonstances, je pourrais donner un conseil différent. Le point qui m'a fait suggérer MyBatis est la suivante:

... nous avons rencontré des problèmes de performances.

Nous avons décidé de laisser tomber l'hibernation en faveur de Jdbc pour améliorer les performances de la base de données ...

Dans l'un des projets précédents, notre équipe a envisagé de quitter Hibernate pour les raisons que vous décrivez. Comme vous, nous allions passer à JDBC, mais des collègues d’un autre projet nous ont recommandé MyBatis. L'équipe a décidé d'essayer, tout en conservant JDBC comme option de secours en cas de problème.

À ce moment-là, je ne connaissais rien à MyBatis, mais j’avais suffisamment d’expérience avec JDBC pour être sûr que cela fonctionnerait. Malgré cela, je soutenais fortement l'idée d'essayer MyBatis, principalement parce que, selon mon expérience passée, la quantité de code passe-partout que nous aurions à écrire avec JDBC serait simplement décourageante.

  • Pour être juste, j'aime JDBC pour sa simplicité de compréhension, sa fiabilité et pour lui permettre de bien contrôler les interactions avec les bases de données, mais le prix à payer est très élevé. Mes doigts commencent à me faire mal chaque fois que je me souviens de la quantité de passe-passe que j'ai dû taper avec JDBC.

Quoi qu'il en soit, nous avons essayé MyBatis et cela a fonctionné comme annoncé. C'est pourquoi j'ai écrit le commentaire que vous demandez.

Au cas où, si vous attendez de moi que je vous donne un aperçu détaillé de la technologie, ou que vous louiez sa supériorité, désolé, je ne peux pas le faire. Si je pouvais - je l’aurais déjà écrit dans une réponse distincte à votre question initiale, au lieu de faire un bref commentaire. J'ai mentionné que je ne savais rien de MyBatis à l'époque - eh bien, j'en ai encore assez peu de connaissances désolé. La transition à partir d'Hibernate a été effectuée par d'autres membres de l'équipe et cela n'a pas eu d'incidence sur le code sur lequel je travaillais. Je n’ai fait que rappeler les points à retenir (sur la base desquels j’ai fait mon commentaire), à ​​savoir que 1) MyBatis a résolu les problèmes que nous avions avec Hibernate, 2) il n’a pas introduit de problèmes propres et 3) il nous a permis d’éviter d’écrire le code standard I s’attendait au cas où nous passerions à JDBC. C'est tout.

moucheron
la source
3

Hibernate est bien connu pour sa magie , son comportement inattendu et sa courbe d’apprentissage. Il existe d'autres cadres plus axés sur la simplicité et qui vous permettront de garder le contrôle.

myBatis en fait partie, mon projet MentaBean en est un autre. J'ai écrit un billet de blog à ce sujet qui pourrait aider.

Sergio Oliveira Jr.
la source
6
Bonjour Sergio et bienvenue. Notre communauté désapprouve généralement la promotion de soi, et nous vous demandons de clairement indiquer votre affiliation dans vos réponses. J'ai modifié votre réponse pour souligner que MentaBean est un projet dans lequel vous êtes impliqué et que vous avez écrit le message de blog auquel vous faites référence. Si vous n'aimez pas le phrasé, n'hésitez pas à le modifier, mais continuez. certaines sortes de divulgation que vous êtes impliqué avec MentaBean. Lisez la section correspondante de notre FAQ pour plus de détails.
Yannis
Salut Yannis. Je le ferai. Merci pour l'information. :)
Sergio Oliveira Jr.
-1

J'ai utilisé Hibernate pour un projet de chargement et de transformation de données il y a 5 ans avec Hibernate 3 et j'ai pensé que c'était merveilleux. Je fais une petite application de commerce électronique et j'ai essayé d'utiliser Hibernate 4 et j'ai été extrêmement déçu. Ils ont supprimé les outils et étroitement intégrés à l'IDE. J'ai essayé MyBatis et je travaille tout en une nuit et je suis ravi de la facilité avec laquelle il est facile de l'intégrer à une application. Je pense que Hibernate est devenu trop lourd et que j'utiliserais maintenant EJB 3 par rapport à Hibernate.

Marland
la source
1
Comment se comparent EJB 3 et Hibernate ???
José