Heim >Java >javaLernprogramm >Detaillierte Erläuterung des Unterschieds und der Verwendung der Symbole # und $ in Mabitis

Detaillierte Erläuterung des Unterschieds und der Verwendung der Symbole # und $ in Mabitis

黄舟
黄舟Original
2017-03-08 11:01:471746Durchsuche

In diesem Artikel wird hauptsächlich der Unterschied zwischen #- und $-Symbolen in Mabitis vorgestellt

Einleitung

Mybatis verwendet die Konfiguration in Mapper.xml, um SQL-Abfragen durchzuführen. Wenn wir beispielsweise Benutzer anhand ihrer Namen filtern müssen, lautet die SQL wie folgt:

select * from user where name = "Jack";

In der obigen SQL hoffen wir, dass der Parameter „Jack“ nach dem Namen dynamisch variabel ist, d. h. Benutzer können zu unterschiedlichen Zeiten anhand unterschiedlicher Namen abgefragt werden . Verwenden Sie die folgende SQL in der Mapper.xml-Datei, um den Parameternamen dynamisch zu übergeben:

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

oder:

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

2. $ und #

1 SQL ist eine der leistungsstarken Funktionen von mybatis und ein wichtiger Grund, warum es anderen ORM-Frameworks überlegen ist. Bevor mybatis die SQL-Anweisung vorkompiliert, analysiert es das SQL dynamisch und analysiert es in ein BoundSql-Objekt, in dem auch das dynamische SQL verarbeitet wird. Während der dynamischen SQL-Analysephase verhalten sich #{ } und ${ } unterschiedlich.

#{ }: Wird als Parametermarkierung einer JDBC-vorbereiteten Anweisung analysiert.

Zum Beispiel wird die folgende SQL-Anweisung in Mapper.xml:

select * from user where name = #{name};
dynamisch aufgelöst zu:

select * from user where name = ?;
Ein #{ } wird als Parameterplatzhalter geparst?.

Und ${ } ist nur eine reine Zeichenfolgenersetzung, die Variablenersetzung wird während der dynamischen SQL-Analysephase durchgeführt.

Zum Beispiel die folgende SQL in Mapper.xml:

select * from user where name = ${name};
Wenn der von uns übergebene Parameter „Jack“ ist, gilt das Obige sql Die Analyse lautet:

select * from user where name = "Jack";
Die SQL-Anweisung vor der Vorkompilierung enthält keine Variablen mehr und besteht aus vollständig konstanten Daten.

Zusammenfassend lässt sich sagen, dass die Ersetzungsphase von ${ }-Variablen in der dynamischen SQL-Analysephase erfolgt, während die Ersetzung von #{ }-Variablen im DBMS erfolgt.

3. Verwendung

1. Wo #{ } verwendet werden kann, verwenden Sie #{ }

Dies dient zunächst einmal der Leistung, da dasselbe vorkompilierte SQL wiederverwendet werden kann. Zweitens wurde ${ } vor der Vorkompilierung durch Variablen ersetzt, was zu SQL-Injection-Problemen führen würde. Zum Beispiel die folgende SQL:

select * from ${tableName} where name = #{name}
Wenn unser Parameter tableName user ist, löschen Sie ihn nach der dynamischen SQL-Analysephase - Die SQL vor der Kompilierung lautet:

select * from user; delete user; -- where name = ?; 
-- 之后的语句将作为注释,不起作用,因此本来的一条查询语句偷偷的包含了一个删除表数据的 SQL。

2. Wenn der Tabellenname als Variable verwendet wird, ${ }

Dies liegt daran, dass der Tabellenname eine Zeichenfolge ist. Wenn Sie einen SQL-Platzhalter zum Ersetzen der Zeichenfolge verwenden, werden einfache Anführungszeichen eingefügt, was zu SQL-Syntaxfehlern führt, z. B.:

Das vorkompilierte SQL wird zu:
select * from #{tableName} where name = #{name};

Angenommen, der Parameter, den wir übergeben, ist tableName = " user", name = "Jack", dann wird die SQL-Anweisung nach der Variablenersetzung im Platzhalter zu:
select * from ? where name = ?;

Die obige SQL-Anweisung existiert. Die Syntax ist falsch. Der Tabellenname darf keine einfachen Anführungszeichen enthalten (beachten Sie, dass Backticks zulässig sind).
select * from 'user' where name='Jack';

4. SQL-Vorkompilierung

1. SQL-Vorkompilierung bezieht sich auf Der Datenbanktreiber kompiliert die SQL-Anweisung, bevor er die SQL-Anweisung und die Parameter an das DBMS sendet, sodass bei der Ausführung von SQL durch das DBMS keine Neukompilierung erforderlich ist.

2. Warum eine Vorkompilierung erforderlich ist

JDBC verwendet das Objekt PreparedStatement, um vorkompilierte Anweisungen zu abstrahieren und nutzt die Vorkompilierung. Die Vorkompilierungsphase kann die Ausführung von SQL optimieren. In den meisten Fällen kann das vorkompilierte SQL direkt ausgeführt werden und das DBMS muss nicht erneut kompiliert werden. Je komplexer das SQL ist, desto größer ist die Kompilierungskomplexität. In der Vorkompilierungsphase können mehrere Vorgänge zu einem Vorgang zusammengefasst werden. Vorbereitete Anweisungsobjekte können wiederverwendet werden. Zwischenspeichern des PreparedState-Objekts, das nach der Vorkompilierung einer SQL generiert wurde. Beim nächsten Mal können Sie dieses zwischengespeicherte PreparedState-Objekt direkt für dieselbe SQL verwenden. Standardmäßig kompiliert mybatis alle SQL-Dateien vor.

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Unterschieds und der Verwendung der Symbole # und $ in Mabitis. 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