Jeder weiß im Grunde, wie man mit MyBatis willkürliche SQL ausführt. Die Verwendungsmethode ist beispielsweise in einem xxmapper.xml sehr einfach:
<select id = "executesql" resultType = "map"> $ {_ parameter} </select>Sie können es wie folgt nennen:
SQLSession.SelectList ("executesql", "SELECT * von sysuser wobei aktiviert = 1");Oder Sie können die folgende Methode in der Schnittstelle xxmapper.java definieren:
List <Map> executesql (String SQL);
Verwenden Sie dann die Schnittstelle, um die Methode aufzurufen:
xxmapper.executesql ("SELECT * von sysuser wobei aktiviert = 1");Alle oben genannten Inhalte können sein, und das Folgende ist basierend auf diesem etwas komplizierter.
Wenn Sie den Wert mit der Parametermethode in SQL oben übergeben möchten, schreiben Sie ihn als aktiviert = #{aktiviert}. Wenn Sie solche Anforderungen nicht begegnet sind, verstehen Sie möglicherweise nicht, warum Sie ihn so schreiben sollten. Um eine dynamische Abfrage zu implementieren, können Sie SQL im Vordergrund konfigurieren und einige Abfragebedingungen bereitstellen, um die Funktion einer Abfrage zu realisieren (für die Sicherheit müssen diese Konfigurationen entwickelt oder implementiert werden, und es ist für Benutzer unmöglich, die Datenbank direkt zu bedienen).
Für diese Funktion ist es ziemlich einfach, mit MyBatis zu implementieren. Das Konfigurieren von SQL muss ausgeführt werden. SQL kann in der oben genannten Methode ausgeführt werden. Wie stelle ich Parameter an? Der Parameter ist das #{enabled} -Teil in aktiviert = #{aktiviert}. Wenn es mehr Bedingungen gibt, lautet ein konfigurierter SQL wie folgt:
Wählen Sie * von sysuser wob
Wie kann ich in diesem Fall MyBatis verwenden, um es zu implementieren?
Erstens wird der XML wie folgt modifiziert:
<select id = "executesql" resultType = "map"> $ {sql} </select>Die Methoden in der Schnittstelle werden geändert an:
List <Map> executesql (MAP MAP);
Rufen Sie dann die Methode an:
Map map = new HashMap (); // Die SQL hier entspricht $ {SQL} map.put ("SQL", "SELECT * aus SYSUSER"+ "WHERE ABLETTE =#{Enabled}"+ "und Benutzername wie concat ('%', {userername}, '%'). 1); //#{Benutzername} map.put ("Benutzername", "admin"); // Anrufliste <Map> list = xxmapper.executesql (map); // Die SQLSession -Methode ruftMit diesem SQL können Sie dem Benutzer aktiviert und Benutzernamen als Bedingungen bereitstellen. Diese beiden Bedingungen sind offensichtlich erforderlich. Wenn es optional ist, wie soll ich es schreiben?
Vielleicht hat jemand darüber nachgedacht, ob es möglich ist, dynamische SQL in mybatis, <if> Tags usw. zu verwenden?
Bevor Sie diese Frage beantworten, schauen wir uns den Code in DynamicsQlSource an, der dynamisch SQL verarbeitet:
@Override public bandsql getBoundSQL (ObjektparameterObject) {DynamicContext context = new DynamicContext (Konfiguration, ParameterObject); RootsQlnode.Apply (context); Object.Class: parameterObject.getClass (); for (map.entry <string, Object> Eintrag: context.getBindings (). Eintragset ()) {boundsql.setAdDitionalParameter (Entry.Getkey (), Entry.getValue ());} return bodensql;}Wenn MyBatis dynamische SQL übernimmt, werden alle dynamischen SQL -Tags als SQLNode (RootsQLnode hier) Objekte verarbeitet, und diejenigen, die $ {} enthalten, werden auch als textsqlnode -Objekte verarbeitet. In den ersten beiden Zeilen der obigen Methode verarbeitet MyBatis dynamische SQL.
Wenn unser Inhalt in $ {SQL} verschachtelte Tags wie $ {} und <File>, <Wher> und andere Tags enthält, und wenn MyBatis XML an SQLnode -Objekten analysiert, enthält das XML <auswahl> Element nur $ {SQL} und nur $ {sql}} wird pariert. Zur Laufzeit kann diese Parameter -Zeichenfolge Tags wie $ {} und <File>, <where> usw. enthalten, dies geschieht jedoch nach der Analyse von MyBatis. Wenn diese Inhalte als Teil der Zeichenfolge erscheinen, werden sie daher nicht speziell verarbeitet. Sie sind nur Teil von SQL und werden nur so ausgegeben (weil die Datenbank sie nicht erkennt, sie meldet einen Fehler) und kann nicht verarbeitet werden. Daher kann es dynamische SQL nicht durch die mit MyBatis gelieferte Methode schreiben.
Hinweis
Im obigen Code:
SQLSOURCEPARSER.PARSE (context.getSQL (), parameterType, context.getBindings ());
Dieses Code -Stück behandelt dynamische Parameter (#{}) nach der dynamischen SQL -Verarbeitung, sodass diese Art von Parametern in SQL verwendet werden kann.
Da Sie die myBatis dynamische SQL -Methode nicht verwenden können, wie Sie dynamische SQL implementieren können?
Hier ist eine einfache Idee. Verwenden Sie die Vorlage -Markup -Sprache in SQL, um dynamische SQL (wie Freemarker) zu implementieren. Bevor SQL für die Ausführung an MyBatis übergeben wird, verwenden Sie Vorlagen, um SQL zu verarbeiten, um die endgültige ausgeführte SQL (die Verarbeitung #{} -Parameter zu vermeiden) zu generieren und diese SQL für die Ausführung an MyBatis zu übergeben.
Nehmen Sie ein Beispiel für eine Freimaurer -Vorlage, und dennoch basiert der oben genannte SQL auf:
Wählen Sie * aus SYSUSER, wobei 1 = 1 <#if aktiviert ??> enabled =#{aktiviert} </#if> <#if Benutzername ?? && userername!Beachten Sie, dass das <#if> hier das Element von Freemarker ist. Ohne die SQL -Injektion zu berücksichtigen, kann der obige SQL auch geschrieben werden wie:
Wählen Sie * aus SYSUSER, wobei 1 = 1 <#if aktiviert ??> enabled =#{aktiviert} </#if> <#if Benutzername ?? && userername!Der Unterschied ist '%$ {Benutzername}%', da Freemarker auch $ {Benutzername} verarbeitet und die Parameter hier auch durch den tatsächlichen Wert ersetzt.
In dem früher genannten Code ist die Änderung wie folgt:
//# <Enabled}map.put("Enabled ", 1); //#{userername} map.put (" userername "," admin "); // Die SQL entspricht $ {SQL} in XML SQL =" One der beiden komplexen SQLs oben ". Karte); // Legen Sie den verarbeiteten SQL in die Karte map.put ("SQL", "SELECT * AUS SYSUSER"+ "WO EDUBTEL = #{Enabled}"+ "und Benutzername wie concat ('%', #{Benutzername}, '%')"); // method list <map> list = xxmapper.executesc (map);HINWEIS: Die ProcessSQLByFreemarker -Methode besteht darin, SQL -Zeichenfolgen basierend auf den Daten in der Karte zu verarbeiten, und die Implementierungsmethode kann selbst durchsucht werden.
Zu diesem Zeitpunkt wird eine dynamische SQL -Funktion, die nicht sehr kompliziert ist, implementiert.
Ich frage mich, ob es mehr gierige Leute gibt. Denken Sie, dass die oben genannten zurückgegebenen Werte alle Listen <Map> Typ sind. Können Sie eine Entitätsklasse zurückgeben, die ich angegeben habe?
Zum Beispiel in Karte:
map.put ("class", "tk.mybatis.model.sysuser");Kann ich den Rückgabewert auf diese Weise zu Soduser -Typ werden? Da dieser Artikel zu lange gedauert hat, werde ich hier eine Lösung bereitstellen, nicht ausführlich.
Sie können einen Interceptor verwenden, um ihn zu implementieren. Kopieren Sie eine Kopie und ändern Sie das Typ -Attribut des Ergebnismaps in Ergebnismaps, um den Klassentyp für Sie anzugeben. Es ist leicht zu sagen, aber im tatsächlichen Betrieb können Sie etwa 1/10 des PageHelper Paging -Plugins haben.
Da dieser Artikel auf Wunsch meiner Frau geschrieben wurde, werde ich meiner Frau helfen, dieses Plug-In umzusetzen und es dann auszuteilen.
HINWEIS: Wenn es sich um eine dynamische Aktualisierung, einfügen, Anweisung löschen, können Sie die oben genannte <Select> in Aktualisierung ändern (keine Verwendung <Löte> und <Berein>) und int für den Rückgabewert für den Rückgabewert verwenden, was viel einfacher ist als auszuwählen.
Das obige ist eine detaillierte Erläuterung der myBatis -Ausführungsdynamik SQL -Anweisung, die Ihnen vom Editor vorgestellt wurde. 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!