En el artículo anterior, introduje la diferencia entre los parámetros # {} y $ {} y la diferencia entre # y $ en MyBatis. Si lo necesita, puede consultarlo.
$ y # descripción simple:
# es equivalente a agregar cotizaciones dobles a los datos, y $ es equivalente a mostrar directamente los datos.
1. Resumen
Al usar SQLMAP para la consulta SQL en MyBatis, a menudo es necesario pasar dinámicamente los parámetros. Dynamic SQL es una de las potentes características de MyBatis y una razón importante por la que es superior a otros marcos de ORM. Antes de precompilar la declaración SQL, MyBatis analizará dinámicamente el SQL y la analizará en un objeto BoundSQL, que también se procesa aquí. En la etapa dinámica de análisis SQL, #{} y $ {} tendrán actuaciones diferentes, y #{} se analizará en un marcador de parámetros para una declaración precompilada JDBC.
¿Se analiza un #{} en un marcador de posición de parámetro? . $ {} es solo un reemplazo de cadena pura, y se realizará un reemplazo de variable durante la etapa dinámica de análisis SQL.
2. Descripción del error
Parámetros frontales:
Skip: 0
Take: 10
Rulename: A, B, C
Procesamiento de la capa de negocios:
paquete sql;/*** Escape Parámetros de la selección múltiple front-end como contenido de instrucción SQL*/public class sqlutil {private final static string replaceChar_comma = ","; String estático final privado replacechar_semicolon = ";"; public static void main (String [] args) {string s1 = "A, b, c"; string s2 = "ABC"; System.out.println ("Sparated:" + FormatInstR (S1)); System.out.println ("Space-Sparated:" + FormatInstr (S2));} private static string formatInstR (string QueryStr) {return queryInstR (slipTQuerquis (QueryStr)); queryStr) {if (null == QUERYTR || "" .equals (Querystr.trim ())) return null; QueryStr = QueryStr.replaceAll (sqlutil.replacechar_comma, "). Querystr.split ("// s+");} private static string QueryInstR (String [] QueryStrs) {if (null == QueryStrs || 0 == QueryStrs.length) return null; StringBuffer buf = new StringBuffer (); para (int i = 0; i <QeryStrs.length; i ++) buf.append (","); buf.append ("'"). Append (Querystrs [i]). Append ("'");} return buf.ToString ();}} Procesamiento de la capa mapeador:
// Manejo de errores <if test = "Rulename! = Null and Rulename! = ''"> Y A.Rule_Name in (#{Rulename}) </if> // manejo correcto <if test = "ruleName! = Null and rulename! = '' '"> Y a.rule_name in ($ {rulename}) <if>> Descripción del registro:
[Depurar] [2016-08-02 17: 42: 42.226] [qtp1457334982-157] java.sql.connection-==> Preparación: select a.id, a.is_valid, a.rule_lable, a.rule_name, a.type, b.sp_id, b.sp_name, a.rule_content, C.Ser, C. A.GMT_Modified, A. Ordenamiento de IDC_Logistics_Assign_Rules A Left APP_USER C en C.Work_NO = A.Modifier and C.IS_DELELED = 'N', IDC_SP_INFO B DONDE A.IS_DELELED = 'N' Y B.IS_DELELED = 'N' 'Y A.SP_ID = B.SP_ID y A.RULE_NAME_? [Depurar] [2016-08-02 17: 42: 42.226] [Qtp1457334982-157] java.sql.preparedStatement-==> parámetros: 'a', 'b' (string), 0 (integer), 10 (intenso)
Análisis de resultados: ¿La capa mapeador ha precompilado SQL, y hay marcadores de posición para #? , pero será reemplazado directamente por $.
PD: 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í:
La copia del código es la siguiente:
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.