Was sind die Vorteile von myBatis gegenüber dem Ruhezustand? [geschlossen]

33

Ich habe selbst recherchiert und das Grundkonzept verstanden. Einige Einsichten können jedoch nur durch tatsächliche Erfahrung gewonnen werden.

Was sind die Vorteile von myBatis, die es lohnen, ein neues Framework zu erlernen?
In welchem ​​Fall würden Sie es vermeiden, es zu benutzen?

Kshitiz Sharma
quelle
3
Ich habe beides getestet und bin mit Cayenne gelandet.
Deadalnix

Antworten:

38

Überlegen Sie, was Sie erreichen möchten. In der Regel funktioniert das Command Query Response Segregation- Modell gut für komplexe Domänen.

Der Grund ist, dass Sie in der Regel eines von zwei Dingen versuchen:

  1. Erstellen / Aktualisieren / Löschen einiger komplexer Domänenentitäten
  2. Ausführen von analytischen Abfragen zum Abrufen (z. B. Summierungs- / Aggregationsabfragen)

Der Ruhezustand funktioniert gut für Fall 1, sodass Sie nur ein POJO erstellen und es beibehalten / aktualisieren können. Dies geschieht auch schnell, es sei denn, Ihre Domain ist recht groß.

myBatis eignet sich hervorragend zum Abrufen von Abfragen (Fall 2), bei denen Sie nur eine Antwort wünschen. Hibernate würde versuchen, das gesamte Objektdiagramm zu laden, und Sie müssten Abfragen mit LazyLoading-Tricks optimieren, damit es in einer großen Domäne funktioniert. Dies ist wichtig, wenn komplexe analytische Abfragen ausgeführt werden, die nicht einmal Entitätsobjekte zurückgeben. Hibernate bietet in diesem Fall nur SqlQuery- und Bean-Transformers mit umfangreichen Standardtypen wie BigDecimal an, während myBatis leicht einer einfachen POJO-Nichtentität zugeordnet werden kann.

Diese beiden Fälle unterscheiden sich zwischen Befehlen, bei denen Sie die Domänendaten ändern möchten, und Antworten, bei denen Sie nur einige Daten abrufen möchten.

Betrachten Sie also diese beiden Fälle und die Aufgaben Ihrer Anwendung. Wenn Sie eine einfache Domain haben und nur Informationen abrufen, verwenden Sie myBatis. Wenn Sie eine komplexe Domäne haben und Entitäten beibehalten, verwenden Sie den Ruhezustand. Wenn Sie beides tun, ziehen Sie einen hybriden Ansatz in Betracht. Das ist es, was wir für unser Projekt verwenden, das Tausende von Einheiten hat, um es unter Kontrolle zu halten. ;)

