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.
select * from user where name = #{name};
select * from user where name = ?;
select * from user where name = ${name};
select * from user where name = "Jack";
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}
select * from user; delete user; -- where name = ?; -- 之后的语句将作为注释,不起作用,因此本来的一条查询语句偷偷的包含了一个删除表数据的 SQL。
2. Wenn der Tabellenname als Variable verwendet wird, ${ }
<🎜 muss verwendet werden >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};
select * from ? where name = ?;
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!