No artigo anterior, introduzi a diferença entre os parâmetros # {} e $ {} e a diferença entre # e $ em mybatis. Se você precisar, você pode consultar.
$ e # descrição simples:
# é equivalente a adicionar cotações duplas aos dados e $ é equivalente a exibir diretamente os dados.
1. Resumo
Ao usar o SQLMAP para a consulta SQL em Mybatis, geralmente é necessário passar dinamicamente os parâmetros. O SQL dinâmico é uma das características poderosas do Mybatis e uma razão importante pela qual é superior a outras estruturas do ORM. Antes de pré -compilar a instrução SQL, o mybatis analisará dinamicamente o SQL e a analisará em um objeto Boundsql, que também é processado aqui. No estágio dinâmico de análise SQL, #{} e $ {} terão performances diferentes, e #{} será analisado em um marcador de parâmetro para uma instrução JDBC pré -compilada.
A #{} é analisado em um espaço reservado para parâmetro? . $ {} é apenas uma substituição pura de string e a substituição variável será realizada durante o estágio dinâmico de análise SQL.
2. Descrição do bug
Parâmetros de front-end:
Pule: 0
Take: 10
RulName: A, B, c
Processamento de camadas de negócios:
pacote sql;/*** Escape parâmetros de múltiplas seleções de front-end como conteúdo da instrução sql*/public class sqlutil {private final static string replacechar_comma = ","; string estática final de string estática; "ABC"; System.out.println ("Comma-Separated:" + Formatinstr (S1)); System.out.println ("Space-Separated:" + Formatinstr (S2));} SLIPTERYSTICSTICSTRATINSTR (String Querystr) {Return QueryInstr (SlipQuerystratystratystatic); {if (null == quererystr || "" .equals (querystr.trim ())) retorna nulo; querystr = querystr.replaceall (sqlutil.replacechar_commma, "ssterystr.split (replacechar_semicolon"); queryinstr (string [] querystrs) {if (null == quererystrs || 0 == querystrs.length) retorna null; stringbuffer buf = new StringBuffer (); para (int i = 0; i <querystrs.length; i ++) {if (i! = 0) buf.append (","); buf.append ("'"). Append (Querystrs [i]). Append ("'");} retornar buf.toString ();}} Processamento da camada de mapeador:
// manuseio de erros <if test = "rename! = Null and rulename! = ''"> E a.rule_name em (#{rename}) </f> // manipulação correta <se test = "rename! = Null e rename! Descrição do log:
[Debug] [2016-08-02 17: 42: 42.226] [qtp1457334982-157] java.sql.Connection-==> Preparação: selecione A.ID, A.Is_Valid, A.Rule_Lable, A.Rule_Name, A.TyEnt, B.SP_ID, B.SP_C.SP_CELID, A.RULE_LABLE, A.RULE_NAME, A.TYENT, B.SP_ID, B.SP_IM, a.gmt_modified, a. ordenando em idc_logistics_assign_rules uma junção esquerda app_user c em c.work_no = a.modifier e c.is_deleted = 'n', idc_sp_info b where a.is_deleted = n 'e b.is_deleted =' n 'e a.sp_idd_id = ? [Debug] [2016-08-02 17: 42: 42.226] [QTP1457334982-157] Java.SQL.PreparedStatement-==> Parâmetros: 'a', 'B' (String), 0 (Integer), 10 (Inteiro)
Análise de resultados: a camada de mapeador pré -compilou o SQL e existem espaços reservados para #? , mas será substituído diretamente por $.
PS: Ao usar o pedido por parâmetros dinâmicos ao classificar Mybatis, você precisa prestar atenção ao uso de $ em vez de #
Substituição de string
Por padrão, o uso da sintaxe #{} Format faz com que o MYBATIS crie uma propriedade de instrução pré -processada e defina um valor seguro com ele como plano de fundo (como?). Isso é seguro e rápido, e às vezes você só deseja inserir uma string que não muda diretamente na instrução SQL. Por exemplo, como a ordem por, você pode usá -lo assim:
A cópia do código é a seguinte:
Encomende por $ {columnName}
Aqui Mybatis não modificará ou escapará de cordas.
IMPORTANTE: Não é seguro aceitar a saída de conteúdo do usuário e fornecê -lo a uma string inalterada na instrução. Isso pode levar a possíveis ataques de injeção de SQL; portanto, você não deve permitir que os usuários entrem nesses campos ou geralmente escapem e verifiquem você mesmo.