Einführung: Was ist MyBatis?
(Ehemals Ibatis) MyBatis ist ein Persistenzschicht -Framework, das SQL, gespeicherte Verfahren und fortgeschrittene Zuordnungen anpassen kann. MyBatis eliminiert die manuelle Einstellung fast aller JDBC -Code und -Parameter und das Abrufen des Ergebnissatzes. MyBatis kann einfache XML oder Anmerkungen zur Konfiguration und ursprüngliche Zuordnung, Mapping -Schnittstellen und Javas Pojos (einfache alte Java -Objekte) in Datenbank in der Datenbank verwenden.
1. Der Parameter Mapper Layer ist eine Karte und die Serviceschicht ist für die Überladung verantwortlich.
Aufgrund von Mechanismusproblemen kann die Karte nicht überladen werden. Die Parameter werden im Allgemeinen auf MAP eingestellt, aber dies macht die Parameter verschwommen. Wenn Sie den Code klarstellen möchten, können Sie den Zweck der Überlastung der Serviceschicht erreichen. Die von außen bereitgestellte Serviceschicht ist überlastet, aber diese überlasteten Servicemethoden sollen denselben Mapper einstellen, aber die entsprechenden Parameter sind nicht konsistent.
Vielleicht fragen sich einige Leute vielleicht, warum nicht in die Servicestufe eingestellt werden. Ich persönlich empfehle das nicht. Obwohl ich diese Methode in meinen früheren Projekten aus Gründen der Einschätzung übernommen habe, wird dies offensichtlich Probleme bei der künftigen Wartungsarbeiten verursachen. Denn dies führt dazu, dass Ihr gesamter MVC auf das Kartenmodell angewiesen ist. Dieses Modell ist eigentlich sehr gut und bequem, um ein Framework zu erstellen, aber es gibt ein Problem: Wenn Sie nur die Methodensignatur betrachten, kennen Sie die Anzahl, den Typ und die Bedeutung jedes von der Karte dargestellten Parameters nicht.
Stellen Sie sich vor, Sie müssen nur die Serviceschicht oder die DAO -Ebene ändern, Sie müssen sich über die Parameter, die im gesamten Vorgang von der Karte übergeben wurden, klar sein. Wenn Sie nicht kommentieren oder eine gute Dokumentation haben, müssen Sie den Code jeder Ebene klar verstehen, bevor Sie wissen, welche Parameter übergeben werden. Für einfache MVC ist das in Ordnung, aber wenn die Ebene komplex ist, wird der Code äußerst komplex, und wenn ich einen Parameter hinzufüge, muss ich die Kommentare für jede Ebene hinzufügen. Im Vergleich zu Kommentaren ist es machbarer, Methodensignaturen zu verwenden, um diese Code -Steuerbarkeit zu gewährleisten, da Kommentare möglicherweise veraltet sind, aber im Allgemeinen nicht veraltet sind.
2. Versuchen Sie zu verwenden, wenn Auswahl und andere Aussagen so wenig wie möglich die Wartungsschwierigkeit verringern.
Versuchen Sie bei der Konfiguration von SQL in MyBatis weniger Beschriftungen wie bei der Auswahl. Wenn SQL verwendet werden kann, um das Urteil zu bestimmen, versuchen Sie, SQL (Fall zu verwenden, wann, dekodieren usw.) für die spätere Wartung. Andernfalls ist es super übel, sobald SQL aufblickt. Wenn Sie SQL in mybatis debuggen müssen, müssen Sie eine große Anzahl von Urteilsaussagen entfernen, was sehr problematisch ist. Auf der anderen Seite führt eine große Anzahl von Urteilen dazu, dass der generierte SQL eine große Anzahl von Leerzeichen enthält, was die Netzwerkübertragungszeit erhöht, was ebenfalls nicht wünschenswert ist.
Darüber hinaus wird die generierte SQL in unweigerlicher Weise unweigerlich inkonsistent, was zu einer großen Anzahl von Hards an Oracle führt, was ebenfalls nicht ratsam ist.
Werfen wir einen Blick auf SQL wie folgt:
<code style = "padding: 0,5em; margin: 0px; Anzeige: Block; Farbe: RGB (101,123,131); Überlauf-x: Auto; Farbe: RGB (133,153,0) "> Wählen Sie </span> * <span style =" padding: 0px; style = "padding: 0px; margin: 0px; color: rgb (42,161,152)"> 1 </span> = <span style = "padding: 0px; margin: 0px; Farbe: rgb (42,161,152)"> 1 </span> <<span style = "padding: 0PX; Farbe: RGB (133,153,0) "> 1 </span> <Span Style =" Padding: 0px; style = "padding: 0px; margin: 0px; color: rgb (42,161,152)"> "startdate! = null und startdate! = '' und enddate! = null und endate! #{startDate} <span style = "padding: 0px; Rand: 0px; Farbe: RGB (133,153,0) "> und </ span> PublishTime <= #{enddate} </ <span style =" padding: 0px; Rand: 0px; Farbe: RGB (133,153,0) "> if </span> <sonst> <span style =" padding: 0px; Rand: 0px; Farbe: RGB (133,153,0) "> und </span> PublishTime> = <span style =" padding: 0px; Rand: 0px; Farbe: RGB (133,153,0) "> sysdate </span> - <span style =" padding: 0px; Rand: 0px; Farbe: RGB (42,161,152) "> 7 </span> <span style =" padding: 0px; Rand: 0px; Farbe: RGB (133,153,0) "> und </span> PublishTime <= <span style =" padding: 0px; Rand: 0px; Farbe: RGB (133,153,0) "> sysdate </span> </sonst> </<span style =" padding: 0px; Rand: 0px; Farbe: RGB (133,153,0) "> sysdate </span> </sonst> </<span style =" padding: 0px; Rand: 0px; Farbe: RGB (133,153,0) "> Wählen Sie </span>> </span>Ein solches, wenn das Urteil tatsächlich völlig unnötig ist. Wir können einfach Decodes verwenden, um das Standardwertproblem zu lösen:
<code style = "padding: 0,5em; margin: 0px; Anzeige: Block; Farbe: RGB (101,123,131); Überlauf-x: Auto; Farbe: RGB (133,153,0) "> Select </span> * <span style =" padding: 0px; <span style = "padding: 0px; margin: 0px; color: rgb (133,153,0)"> decode </span> (#{startDate}, <span style = "padding: 0px; margin: 0px"> null </span>, <span style = "padding: 0px; margin: 0px; Farbe: RGB (133,153,0) "> SYSDATE </span>-<span style =" padding: 0px; Farbe: RGB (133,153,0) "> und </span> PublishTime <= <span style =" padding: 0px; Rand: 0px "> null </span>, <span style =" padding: 0px; Rand: 0px; Rand: 0px; Farbe: RGB (133,153,0) "> sysdate </span>,#{enddate}) </span> </code>Einige Leute denken natürlich möglicherweise, dass die Einführung von Fall, wann und Dekodus eine Oracle Function Parsing erfordern, die SQL -Ausführungszeit verlangsamt. Interessierte Schüler können zurückgehen und einen Test durchführen, um festzustellen, ob es einen großen Einfluss gibt. In Bezug auf die persönliche Erfahrung habe ich in SQL keine Verlangsamung in Bezug auf die Funktion des Funktionsvorsprungs gefunden. Im Allgemeinen sind Operationen wie Join, Order by, unterschiedlich, Teilung von usw., die im Allgemeinen eng mit dem Design der Tabellenstruktur zusammenhängen. Im Vergleich zu den Auswirkungen der Effizienz dieser Wirkungsgrade sollte der Einfluss der Funktionsvorsorge auf die SQL -Ausführungsgeschwindigkeit vernachlässigbar sein.
Ein weiterer Punkt ist, dass Sie für einige Standardwertzuweisungen, wie die obigen SQL, standardmäßig zum aktuellen Datum usw. die Serviceschicht oder die Controller -Ebene für die Verarbeitung vollständig erwähnen können. Diese Urteile sollten in mybatis weniger verwendet werden. Denn in diesem Fall ist es schwierig, die Verarbeitung zu unterbrechen. Wenn StartDate leer ist und dynamisches Sysdat auf SQL verwendet wird, ist es unmöglich zu bestimmen, wie der Schlüssel des Cache StartDate -Datums sein sollte. Daher ist es am besten, die Parameter zu bewältigen, bevor sie an MyBatis übergeben werden, damit die MyBatis -Schicht auch einige reduzieren kann, wenn sie Aussagen auswählen, und sie ist auch für die Cache -Verarbeitung geeignet.
Natürlich ist es nicht absolut zu verwenden, wenn es ausgewählt wird. Manchmal, um SQL zu optimieren, wenn es gelöst werden muss, wie wie Aussagen. Natürlich wird es im Allgemeinen nicht empfohlen. Wenn es jedoch Szenarien für den Gebrauch gibt, entfernen Sie wie immer, wann immer Sie es verwenden müssen, z. B. Abfragen des Artikeltitels, um die Effizienz der Abfrage zu verbessern. Der beste Weg ist, Suchmaschinen wie Lucence zu verwenden, um dieses Problem der Volltextindizierung zu lösen.
Im Allgemeinen ist es unmöglich, die Zweigstelle vollständig zu entfernen, wenn sie beurteilt werden, aber es wird empfohlen, die SQL Native Methode anzuwenden, um einige dynamische Probleme zu lösen, anstatt sich vollständig auf MyBatis zu verlassen, um das Urteil dynamischer Zweige zu vervollständigen, da der Urteilszweig zu komplex und schwer zu warten ist.
3. Ersetzen Sie SQL -Kommentare durch XML -Kommentare.
Versuchen Sie, die Kommentare von MyBatis Central SQL nicht beizubehalten. Kommentare werden einige Probleme verursachen. Wenn Sie Kommentare verwenden müssen, können Sie <!--> In XML verwenden, um sicherzustellen, dass in der generierten SQL keine SQL-Annotationen vorhanden sind, wodurch die Möglichkeit von Problemen verringert wird. Ein weiterer Vorteil, dies zu tun, besteht darin, dass es deutlich Annotationen von SQL in der IDE unterscheiden kann.
Sprechen wir nun über die Probleme, die durch Kommentare verursacht werden. In einem Projekt, an dem ich arbeite, basiert die Paginationskomponente auf MyBatis. Außerhalb des SQL -Skripts, das Sie geschrieben haben, um die Gesamtzahl der Datensätze zu berechnen, wird eine weitere Ebene der SELECT Count (*) Rownum_ aus (......) ausgewählt. Gleichzeitig gibt es eine andere verschachtelte Auswahl * aus (...), wobei Rownum> 10 und Ronnum <10 * 2 Paging -Informationen generieren. Wenn es einen Kommentar zur letzten Zeile in Ihrem Skript gibt, wird der hinzugefügte Teil Teil des Kommentars und ein Fehler wird gemeldet. Darüber hinaus können einige Bedingungen auch dazu führen, dass einige Bedingungen ignoriert werden, wie z. B. folgende:
<Code style = "Padding: 0,5EM; Rand: 0px; Anzeige: Block; Farbe: RGB (101,123,131); Überlauf-x: Auto; style = "padding: 0px; margin: 0px; color: rgb (133,153,0)"> aus </span> test <span style = "padding: 0px; margin: 0px; color: rgb (133,153,0)", wobei </> col1> <span style = "padding: 0px; jarg: 0px: 0px: 0px: 0px; Farbe: RGB (42,161,152) "> 1 </span> - hier ist der Kommentar << span style =" padding: 0px; a! = '' "</span >> <span style =" padding: 0px; '' "</span >> <span style =" padding: 0px; Rand: 0px "> if </span >> </span> </code>
Auch wenn die übergebenen Parameter entsprechende Parameter vorhanden sind, gibt es in der Tat keinen Einfluss, da der folgende Inhalt tatsächlich vollständig kommentiert wird. Diese Art von Fehler ist ohne strenge Test schwer zu erkennen. Im Allgemeinen können XML -Kommentare SQL -Kommentare vollständig ersetzen, daher sollte dieses Verhalten verboten werden.
4. Verwenden Sie #{} wann immer möglich, nicht $ {}.
Versuchen Sie, $ {} in MyBatis nicht zu verwenden. Es ist sehr bequem, dies zu tun. Es gibt jedoch ein Problem, dass eine große Verwendung zu einer schwierigen Parsen von Oracle führt und die Datenbankleistung verlangsamt. Je länger die Datenbankleistung sein wird, desto schlimmer wird die Datenbankleistung. Für die allgemeine Verarbeitung mehrerer String -INS können Sie sich auf die folgende Lösung beziehen: http://www.myexception.cn/sql/849573.html, die im Grunde genommen den größten Teil $ {} lösen kann.
In Bezug auf $ {} ist ein weiterer Missbrauch. Ich habe hier einen weiteren Fall: Zum Beispiel werden einige Baummenüs, Knoten als "01", "0101" und zwei-Bit-Knoten verwendet, um Hierarchien zu unterscheiden. Wenn Sie zu diesem Zeitpunkt alle Knoten unter Knoten 01 abfragen müssen, ist die einfachste SQL: SELECT * aus dem Baum, wobei ID '01%'mögen. Diese Art von SQL ist tatsächlich verständlich, da sie auch Indizes verwenden kann und daher keine spezielle Verarbeitung erfordert. Verwenden Sie sie einfach direkt. Wenn es sich jedoch um den Titel des Artikels handelt, müssen Sie zusätzliche Aufmerksamkeit schenken: Wählen Sie * aus t_news_text, wobei der Titel wie '%OSC%' nicht in die Indexierung verwendet wird. Wie oben erwähnt, ist es am besten, die Volltextensuche zu verwenden. Wenn Sie jedoch nicht auf mögen können, müssen Sie auf die Verwendungsmethode achten: ID wie #{id} || '%' anstelle von id wie '$ {id}%', um die Möglichkeit einer harten Parsen zu verringern.
Einige Leute denken, dass || mit || Erhöht die Zeit für die Oracle -Verarbeitung. Ich denke, nimm Oracle nicht zu dumm. Obwohl es manchmal wirklich dumm ist, können Sie den dummen und keinen Müll zusammenfassen, wenn Sie Zeit haben, aber nach einem kleinen Test wissen Sie, dass diese Verbindungsmethode für die Parsen und Ausführung des gesamten SQL sehr schlank sein sollte.
Natürlich gibt es einige Sonderfälle, die nicht behandelt werden können, wie z. B. dynamische Injektion von Spaltennamen, Tabellennamen usw. Für diese Situationen ist es schwierig und es werden keine bequemeren Mittel gefunden. Da es weniger wahrscheinlich ist, dass diese Situation auftritt, hat die Verwendung von $ {} keinen großen Einfluss. Wenn Sie eine Code -Morbidität haben, können Sie natürlich den dynamischen SQL -Ausführungsmechanismus von Oracle sofort verwenden, damit Sie die Möglichkeit von $ {} vollständig vermeiden können. Dies führt zu komplexeren Modellen, und zu diesem Zeitpunkt müssen Sie Entscheidungen treffen.
Als Reaktion auf die Probleme, die durch dynamische SQL oben verursacht werden, besteht die radikalste Möglichkeit darin, gespeicherte Verfahren zu verwenden und sie auf native Datenbank zu lösen, um die Entwicklung und Debuggierung zu erleichtern. Natürlich wird es auch Probleme bringen: Es wird höhere Anforderungen für Entwickler, das Management gespeicherter Verfahren usw. geben. Mein Projekt hat diese Methode nicht übernommen, daher werde ich hier nicht mehr erweitern.
5. Einfache Verwendung von MyBatis.
Die Funktion von MyBatis ist relativ schwach, und es fehlen viele notwendige Hilfsbibliotheken, String -Verarbeitung usw., und es ist auch schwierig zu erweitern. Im Allgemeinen ist es im Allgemeinen möglich, einige Renditen zu verarbeiten. Daher ist es am besten, sie als einfache SQL -Konfigurationsdatei und ein einfaches Orm -Framework zu verwenden. Versuchen Sie nicht, in mybatis zu viel dynamisch SQL zu tun, da dies ansonsten dazu führt, dass die Wartung sehr ekelhaft ist.
Das obige ist die MyBatis -Lernzusammenfassung, die der Herausgeber Ihnen vorgestellt hat. Ich hoffe, es wird Ihnen hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird Ihnen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!