Ruhezustand gegen iBATIS [geschlossen]

78

Für unser neues Produkt-Re-Engineering sind wir dabei, das beste Framework aus Java auszuwählen. Da ein datenbankunabhängiger Ansatz für das Modell in Betracht gezogen wird, arbeiten wir an Optionen zwischen Struts + Spring mit iBATIS oder Hibernate. Bitte beraten Sie, was am besten ist, da beide Ausdauer bieten.

Jonas
quelle

Antworten:

190

iBATIS und Hibernate sind ganz unterschiedliche Tiere.

Ich sehe das eher so: Der Ruhezustand funktioniert besser, wenn Ihre Ansicht objektorientierter ist . Wenn Ihre Ansicht jedoch datenbankzentrierter ist, ist iBATIS eine viel stärkere Wahl.

Wenn Sie die vollständige Kontrolle über Ihr Schema haben und keine extrem hohen Durchsatzanforderungen haben, kann der Ruhezustand recht gut funktionieren. Das Objektmodell bietet ziemlich bequemen Code, jedoch mit enormen Komplexitätskosten.

Wenn Sie mit einem "Legacy" -Datenbankschema arbeiten, in dem Sie ziemlich komplizierte SQL-Abfragen schreiben müssen, funktioniert iBATIS wahrscheinlich besser.

HQL (Hibernate Query Language) ist eine weitere Sprache, die Sie lernen müssen, und selbst dann werden Sie wahrscheinlich Fälle finden, in denen Sie noch SQL schreiben müssen. Darüber hinaus werden Sie wahrscheinlich einen halben Tag damit verbringen, die richtige Kombination aus XML, Eigenschaften, Anmerkungen usw. herauszufinden, damit Hibernate eine performante SQL-Abfrage generiert.

Für diese Frage gibt es keine universelle Antwort "A ist besser als B".

Cletus
quelle
Für ein leichtes und winziges ORM mit SQL Builder überprüfen Sie MentaBean: mentabean.soliveirajr.com
TraderJoeChicago
20
Jetzt, 2 Jahre später, ist dies mit dem Aufkommen von jpa immer noch wahr, der Winterschlaf hat sich ziemlich verändert und ibatis ist jetzt mybatis. Ich frage mich, was die aktuellen Gedanken der Leute da draußen sind.
Joelio
Es ist jedoch gut, einen der JPA2.0-kompatiblen JPA-Anbieter wie Hibernatate, EclipseLink, Toplink usw. für die Entwicklung neuer Webanwendungen in Betracht zu ziehen. Wie Cletus betonte, ist iBatis auch gut.
Sree Rama
2
Mit mybatis haben Sie eine klarere Kontrolle, also mehr Drecksarbeit. Aber ich persönlich mag mybatis.
Eric Wang
@cletus Ist es noch wahr?
Suganthan Madhavan Pillai
51

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

Der Grund ist, dass Sie normalerweise versuchen, eines von zwei Dingen zu tun:

  1. Erstellen / Aktualisieren / Löschen einiger komplexer Domänenentitäten
  2. Führen Sie analytische Abrufabfragen aus (dh Summations- / Aggregationsabfragen).

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

myBatis eignet sich hervorragend zum Abrufen von Abfragen (Fall 2), bei denen Sie nur eine Antwort wünschen. Der Ruhezustand 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. Umgekehrt wäre die myBatis-Implementierung derselben Abfrage trivial, wenn Sie nur eine analytische POJO-Seite wünschen.

Aus diesem Grund ist myBatis bei SELECTS schneller als Hibernate .

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

Betrachten Sie diese beiden Fälle und die Funktionsweise 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 verwenden wir für unser Projekt, das Tausende von Entitäten hat, um es unter Kontrolle zu halten. ;)

Joseph Lust
quelle
20

ORM vs Persistenz-Framework

Hibernate ist ein Object Relation Mapping Framework (ORM), das Java-Klassen Datenbanktabellen zuordnet. MyBatis ist ein Persistenz-Framework - kein ORM. Es ordnet SQL-Anweisungen Java-Methoden zu.

Datenbankschema