Joseph Lust
quelle
2
Der Ruhezustand funktioniert auch in Fall 2 gut. Ein einfaches Beispiel finden Sie unter: mkyong.com/hibernate/hibernate-native-sql-queries-examples
Mike Partridge
3
"Hibernate würde versuchen, den gesamten Objektgraphen zu laden" klingt nach einem Konfigurationsfehler. "Abfragen müssen mit LazyLoading-Tricks optimiert werden" klingt, als hätten Sie irgendwo fetch = eager gesetzt. JPA verfügt über JPQL, das praktisch SQL ist und dennoch gut in Hibernate / JPA integriert ist. Ich denke, es macht # 2 sehr gut. Es ist üblich, dass Benutzer ein Jahr oder länger in der Produktion arbeiten, bevor ein ORM zu 100% korrekt konfiguriert wird. Ich minimiere nicht, wenn ich sage, dass es sich um einen Konfigurationsfehler handelt - die Konfiguration mit diesen Tools kann sehr zeitaufwändig und schwierig sein!
GlenPeterson
3
@ GlenPeterson Ich sage nicht, dass der Ruhezustand nicht gezähmt werden kann, aber für die meisten Benutzer werden komplexe Domänenentitäten nur langsam geladen, wenn Optimierungen vorgenommen werden, wie Sie angegeben haben. Komplexe analytische Abfragen sind mit myBatis für die meisten Benutzer einfacher, obwohl dies auch mit einem ORM möglich ist. Die Frage für viele ist, ob sie die Herstellerunabhängigkeit dieses ORM für ihr Produkt benötigen.
Joseph Lust
10
Der Ruhezustand gibt vor, dass sich keine Datenbank darunter befindet, und Sie behandeln Ihr Datenmodell einfach so, als ob es mit Java-Auflistungen erstellt wurde. Was sehr oft nicht der Fall ist. Auf DB-Ebene kann die Datendarstellung sehr unterschiedlich sein, und der Versuch, sie automatisch in Java-Sammlungen abzubilden, ist nicht unbedingt sinnvoll. Aus diesem Grund ist Hibernate ein perfektes Beispiel für "Leaky Abstraction". MyBatis ist viel einfacher, leicht zu verstehen, es gibt keine Magie und ... ja, es gibt SQL, was ich gut finde, weil nichts falsch daran ist, SQL für SQL-basierte Datenbanken zu verwenden.
Marcin
2
@Marcin großer Punkt. Ich habe zu viele Probleme mit der Kollektionsemulation in Hibernate gesehen. Beispielsweise ruft ein Code myBag.size () auf, und Hibernate versucht, 750 KB-Objekte in den Speicher zu laden, bevor sie gezählt werden. Wenn Sie nur SQL benötigen, verwenden Sie SQL.
Joseph Lust
19

MyBatis ist SQL-zentriert. Es verhindert das Aufrufen von SQL-Anweisungen und das Zuordnen von Ergebnissen (Tabellen) zu Objektbäumen.

Der Hauptvorteil ist, dass es kein ORM ist. Es ordnet keine Tabellen einem Objekt zu und leidet daher nicht an der Fehlanpassung der Orm-Impedanz. Geeignet für komplexe oder ältere Datenbanken oder zur Verwendung von Datenbankfunktionen wie gespeicherten Prozeduren, Ansichten usw.

Es ist recht einfach und leicht zu erlernen und eignet sich daher auch gut für gering qualifizierte Teams, da kein Guru im Winterschlaf erforderlich ist.

Schauen Sie sich jpetstore 6 an http://mybatis.org/spring/sample.html

Diego
quelle
2
Diese "gering qualifizierten Teams" müssen noch SQL kennen.
perp
Gute prägnante Antwort, die beiden Hauptunterschiede sind: db-zentrierte + flache Lernkurve. Aber ich bin nicht ganz einverstanden mit "Passt gut für komplexe oder ältere Datenbanken". Der Vorteil, db-zentriert zu sein, wird deutlicher, wenn Sie mehr Kontrolle über das db-Design haben.
DPM
5

Da sich die Frage auf meinen Kommentar bezieht , wollte ich ihn hier schreiben.

Zunächst wird es aus dem Kontext Ihrer ursprünglichen Frage abgeleitet. Unter anderen Umständen könnte ich einen anderen Rat geben. Der Punkt, der mich veranlasste, MyBatis vorzuschlagen, ist folgender:

... sind wir auf Leistungsprobleme gestoßen.

Wir haben beschlossen, den Ruhezustand zugunsten von Jdbc aufzuheben, um die Datenbankleistung zu verbessern ...

In einem der vergangenen Projekte hat unser Team aus den von Ihnen beschriebenen Gründen über einen Umzug aus dem Ruhezustand nachgedacht. Ähnlich wie Sie wollten wir zu JDBC wechseln, aber Kollegen aus einem anderen Projekt haben uns MyBatis empfohlen. Das Team entschied sich, es zu versuchen und JDBC als Ausweichoption beizubehalten, falls etwas schief gehen sollte.

In diesem Moment wusste ich nichts über MyBatis, hatte aber genug Erfahrung mit JDBC, um sicherzugehen, dass es den Job machen wird. Trotzdem hatte ich die Idee, MyBatis auszuprobieren, nachdrücklich befürwortet. Der Hauptgrund dafür war, dass die Menge an Code, die wir mit JDBC schreiben müssten, nach meiner bisherigen Erfahrung nur entmutigend wäre.

  • Um fair zu sein, ich mag JDBC, weil es einfach zu verstehen und zuverlässig ist und ein gutes Gefühl für die Kontrolle über die Datenbankinteraktion vermittelt, aber der Preis, den man dafür zahlt, ist wirklich hoch. Jedes Mal, wenn ich mich erinnere, wie viel Boilerplate ich mit JDBC tippen musste, schmerzen meine Finger.

Wie auch immer, wir haben MyBatis ausprobiert und es hat wie angekündigt funktioniert. Deshalb habe ich den Kommentar geschrieben, nach dem Sie fragen.

Falls Sie von mir einen detaillierten Überblick über die Technologie erwarten oder deren Überlegenheit loben möchten - tut mir leid, dass ich das nicht kann. Wenn ich könnte - würde ich das bereits in einer separaten Antwort auf Ihre ursprüngliche Frage schreiben, anstatt einen kurzen Kommentar abzugeben. Ich erwähnte, dass ich damals nichts über MyBatis wusste - nun, ich habe immer noch ziemlich wenig Wissen darüber, sorry. Der Wechsel aus dem Ruhezustand wurde von anderen Teammitgliedern durchgeführt und hatte keinen Einfluss auf den Code, an dem ich gearbeitet habe. Ich erinnerte mich nur an wichtige Erkenntnisse (auf deren Grundlage ich meinen Kommentar abgegeben habe), nämlich: 1) MyBatis hat die Probleme mit Hibernate behoben, 2) es wurden keine eigenen Probleme eingeführt, und 3) es hat uns ermöglicht, das Schreiben von Boilerplate-Code I zu vermeiden Ich habe erwartet, falls wir zu JDBC wechseln. Das ist alles.

Mücke
quelle
3

Hibernate ist bekannt für zu viel Magie , unerwartetes Verhalten und große Lernkurve. Es gibt andere Frameworks, die sich mehr auf Einfachheit konzentrieren und Ihnen die Kontrolle geben.

myBatis ist eine davon, mein Projekt MentaBean ist eine andere. Ich habe einen Blog-Beitrag darüber geschrieben, der helfen könnte.

Sergio Oliveira Jr.
quelle
6
Hallo Sergio und herzlich willkommen. Unsere Community runzelt im Allgemeinen die Stirn, wenn sie offen für sich wirbt, und wir fordern Sie auf , Ihre Zugehörigkeit in Ihren Antworten klar offenzulegen. Ich habe Ihre Antwort bearbeitet, um darauf hinzuweisen, dass MentaBean ein Projekt ist, an dem Sie beteiligt sind, und dass Sie den Blog-Beitrag geschrieben haben, auf den Sie verweisen. Wenn Sie die Formulierung nicht mögen, können Sie sie gerne ändern Einige Arten der Offenlegung, dass Sie an MentaBean beteiligt sind. Lesen Sie den entsprechenden Abschnitt in unseren FAQ für weitere Details.
Yannis
Hallo Yannis. Ich werde das machen. Vielen Dank für die Köpfe hoch. :)
Sergio Oliveira Jr.
-1

Ich habe Hibernate vor 5 Jahren für ein Datenlade- und Datenumwandlungsprojekt mit Hibernate 3 verwendet und fand es wunderbar. Ich mache eine kleine E-Commerce-Anwendung und habe versucht, Hibernate 4 zu verwenden. Ich war äußerst enttäuscht. Sie haben die Tools entfernt und eng in die IDE integriert. Ich habe MyBatis ausprobiert und ich arbeite alles in einer einzigen Nacht und bin sehr zufrieden damit, wie einfach es ist, sich in eine Anwendung zu integrieren. Ich denke, Hibernate ist zu aufgebläht und ich würde an dieser Stelle EJB 3 anstelle von Hibernate verwenden.

Marland
quelle
1
Wie vergleichen sich EJB 3 und Hibernate ???
Jose