La diferencia entre # {} y $ {} en mybatis y consulta difusa

SQL dinámico es una de las características principales de MyBatis, una vez que los parámetros definidos en el mapeador se pasan al xml, MyBatis los analizará dinámicamente antes de realizar la consulta. MyBatis nos proporciona dos sintaxis que soportan sql dinámico: # {} y $ {}.

La diferencia entre # {} y $ {}

(1) # {} es un procesamiento de precompilación y el análisis dinámico agregará comillas dobles a la variable entrante, $ {} es un reemplazo de cadena sin comillas dobles.

(2) Cuando MyBatis procesa # {}, reemplaza # {} en SQL con el signo? Y usa el método establecido de PreparedStatement para asignar el valor; cuando MyBatis procesa $ {}, reemplaza $ {} con el valor de la variable .

(3) El uso de # {} puede prevenir eficazmente la inyección de SQL y mejorar la seguridad del sistema.

(4) Utilice el mecanismo de compilación previa de Preparedstatement. La precompilación consiste en precompilar la instrucción SQL por adelantado, y los parámetros inyectados posteriormente no se compilarán en SQL. El mecanismo de precompilación puede prevenir muy bien la inyección de SQL. En algunas ocasiones especiales, solo se puede usar $ {}, no # {}. Por ejemplo: ORDER BY $ {id} cuando se usa la ordenación, si se usa # {id}, se analizará en ORDER BY "id", que obviamente es una forma incorrecta de escribir.


<select id="selectUser" parameterType="int" resultType="user">
  SELECT id,name,password FROM user WHERE password = #{password}
</select>

Si la contraseña entrante es 123456, se analizará en SELECT id, name, password FROM user WHERE password = "123456" (con comillas dobles) durante el análisis

<select id="selectUser" parameterType="int" resultType="user">
  SELECT id,name,password FROM user WHERE password = ${password}
</select>

Si la contraseña entrante es 123456, se analizará en SELECT id, name, password FROM user WHERE password = 123456 (sin comillas dobles) durante el análisis

Consulta difusa usando mybatis en mysql

Nunca escribas

<select id="selectUser" parameterType="int" resultType="user">
  SELECT id,name,password FROM user WHERE name LIKE "%#{password}%" 
</select>

Debido a que el sql que obtiene la base de datos después del análisis dinámico es SELECT id, name, password FROM user WHERE name LIKE "%" 小 "%", no hay duda de que tales declaraciones SQL son definitivamente incorrectas.

Esta es la forma correcta de escribir:

<select id="selectUser" parameterType="int" resultType="user">
  SELECT id,name,password FROM user WHERE name LIKE concat("%",${password},"%") 
</select>

Si el nombre de entrada es pequeña , después de la resolución dinámica se convierte en SELECT id, nombre, contraseña de usuario DESDE DONDE nombre como "% pequeña%", el nombre de la base de datos se incluirá poca información, visite

función concat

CONCAT (Cadena 1, Cadena 2, Cadena 3,…): Concatenar la cadena 1, la cadena 2, la cadena 3, etc. juntas.

Artículo de referencia: https://www.cnblogs.com/liaowenhui/p/12217959.html

Supongo que te gusta

Origin blog.csdn.net/qq1350975694/article/details/107758152
Recomendado
Clasificación