Der Ruhezustand kann ein Datenbankschema gemäß Ihrem Java-Modell erstellen oder validieren, während MyBatis nicht über eine solche Funktion verfügt. Es ist auch praktisch zum Testen der Umgebung, wenn Sie eine In-Memory-Datenbank verwenden. Verwandte Diskussionen:

Zwischenspeicher

Der Ruhezustand verfügt über einen Cache der ersten Ebene, der nicht deaktiviert werden kann. Wenn Sie ein Element über ORM abfragen und es dann direkt mit SQL löschen, bleibt es im Cache. Sie können den Cache explizit leeren, um die aktuellsten Ergebnisse aus der Datenbank zu erhalten. Verwandte Diskussionen:

Optimistisches Schlossmanagement

Es gibt auch Unterschiede für ein optimistisches Schlossmanagement:

MyBatis unterstützt nativ keine optimistische Parallelitätskontrolle, im Gegensatz zu ORM-Tools wie Hibernate / JPA mit der Annotation @Version.

Verwandte Diskussionen:

Faules Laden

Der Ruhezustand versucht, das gesamte Objektdiagramm zu laden, mit Ausnahme von Objekten, die zum verzögerten Laden markiert sind. myBatis lädt Daten gemäß einer SQL-Abfrage. Ein verzögertes Laden kann die Leistung verbessern, kann jedoch zu Verbindungslecks führen, wenn es mit <property name="hibernate.enable_lazy_load_no_trans" value="true" /> Eigenschaften verwendet wird. Verwandte Diskussionen:

Sitzungsverwaltung im Ruhezustand

Entities Operationen wie das Speichern, Aktualisieren oder Löschen von über Hibernate ausgeführt Session . Es erfordert ein gutes Verständnis für die Implementierung einer ordnungsgemäßen Strategie zur Verwaltung von Ruhezustandsitzungen, um detached entity passed to persistandere mit dem Ruhezustand verbundene Phänomene zu vermeiden .

Manchmal kann es länger dauern, das zugrunde liegende Verhalten im Ruhezustand zu verstehen, als ein wenig mehr Arbeit hinzuzufügen und unformatierte SQL-Anweisungen für myBatis zu schreiben.

Kaskadieren

Hibernate bietet Kaskadierung, Orphan-Entfernung und andere Funktionen für Objektdiagramme, die in myBatis nicht vorhanden sind. Um sie zu implementieren, müssen Sie SQL-Abfragen explizit schreiben.

Abfragen

In myBatis schreiben Sie fast einfache SQL-Abfragen. Der Ruhezustand bietet mehrere Optionen zum Erstellen von Abfragen: SQL, HQL, Kriterien-API. Manchmal kann es geeignet sein, die Kriterien-API zu verwenden, wenn Sie viele optionale Felder in Kriterien haben. Dies würde einen strukturierteren Ansatz für die Formularabfrage bieten und möglicherweise damit verbundene Fehler vermeiden.

Genauso wie
quelle
18

Cletus hat diesen Vergleich hervorragend zusammengefasst. Der Ruhezustand funktioniert gut, wenn Sie das Datenmodell steuern, und ist objektzentrierter, während iBATIS gut funktioniert, wenn Sie in eine vorhandene Datenbank integrieren müssen, und datenzentrierter ist.

Ich denke auch, dass Hibernate etwas mehr Lernkurve hat. Mit iBATIS ist es ziemlich einfach zu wissen, was los ist, während mit Hibernate mehr "Magie" passiert. Mit anderen Worten, Neulinge finden iBatis möglicherweise einfacher zu verwenden und zu verstehen.

Aber ich sage nicht, dass Sie iBatis bevorzugen sollten, iBatis und Hibernate sind einfach anders, wie oben gesagt.

Übrigens, wenn Sie sich für den Ruhezustand entscheiden, sollten Sie möglicherweise standardisierte JPA- und EJB 3.0 (JSR-220) -Objekt- / relationale Zuordnungsanmerkungen verwenden, die von Hibernate- Anmerkungen bereitgestellt werden .

Pascal Thivent
quelle
8

