Heim  >  Artikel  >  Datenbank  >  Was ist der Unterschied zwischen #{} und ${} in Mybatis?

Was ist der Unterschied zwischen #{} und ${} in Mybatis?

PHP中文网
PHP中文网Original
2017-06-20 14:09:568460Durchsuche

Ich ging vor ein paar Tagen zu einem schriftlichen Test in ein Unternehmen und eine der Fragen lautete: „Was ist der Unterschied zwischen #{} und ${} in Mybatis?“. Um ehrlich zu sein, war mir das damals wirklich nicht ganz klar, da ich selbst nicht viel über mybatis gelernt hatte. Obwohl mybatis in den letzten Projekten verwendet wurde, umfasste es nur das grundlegendste Hinzufügen, Löschen, Ändern und Abfragen zwischen mehreren Tabellen. Die Korrelation wird fast nie verwendet. Während #{} nur in Mapper-Mapping-Dateien verwendet wird, wird ${} in JS- und Front-End-JSP-Seiten verwendet. Später habe ich online nachgesehen und festgestellt, dass es immer noch einen großen Unterschied zwischen den beiden gibt. Jetzt fasse ich die Informationen, die ich gefunden habe, wie folgt zusammen, um die Diskussion und das Studium für alle zu erleichtern.

Generell lässt sich der Unterschied zwischen den beiden in den folgenden 6 Punkten zusammenfassen:

(1) # Will Die eingehenden Daten werden als Zeichenfolge behandelt und den automatisch eingehenden Daten werden doppelte Anführungszeichen hinzugefügt. Zum Beispiel: Sortieren nach #user_id#, wenn der übergebene Wert 111 ist, dann wird der Wert beim Parsen in SQL nach „111“ sortiert, wenn der übergebene Wert nach ID lautet, wird das analysierte SQL nach „ID“ sortiert ".

(2)$ zeigt die eingehenden Daten direkt in SQL an und generiert sie. Zum Beispiel: order by $user_id$, wenn der übergebene Wert 111 ist, dann ist der in SQL analysierte Wert order by user_id. Wenn der übergebene Wert id ist, ist der analysierte SQL-Wert order by id.

(3) #-Methode kann die SQL-Injektion weitgehend verhindern.

(4) Die $-Methode kann die SQL-Injection nicht verhindern.

(5) Die $-Methode wird im Allgemeinen zur Übergabe von Datenbankobjekten wie Tabellennamen verwendet.

(6) Wenn Sie # generell verwenden können, verwenden Sie nicht $.

ps: Bei der Verwendung von mybatis bin ich auch auf die Verwendung von gestoßen. Die Anweisungen in diesem Symbol werden nicht als Zeichenfolgen, sondern direkt als SQL-Anweisung behandelt Ausführen einer gespeicherten Prozedur.

Erläuterung der Beispiele:

Dynamisches SQL ist eine der Hauptfunktionen von Mybatis. Nachdem die im Mapper definierten Parameter an XML übergeben wurden, analysiert Mybatis sie dynamisch, bevor sie abgefragt werden. mybatis stellt uns zwei Syntaxen zur Verfügung, die dynamisches SQL unterstützen: #{} und ${}.

Wenn in der folgenden Anweisung der Wert von name zhangsan ist, gibt es keinen Unterschied zwischen den beiden Methoden:

select * from user where name = #{name};
select * from user where name = ${name};

Die Ergebnisse nach dem Parsen sind alle

select * from user where name = 'zhangsan';

Aber #{} und ${} werden bei der Vorkompilierung unterschiedlich verarbeitet. #{} Während der Vorverarbeitung wird der Parameterteil durch einen Platzhalter ersetzt?, um zu ersetzen und zur folgenden SQL-Anweisung zu werden:

select * from user where name = ?;

Und ${} ist nur eine einfache Zeichenfolgenersetzung . In der dynamischen Analysephase wird die SQL-Anweisung in

select * from user where name = 'zhangsan';

oben analysiert, #{ Parameterersetzung of } tritt im DBMS auf, während ${} während der dynamischen Analyse auftritt.

Welche Methode sollten wir also während der Anwendung anwenden?

Die Antwort lautet: Verwenden Sie zuerst #{}. Weil ${} SQL-Injection-Probleme verursachen wird.

Sehen Sie sich das folgende Beispiel an:

select * from ${tableName} where name = #{name}

Wenn in diesem Beispiel der Tabellenname

user lautet; - -

 Die SQL nach der dynamischen Analyse lautet wie folgt:

select * from user; delete user; -- where name = ?;

 --Die folgenden Anweisungen werden auskommentiert, und die ursprüngliche Anweisung für die Abfrage von Benutzern wird zur Abfrage Alle Benutzerinformationen + Anweisungen, die Benutzertabellen löschen, führen zu erheblichen Schäden an der Datenbank und höchstwahrscheinlich zu Serverausfällen.

 Aber wenn der Tabellenname als Parameter übergeben wird, kann nur ${} verwendet werden. Dies erinnert uns auch daran, bei dieser Verwendung vorsichtig mit SQL-Injection-Problemen umzugehen.

Das obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen #{} und ${} in Mybatis?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn