He estado usando mybatis recientemente. He usado ibatis antes. En general, es similar, pero todavía encontré muchos problemas. Lo grabaré de nuevo.
Permítanme introducir primero la diferencia entre #{} y $ {} en mybatis, como sigue:
1. # Trate todos los datos entrantes como una cadena y agregue cotizaciones dobles a los datos entrantes automáticamente. Por ejemplo: ordene por #user_id #, si el valor pasado es 111, entonces el valor al analizar a SQL es ordenar por "111". Si el valor se pasó IS ID, el analizado en SQL se ordena por "ID".
2. $ Muestra los datos aprobados directamente y los genera en SQL. Por ejemplo: orden por $ user_id $, si el valor pasado es 111, entonces el valor cuando se analiza en SQL es ordenado por User_ID. Si el valor pasado en IS ID, el analizado en SQL es orden por ID.
3. El método # puede evitar enormemente la inyección de SQL.
4. El método $ no puede evitar la inyección de SQL.
5. El método $ se usa generalmente para pasar en objetos de base de datos, como pasar los nombres de las tabla.
6. Generalmente, si puede usar #, no use $.
Al usar el orden por parámetros dinámicos al clasificar MyBatis, debe prestar atención a usar $ en lugar de #
Reemplazo de cuerdas
Por defecto, el uso de la sintaxis de formato #{} hace que MyBatis cree una propiedad de declaración preprocesada y establezca un valor seguro con ella como fondo (como?). Esto es seguro y rápido, y a veces solo desea insertar una cadena que no cambie directamente en la instrucción SQL. Por ejemplo, como pedido, puede usarlo así:
Orden por $ {columnName}
Aquí MyBatis no modificará ni escapará de las cuerdas.
IMPORTANTE: No es seguro aceptar la salida de contenido del usuario y proporcionarla a una cadena sin cambios en la declaración. Esto puede conducir a posibles ataques de inyección SQL, por lo que no debe permitir que los usuarios ingresen a estos campos, o generalmente escapen y los revisen usted mismo.
Descripción de MyBatis en sí:
String Sustitutionby predeterminado, usando la sintaxis #{} hará que MyBatis genere propiedades de preparación y establezca los valores de manera segura en los parámetros de estatemación preparada (¿por ejemplo?). Si bien esto es más seguro, más rápido y casi siempre preferido, a veces solo desea inyectar directamente una cadena sin modificar en la declaración SQL. Por ejemplo, para ordenar, puede usar algo como esto: pedido por $ {columnName} Aquí myBatis no modificará ni escapará de la cadena. No es seguro aceptar la entrada de un usuario y proporcionarla a una declaración sin modificar de esta manera. Esto conduce a posibles ataques de inyección SQL y, por lo tanto, debe no permitir la entrada del usuario en estos campos, o siempre realizar sus propias escapadas y cheques. De lo anterior, podemos ver:
1. Use la sintaxis de formato #{} para usar la instrucción de preparación en myBatis para establecer valores de forma segura y ejecutar SQL de manera similar a la siguiente:
Preparado PS = Conn.PrepareStatement (SQL); Ps.SetInt (1, id);
El beneficio de esto es: más seguro, más rápido y generalmente es la práctica preferida.
2. Pero a veces solo desea insertar una cadena sin cambios directamente en la instrucción SQL. Por ejemplo, como pedido, puede usarlo así:
Orden por $ {columnName} En este momento, MyBatis no modificará ni escapará de la cadena.
Este método es similar a:
Declaración st = conn.createStatement (); resultset rs = St.ExecuteQuery (SQL);
Las desventajas de este método son:
No es seguro aceptar la producción de contenido del usuario y proporcionar cadenas sin cambios en la declaración de esta manera, lo que resulta en posibles ataques de inyección SQL, por lo que el usuario no puede ingresar a estos campos o escapar y verificar por sí mismo.