Tatsächlich sind eine der leistungsstarken Merkmale von MyBatis normalerweise seine dynamischen SQL -Funktionen. Wenn Sie Erfahrung mit JDBC oder anderen ähnlichen Frameworks haben, verstehen Sie, dass es sehr verwickelt ist, SQL -Zeichenfolgen dynamisch zusammenzuschließen, sicher, dass Sie die Räume nicht vergessen oder Kommas am Ende der Liste weglassen. Dynamisches SQL in MyBatis kann diesen Schmerz gründlich erledigen. Für dynamische SQL ist es am einfachsten, uns bei hartem Codieren verschiedene dynamische Verhaltensurteile zu geben. In MyBatis wird eine leistungsstarke dynamische SQL -Sprache verwendet, um diese Situation zu verbessern, die bei der Zuordnung von SQL -Anweisungen verwendet werden kann. Dynamische SQL-Elemente ähneln der Verwendung von JSTL oder anderen ähnlichen XML-basierten Textprozessoren. MyBatis verwendet leistungsstarke Ausdrücke auf OGNL-basierter Ausdrücke, um andere Elemente zu beseitigen.
Mehrere Knotenelemente, die wir üblicherweise verwenden, umfassen if, wählen Sie (wann, sonst), trimmen Sie (wobei) und foreach. Ich fühle mich ein bisschen wie die Verwendung von XSLT (ich werde es später im Artikel erwähnen ~).
(1) Verwendung von if
In der Paginationskonfiguration des ViisitMapper wird der entsprechende Pagination SQL hinzugefügt, wenn pagindex> -1 und pageSize> -1 hinzugefügt werden, sonst wird es nicht hinzugefügt (der Standard wird alle eingenommen) wie folgt:
<select id = "getListbypagenate" parameterType = "pagenateargs" resultType = "Visitor"> select * aus (<include refID = "getListsql" /> <include refid = "orderbysql" />) t <!- #} bedeutet parametrisierte Ausgabe, $ {{} bedeutet, dass Direct-Ausgabe keine Escape-Operationen übertragen, und es gibt keine Ausgabe, die direkte Ausgabe. test="pageStart>-1 and pageSize>-1"> limit #{pageStart}, #{pageSize} </if></select><sql id="getListSql"> select * from Visitor where status>0</sql><sql id="orderBySql"> order by ${orderFieldStr} ${orderDirectionStr}</sql>Da unsere Parameter PageIndex und PageSize beide int -Werte sind, können wir solche direkten Urteile fällen. Wenn es sich um eine Objektinstanz handelt, können wir eine dynamische Logik null beurteilen. Die spezifische Entwicklung hängt von den Geschäftsbedürfnissen ab. Ich denke, es ist wichtig zu beachten, dass es nicht einfach zu schreiben ist, und dies wird in der Konfiguration nicht erkannt.
(2) die Verwendung der Wahl (wann, sonst)
Wählen Sie, wenn Sie hauptsächlich in Anwendungsszenarien verwendet werden, die nur unter mehreren Bedingungen eine der Bedingungen erfüllen. Zum Beispiel finden Sie hier eine Abfragebedingung, die ID, den Namen und die Erzeugung von Createtime übergeben. Nehmen wir an, wenn wir die Besuchertabelle abfragen, wenn Visitorid einen Wert hat, verwenden Sie die ID -Abfrage und verwenden Sie, wenn Visitorname einen Wert hat, die VisitName -Abfrage. Fügen Sie wie folgt die Liste <Besucher> getListchoosewhendemo (BasicQueryArgs Args) zur Methode der Grenzklasse von David.mybatis hinzu. Fügen Sie die entsprechende Konfiguration der ausgewählten Knoten in Visitormapper hinzu:
Paket David.mybatis.demo; Import Java.util.List; Import David.mybatis.Model.BasicQueryargs; Import David.mybatis.Model.Pagenateargs; import David.mybatis.model.visor; Besucher*/ public int add (Besucher Besucher); /** Besucher löschen*/ public int delete (int id); /** Besucher aktualisieren*/ public int update (Besucher Besucher); /** Abfrage Besucher*/ öffentlicher Besucherabfrage (int id); / * * Abfrageliste */ publiclist <Besucher> getList (); / * * Pagination Query List */ Public List <Besucher> getListbypagenat (pagenateargs args); / * * Pagination Query List (einschließlich Rownum) */ Public List <VisitorWithrn> getListbypagenateWithrn (pagenateargs args); /** Basisabfrage*/ public Visitor basicQuery (int id); / * * Dynamische Bedingung Abfrage (wählen Sie, wenn) Instanz */ Public List <Besucher> getListchoosewhendemo (BasicQueryArgs Args); / * * Dynamische Bedingung Abfrage (wobei if) Instanz */ öffentliche Liste <Besucher> getListWheredemo (BasicQueryArgs Args); / * * Dynamic Query (foreach) Instanz */ Public List <Besucher> getListforeachDemo (Liste <Ganzzahl> ids); }
<? Namespace = "David.mybatis.demo.IVisitorOperation"> <resultMap type = "Visitor" id = "Visitorrs"> <id column = "id" Property = "id" /> <resultal columne </resultMap> <sql id = "getListsqlconditions"> SELECT * vom Besucher </sql> <!-Wählen Sie, wann eine der Bedingungen erfüllt ist-> <select id = "getListchoosewhendemo" resultmap = "Visitorrs" Parametertype = "baconyargs"> <included RefID = "GetlistsQLISTSQLISTS"/> < test = "querystatus> 0"> Status = #{querystatus} </if> <wählen> <wenn test = "queryId! </where> </select> </makePer>(3) Verwendung von WO IF IF (Trim)
Der Vorteil, wo Schlüsselwörter, wenn es entsprechende Filterbedingungen vorliegt, weiß, dass es zu den geeigneten Zeiten einfügt, wo Schlüsselwörter einfügen. Und es weiß auch, wann die entsprechenden und und oder oder Anschlüsse entfernen werden sollen, wobei sich hauptsächlich mit den folgenden Szenarien befasst
<select id = "findActiveBlog -ähnliches" resultType = "blog"> select * aus dem blog wobei <if test = "state!
Es wird nicht auf das Versagen aller Bedingungen zurückzuführen
<select id = "findActiveBlog -ähnliches" resultType = "Blog"> SELECT * Aus dem Blog wobei </select>
Oder weil die erste Bedingung nicht erfüllt ist, wird die nachfolgende Bedingung nur erfüllt.
<select id = "findActiveBlog -ähnliches" resultType = "Blog"> Select * Aus dem Blog Where und Titel wie 'Slowitle' </select>
Daher können wir dafür eine Auswahl erstellen, wenn das Bedingungsbeispiel beispielsweise die entsprechende Methode der öffentlichen Liste <Visitor> GetListWheredemo (BasicQueryArgs Args) zur IVisitoroperation -Schnittstellenklasse hinzufügen und die entsprechende Konfiguration in der VisitOrPer -Konfigurationsdatei wie folgt hinzufügen:
<? namespace = "David.mybatis.demo.ivisitoroperation"> <sql id = "getListsqlconditions"> Select * von Besucher </sql> <!-Operationen hinzufügen, wenn die Bedingungen erfüllt sind-> <select id = "getListwheredem" resultmap = "visusirrs" parameterType = "BasicQueryPe =" BasicQuery " refid = "getListsqlconditions"/> <wob createTime> =#{queryTime} </if> </wobei> <!- <trim prefix = "wob giby =#{queryname} </if> <if test = "queryTime! = null"> und createTime> =#{queryTime} </wenn(4) Verwendung von foreach
In häufig verwendeten dynamischen SQL haben wir ein Geschäftsszenario, in dem ID in einer großen Reihe von IDs ID. In diesem Fall können wir für den Ereignis verwenden, ohne hart arbeiten zu müssen, um die ID -Zeichenfolge zu spleißen. Der gleiche Schritt besteht darin, die entsprechende Methode zur öffentlichen Liste der Ivisitoroperation -Schnittstellenklasse <Visitor> GetListforeachDemo (Liste <Ganzzahl> IDs) hinzuzufügen und dann die entsprechenden Informationen zu Knotenelementen in der entsprechenden Mapper -Datei zu konfigurieren:
<? namespace = "David.mybatis.demo.ivisitoroperation"> <sql id = "getListsqlconditions"> SELECT * Vom Besucher </sql> <!-Foreach-Schleifen-> <select id = "getListFeachDemo" resultmap = "Visitorrs"> <included refID = "GetListsQlconcons"/> 0, und id. collection = "list" item = "item" idex = "index" open = "(" separator = "," close = ")"> $ {item} </foreach> </select> </mapper>Schließlich müssen Sie nur die entsprechende Testmethode in Demorun festlegen, und die dynamische SQL in MyBatis wird abgeschlossen. Die für den folgenden Test verwendete Demorun -Methode
/** Dynamische Abfrage für Eachinstanz*/ public static void getListforeachDemo (Liste <Integer> ids) {SQLSession Session = mybatisutils.getSQLSession (); IvisitorOperation voperation = session.getMapper (ivisitorOperation.class); Liste <Besucher> ls = voperation.getListforeachDemo (IDS); für (Besucher Besucher: ls) {System.out.println (Besucher); }} /** Dynamische Abfrage wob NULL: Name; SQLSession Session = mybatisutils.getSqlSession (); BasicQueryArgs args = new BasicQueryArgs (ID, Name, CreateTime); IvisitorOperation voperation = session.getMapper (ivisitorOperation.class); Liste <Besucher> ls = voperation.getListWheredemo (args); if (ls.size () == 0) system.out.println ("Nein Übereinstimmung überprüfen!"); sonst {für (Besucher Besucher: ls) {System.out.println (Besucher); }}} /** Dynamische Abfrage Wählen Sie, wenn Instanz* / public static void getListchoosewhendemo (int id, String -Name, Datum createTime) {name == ""? NULL: Name; SQLSession Session = mybatisutils.getSqlSession (); BasicQueryArgs args = new BasicQueryArgs (ID, Name, CreateTime); IvisitorOperation voperation = session.getMapper (ivisitorOperation.class); Liste <Besucher> ls = voperation.getListchoosewhendemo (args); if (ls.size () == 0) system.out.println ("Nein Übereinstimmung überprüfen!"); sonst {für (Besucher Besucher: ls) {System.out.println (Besucher); }}}
PS: Über Ognl
OGNL ist die Abkürzung der Navigationssprache der Objektgraph. Aus Sprachperspektive: Es handelt sich um eine mächtige Ausdruckssprache, die verwendet wird, um die Eigenschaften von Java -Objekten zu erhalten und festzulegen. Ziel ist es, eine höhere Abstraktionssyntax für die Navigation von Java -Objektdiagrammen bereitzustellen. OGNL hat an vielen Orten Anwendungen, beispielsweise:
Bindende Sprache als GUI -Elemente (Textfeld, Combobox usw.) an Modellobjekte.
Datenbanktabelle zur Datenquellensprache von Swing's TableModel.
Die verbindliche Sprache für Webkomponenten und Hintergrundmodellobjekte (Webognl, Tapestry, Webwork, WebObjects).
Als ausdruckswertere Alternative zu Jakarata Commons Beanutils oder JSTL Expression Language.
Darüber hinaus gibt es in Java viele Dinge, die auch mit OGNL durchgeführt werden können, wie z. B. Listenzuordnung und Auswahl. Für Entwickler können Sie mit OGNL die kurze Syntax verwenden, um die Navigation von Java -Objekten zu vervollständigen. Im Allgemeinen werden die Navigation von Objektinformationen über einen "Pfad" abgeschlossen. Dieser "Pfad" kann ein Attribut für eine Java -Bohne, ein in einer Sammlung indizierter Objekt usw. sein, anstatt direkt die GET- oder SET -Methode zu verwenden.