Ich habe das Orm -Framework mybatis verwendet und einige gemeinsame Funktionen in mybatis verwendet. Heutzutage gibt es in der Projektentwicklung ein Unternehmen, in dem Benutzer von den Bereichen in bestimmten Tabellen beschränkt werden müssen, und ob bestimmte Felder angezeigt werden, z. B. bestimmte Felder in einer bestimmten Tabelle dürfen nicht von Benutzern abgefragt werden. In diesem Fall ist es erforderlich, SQL zu erstellen, um dynamische Tabellennamen und Feldnamen zu bestehen. Jetzt werde ich die Lösung zusammenfassen und hoffe, dass sie meinen Partnern, die auf dasselbe Problem stoßen, hilfreich sein wird.
Dynamic SQL ist eines der leistungsstarken Merkmale von MyBatis. Bevor MyBatis SQL -Anweisungen vor dem Vorkomparieren von SQL analysiert und in ein BoundSQL -Objekt analysiert, das auch hier verarbeitet wird. Lassen Sie uns zuerst mit der Verwendung von #{} und $ {} in mybatis vertraut gemacht:
Im dynamischen SQL -Parsingprozess sind die Auswirkungen von #{} und $ {} unterschiedlich:
#{} als Parametermarker für eine vorkompilierte JDBC -Anweisung analysiert.
Wie in der folgenden SQL -Anweisung gezeigt
Wählen Sie * vom Benutzer, wobei Name = #{Name};Wird analysiert als:
Wählen Sie * vom Benutzer, wo name =?;
Kannst du sehen, wie #{} in einen Parameter -Platzhalter analysiert wird? .
$ {} ist nur ein reiner String -Ersatz. Der variable Austausch wird während der dynamischen SQL -Parsingphase wie der folgenden SQL -Anweisung durchgeführt:
Wählen Sie * vom Benutzer, wobei Name = $ {Name};Wenn wir den Parameter "Sprite" übergeben, wird SQL als:
Wählen Sie * vom Benutzer wobei Name = "Sprite";
Sie können sehen, dass die SQL -Anweisung vor der Vorkompilierung keinen variablen Namen mehr enthält.
Zusammenfassend befindet sich die Ersatzstufe der Variablen von $ {} in der dynamischen SQL -Parsing -Stufe, während der Ersatz der Variablen von #{} in den DBMs liegt.
Der Unterschied zwischen #{} und $ {} kann einfach wie folgt zusammengefasst werden:
#{} behandelt den übergebenen Parameter als Zeichenfolge und fügt dem übergebenen Parameter ein doppeltes Zitat hinzu
$ {} zeigt die übergebenen Parameter in SQL direkt an, und es werden keine Zitate hinzugefügt
#{} kann die SQL -Injektion in Chengdu verhindern, $ {} kann jedoch die SQL -Injektion nicht verhindern
$ {} wurde vor der Vorkompilierung durch Variablen ersetzt, was das Risiko einer SQL -Injektion darstellt. Wie folgt SQL
Wählen Sie * aus $ {tableName} wobei Name = $ {Name}}Wenn der übergebene Parameter -TableName Benutzer ist; Benutzer löschen; -Dann wird nach SQL Dynamic Parsing die SQL vor der Vorkompilierung:
Wählen Sie * vom Benutzer aus; Benutzer löschen; - wo name =?;
-Die nachfolgenden Aussagen werden nicht als Kommentare funktionieren, und meine Freunde und ich waren fassungslos! ! ! Haben Sie gesehen, dass die ursprüngliche Abfrageanweisung tatsächlich heimlich eine SQL enthält, die Tabellendaten löscht, nämlich löschen, löschen, löschen! ! ! Ich sagte dreimal wichtige Dinge und Sie können sich vorstellen, wie groß das Risiko ist.
$ {} wird im Allgemeinen verwendet, um den Tabellennamen, den Feldnamen usw. der Datenbank zu übertragen.
Versuchen Sie, $ {} nicht zu verwenden, wo Sie #{} verwenden können
Wenn ich durch die obige Analyse zum Thema geht, haben Sie vielleicht einige Ideen, wie Sie Tabellennamen und Feldnamen dynamisch aufrufen können. Beispiele sind wie folgt:
<select id = "getUser" resultType = "java.util.map" parameterType = "java.lang.String" AnweisungType = "Anweisung"> Select $ {Spalten} aus $ {tablename} wobei Company_Remark = $ {Company} </select </select> </select> </select> </select>Um dynamische Anruftabellennamen und Feldnamen zu implementieren, kann die Vorkompilierung nicht verwendet werden. Sie müssen AnweisungType = "Anweisung" "hinzufügen.
AUSGABETTYPE: Eine Aussage (nicht erfunden), vorbereitet (vorkompiliert) oder aufrufbar, wodurch MyBatis Anweisungen, Vorbereitungen oder Callablestatements verwendet. Standard: Vorbereitet. Offensichtlich kann die Vorkompilierung hier nicht verwendet werden, sie muss in Nicht-Kompilierung geändert werden.
Zweitens beträgt der Wert der Variablen in SQL $ {xxx}, nicht #{xxx}.
Da $ {} die übergebenen Parameter direkt angezeigt werden soll, um SQL zu generieren, sind die in $ {xxx} übergebenen Parameter beispielsweise String -Daten. Anführungszeichen sollten hinzugefügt werden, bevor der Parameter übergeben wird, wie z. B.:
String name = "Sprite"; name = "'" + name + "'";
Zusammenfassen
Das obige ist die Lösung für den von MyBatis Dynamic Call -Tabellennamen und Feldnamen, den Sie vom Editor vorgestellt haben. 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!
Dieser Artikel ist reproduziert von: http://www.yuanrengu.com/index.php/mybatis1021.html