Der Ruhezustand ist ein ORM, dh (auf seiner grundlegendsten Ebene) werden Instanzen von Java-Objekten tatsächlichen Zeilen in einer Datenbanktabelle zugeordnet. Im Allgemeinen gilt für Pojos, die über den Ruhezustand abgerufen wurden: Alle Manipulationen und Änderungen an diesen Pojos werden in der Datenbank angezeigt. Der Ruhezustand generiert und führt die entsprechende SQL zu einem geeigneten Zeitpunkt aus.

Mybatis (im Grunde genommen) ist einfach ein Tool zum Zusammensetzen und Ausführen von SQL, das in XML-Dateien gespeichert ist. Es ordnet keine Instanzen von Java-Objekten Zeilen in einer Datenbanktabelle zu, sondern ordnet Java-Methoden SQL-Anweisungen zu und ist daher kein ORM. Es kann natürlich auch Pojos zurückgeben, aber sie sind nicht an irgendeine Art von Persistenzkontext gebunden.

Beide Tools leisten viel mehr als oben beschrieben, aber eines ist ein ORM und eines nicht.

Die Kriterien, anhand derer Sie auswählen können, welches verwendet werden soll, hängen meines Erachtens entscheidend vom Datenbankmodell ab, mit dem Sie arbeiten müssen.

Stellen Sie sich zum Beispiel ein großes Schema vor, das ein Versicherungsmodell darstellt. Entwickler müssen Daten abrufen und mit diesen Daten auf eine Weise interagieren, die dem jeweiligen Unternehmen entspricht.

Entwickler kommen und gehen, und es wird nie erwartet, dass sie über die erforderlichen Geschäftskenntnisse verfügen, um die gesamte SQL von Hand zu schreiben (was Mybatis erfordern würde). Der Ruhezustand würde zu einem solchen Szenario passen.

Geschäftsanalysten definieren das Datenmodell, die Entitäten, die Beziehungen und die Interaktionen sowie deren Fachwissen. Java-Entwickler verwenden dann den Ruhezustand, um "das Modell zu durchlaufen". Die Entwickler können sehr produktiv werden, ohne dass komplizierte fehleranfällige SQL-Dateien geschrieben werden müssen, um sie in einem sehr komplizierten Schema auszuführen.

Nach meiner Erfahrung werden sowohl Hibernate als auch Mybatis regelmäßig für dasselbe Projekt verwendet.

Wo der Ruhezustand verwendet wird

  • Allgemeine CRUD-Funktionalität
  • 'Walking' das relationale Modell 'Domain Object'
  • Sitzungsverwaltung

und wo Mybatis verwendet wird

  • Ad-hoc-Anfragen
  • Starten Sie gespeicherte Prozeduren (und interagieren Sie mit ihnen)
  • unterstützen sehr spezifische oder komplizierte Abfragen
  • Unterstützung komplizierter Suchanfragen, bei denen Suchkriterien dynamisch sind, und Auslagerung von Ergebnissen
Johnm
quelle
6

Wenn Sie Spring bereits verwenden, würde ich mit Spring JDBC beginnen, anstatt direkt in Hibernate oder iBatis einzutauchen. Wenn Sie Ihre Persistenzstufe in Bezug auf Schnittstellen schreiben, sollten Sie kein Problem damit haben, Implementierungen zu wechseln, nachdem Sie Hibernate oder iBatis in den Griff bekommen haben.

Es gibt keinen Grund, warum es eine "Alles oder Nichts" -Entscheidung sein muss. Verwenden Sie das Beste für Ihre Situation.

Duffymo
quelle
8
Spring JDBC ist Ibatis weit unterlegen. Zum einen müssen Sie entweder Zeilenzuordnungen schreiben (langwierig) oder die Bean-Zuordnung von Spring ist unglaublich langsam. Das spielt keine Rolle, wenn Sie ein Formular in Spring MVC binden, aber es ist sicher, wenn Sie Tausende von Zeilen zurückgeben. Ich habe die Ausführungszeit für eine Abfrage von mehr als 50 Sekunden auf <2 verkürzt, indem ich die Bean-Zuordnung von Spring in Spring JDBC durch eine explizite Zeilenzuordnung ersetzt habe. Aber wer möchte diese schreiben?
Cletus