web-dev-qa-db-fra.com

Quels sont les avantages de myBatis par rapport à Hibernate?

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

Quels sont les avantages de myBatis qui mériteraient d'apprendre un nouveau framework?
Dans quel cas éviteriez-vous de l'utiliser?

35
Kshitiz Sharma

Considérez ce que vous essayez de réaliser. En règle générale, le modèle Ségrégation des réponses aux requêtes 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 de récupération analytique (c'est-à-dire des requêtes de sommation/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, sauf si votre domaine est assez volumineux.

myBatis est idéal pour récupérer des requêtes (cas 2) où vous voulez juste une réponse. Hibernate tenterait de charger l'intégralité du graphique d'objet et vous auriez besoin de commencer à régler les requêtes avec des astuces LazyLoading pour le faire 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 ne propose que SqlQuery et Bean Transformers dans ce cas avec d'énormes types par défaut comme BigDecimal, tandis que myBatis pourrait facilement mapper vers une simple non-entité POJO.

Ces deux cas sont la différence entre les commandes où vous souhaitez modifier les données du domaine et les réponses où vous voulez simplement récupérer des données.

Considérez donc 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 sur notre projet qui a des milliers d'entités pour le garder sous contrôle. ;)

39
Joseph Lust

MyBatis est centré sur SQL. Il vous aide à appeler les instructions SQL et à mapper les résultats (tables) aux arborescences d'objets.

Le principal avantage est qu'il ne s'agit pas d'un ORM. Il ne mappe pas les tables à l'objet et ne souffre donc pas de l'inadéquation de l'impédance orm. Convient bien pour les bases de données complexes ou héritées ou pour utiliser des fonctionnalités db comme les procédures stockées, les vues, etc.

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

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

20
Diego

Depuis le la question se réfère à mon commentaire , voici ce que j'avais en tête de l'écrire.

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

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

Nous avons décidé d'abandonner l'hibernation au profit de Jdbc simple pour gagner en performances de 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é de l'essayer, tout en conservant JDBC comme option de secours dans le cas où les choses tournent mal.

À ce moment-là, je ne savais rien de MyBatis mais j'avais suffisamment d'expérience avec JDBC pour être sûr qu'il fera l'affaire. Malgré cela, j'avais fortement soutenu l'idée d'essayer MyBatis, la raison principale étant que d'après mon expérience passée, la quantité de code standard que nous aurions à écrire avec JDBC serait tout simplement décourageante.

  • Pour être juste, j'aime JDBC car il est simple à comprendre, fiable et donne une bonne sensation de contrôle sur l'interaction de la base de données, mais le prix à payer est vraiment élevé. Mes doigts commencent à me faire mal à chaque fois que je me rappelle combien de passe-partout 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.

Dans le cas où vous vous attendez à ce que je donne un aperçu détaillé de la technologie, ou que vous louiez en quelque sorte sa supériorité - désolé, je ne peux pas le faire. Si je pouvais - j'écrirais déjà cela dans une réponse distincte à votre question initiale, au lieu de faire un bref commentaire. J'ai mentionné que je ne savais rien à propos de MyBatis à l'époque - eh bien, j'en ai encore assez peu, désolé. La transition depuis Hibernate a été effectuée par d'autres membres de l'équipe et cela n'a pas eu d'impact sur le code sur lequel je travaillais. Je n'ai rappelé que les points clés à 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 attendait au cas où si nous passions à JDBC. C'est tout.

5
gnat

Hibernate est bien connu pour trop de magie , un comportement inattendu et une grande courbe d'apprentissage. Il existe d'autres cadres qui sont plus axés sur la simplicité et vous permettront de contrôler.

myBatis est l'un d'entre eux, mon projet MentaBean en est un autre. J'ai écrit un blog post à ce sujet qui pourrait aider.

3