Heim > Datenbank > MySQL-Tutorial > Hauptteil

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

PHP中文网
Freigeben: 2017-06-20 14:09:56
Original
8528 Leute haben es durchsucht

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};
Nach dem Login kopieren
select * from user where name = ${name};
Nach dem Login kopieren

Die Ergebnisse nach dem Parsen sind alle

select * from user where name = 'zhangsan';
Nach dem Login kopieren
Nach dem Login kopieren

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 = ?;
Nach dem Login kopieren

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

select * from user where name = 'zhangsan';
Nach dem Login kopieren
Nach dem Login kopieren

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}
Nach dem Login kopieren

Wenn in diesem Beispiel der Tabellenname

user lautet; - -

 Die SQL nach der dynamischen Analyse lautet wie folgt:

select * from user; delete user; -- where name = ?;
Nach dem Login kopieren

 --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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage