MyBatis ist ein sehr beliebter dauerhafter Schicht -Framework in der Branche. Es ist leicht und einfach zu bedienen. Es führt im finanziellen IT -Bereich völlig führend. Es ist populärer als Hibernate, mit vielen Vorteilen und lohnt sich auch zu lernen. Aber MyBatis ist nicht perfekt und sein eigenes Design und seine eigene Codierung haben immer noch viele Mängel, sogar Mängel. In diesem Artikel werden diese Defekte kurz erörtert:
1.Mybatis verwendet DTD als Bestätigungsdatei für XML -Konfigurationsdateien. Es ist jedoch offensichtlich, dass DTD fast eine gelöschte Technologie ist. Es hat nur sehr begrenzte Funktionen, sehr schlechte Skalierbarkeit, sehr schlechte Skalierbarkeit, sehr schlechte Skalierbarkeit und schlechte Lesbarkeit. Der Frühling kann sich herrlich von DTD nach XSD wenden, aber Mybatis hat diesen Mut noch nie gehabt.
2. Wenn die Versionskompatibilität nicht gut erfolgt, nehmen Sie es als Beispiel 3.3.0 -> 3.4.0. Nach den allgemeinen Spezifikationen der Branche kann die Versionsnummer der zweiten Ebene aktualisiert werden und Funktionen können hinzugefügt werden, aber die Kompatibilität für die Rückwärtsbekämpfung muss sichergestellt werden. MyBatis 'Ansatz ist jedoch nicht genau so. Schauen Sie sich die Schlüsselmethode von StatementHandler an, um sich vorzubereiten:
// 3.3.0Statement Preping (Verbindungsverbindung) löst SQLEXception aus; // 3.4.0Statement Preping (Verbindungsverbindung, Integer TransactionTimeOut) SQLEXception;
Hier wird keine Methode hinzugefügt, aber ein Parameter wird direkt zur ursprünglichen Methode hinzugefügt! Es gibt viele ähnliche Beispiele, daher werde ich sie nacheinander nicht auflisten.
3.. MyBatis Plug-In verwendet eine allgemeine Interceptor-Schnittstelle, begleitet von Annotationen wie @Intercepts und @Signature, um mehrere Methoden zur Abfangen mehreren Komponenten zu implementieren. Es scheint sehr flexibel. Meiner Meinung nach ist die Struktur eigentlich nicht klar genug. Werden Sie während der tatsächlichen Entwicklung die Abfangen -Verbesserung von StatementHandler und Ergebnissen in einer Klasse einsetzen? Ist es nicht richtig (ja? Sind Sie das Prinzip der einzigen Verantwortung und das Eröffnungs- und Schließungsprinzip für alle Scheiße?), Warum ist es also notwendig, dieselbe Schnittstelle zu erzwingen?
Verwenden Sie außerdem die @signature -Annotation, um die Komponentenmethoden anzugeben, die abgefangen werden müssen. Wenn die Annotation falsch ist, meldet die Zusammenstellung keinen Fehler. Sie können nur warten, bis es ausgeführt wird, um es zu entdecken. Schauen wir uns das obige Beispiel an:
Angenommen, ich habe ein Plugin für Version 3.3.0 implementiert:
@Intercepts({ @Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class })})public class StatementHandlerInterceptor implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {return invocation.proceed();}@Overridepublic Object plugin(Object target) {return Plugin.wrap(target, this);}@oversidepublic void setProperties (Eigenschaften Eigenschaften) {}}Dann wurde es auf 3.4.0 verbessert. Infolgedessen war die Zusammenstellung normal, aber als sie ausgeführt wurde, wurde eine Ausnahme ausgelöst.
4. MyBatis 'Cache ist einfach nutzlos, und unabhängig davon, ob eine Konfiguration vorliegt, ist es erforderlich, den Cache zu verwenden oder den Cache zu aktualisieren. Es ist erforderlich, den Cachekey zu berechnen. Wenn es keinen Cache gibt oder den Cache aktualisiert, ist diese Berechnung ein Abfall.
5. Für die Batch -Ausführung von MyBatis finden Sie im folgenden JDBC -Beispiel:
public void testjdbcbatch (Verbindung conn) löst Ausnahme aus {try {conn.setAutocommit (false); batchupdate (conn); clearTestData (conn); conn.commit (); conn.setAutocommit (true); {PreparedStatement ps = null; try {ps = conn.preparestatement ("table_name1 löschen, wobei field_name1 =?"); e) {}}} private void batchupdate (Verbindung conn) löst SQLEXception {preparedStatement ps = null; try {String SQL = "In table_name2 (field_name1, field_name2, field_name2) Werte (?,?)"; random = randomStringutils.randomalphabetik (8); Schließlich {try {ps.close ();} catch (Ausnahme e) {}}}Der Code hat keinen Sinn für Inkongruenz, kann normal ausführen und wie erwartet auch zurückrollen. Das heißt, dieselbe Verbindung in derselben Transaktion kann gleichzeitig normales SQL und Stapel ausführen.
6. Kompatibilität von Datenbankprodukten: MyBatis überreichte die Kontrolle von SQL an Entwickler, so dass es moralisch die Kommandohöhen besetzte - was Sie geschrieben haben, ist nicht kompatibel, das ist Ihre eigene Ebene! Aber ist das die richtige Pose für einen wirklich guten Rahmen? Warum kann keine hilfsberechtigte Implementierung durchgeführt werden? Wenn beispielsweise die Decodes -Funktion, die als Gott in Oracle angesehen wird, dann mit einem <decodes> -Tag in SQLMapper geliefert und stillschweigend so modifiziert werden kann, wenn es später ist? Mit anderen Worten, es spielt keine Rolle, ob der Beamte es nicht zur Verfügung stellt, aber Sie müssen eine Expansionsmethode anbieten, also komme ich zurück: Die Skalierbarkeit ist sehr schlecht, die Skalierbarkeit ist sehr schlecht und die Skalierbarkeit ist sehr schlecht. Ich sagte die wichtigen Dinge dreimal, aber ich habe sie sechs Mal gesagt.
Das obige sind die vom Herausgeber vorgestellten MyBatis -Mängel. Ich hoffe, es wird für Sie hilfreich sein!