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".
Ü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:
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. ;)
quelle
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:
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 persist
andere 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.
quelle
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 .
quelle
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
und wo Mybatis verwendet wird
quelle
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.
quelle