Eu tenho usado o mybatis recentemente. Eu já usei ibatis antes. No geral, é semelhante, mas ainda encontrei muitos problemas. Vou gravar novamente.
Deixe -me primeiro apresentar a diferença entre #{} e $ {} em mybatis, como segue:
1. # Trate todos os dados recebidos como uma string e adicione cotações duplas aos dados automaticamente recebidos. Por exemplo: Ordem por #user_id #, se o valor passado é 111, o valor ao analisar o SQL é a ordem de "111". Se o valor aprovado for ID, o analisado no SQL é a ordem por "ID".
2. $ Exibe os dados passados diretamente e o gera no SQL. Por exemplo: Ordem por $ user_id $, se o valor passado é 111, o valor quando analisado no SQL é a ordem por user_id. Se o valor aprovado for ID, o analisado no SQL é a ordem por ID.
3. O método # pode impedir bastante a injeção de SQL.
4. O método $ não pode impedir a injeção de SQL.
5. O método $ geralmente é usado para passar nos objetos do banco de dados, como a passagem nos nomes da tabela.
6. Geralmente, se você pode usar #, não use $.
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:
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.
Descrição do próprio mybatis:
String Substitution by Padrão, usando a sintaxe #{} fará com que o MyBatis gerar propriedades de estatamento preparado e definirá os valores com segurança nos parâmetros de estatamento preparado (por exemplo?). Embora isso seja mais seguro, mais rápido e quase sempre preferido, às vezes você só deseja injetar diretamente uma string não modificada na instrução SQL. Por exemplo, para ordem por, você pode usar algo assim: Order por $ {columnName} Aqui mybatis não modificar ou escapar da string.Note, não é seguro aceitar a entrada de um usuário e fornecê -lo para uma declaração não modificada dessa maneira. Isso leva a possíveis ataques de injeção de SQL e, portanto, você deve desaprovar a entrada do usuário nesses campos ou sempre executar suas próprias escapadas e verificações. Do exposto, podemos ver:
1. Use a sintaxe do formato #{} para usar a instrução de preparação em mybatis para definir valores com segurança e executar o SQL semelhante ao seguinte:
Preparado PS = Conn.Preparestatement (SQL); Ps.SetInt (1, ID);
O benefício disso é: mais seguro, mais rápido e geralmente é a prática preferida.
2. Mas às vezes você só deseja inserir uma string inalterada diretamente na instrução SQL. Por exemplo, como a ordem por, você pode usá -lo assim:
Encomende por $ {columnName} Neste momento, o mybatis não modificará ou escapará da string.
Este método é semelhante a:
Declaração st = Conn.Createstatement (); ResultSet rs = St.ExecuteQuery (SQL);
As desvantagens deste método são:
Não é seguro aceitar a saída de conteúdo do usuário e fornecer seqüências inalteradas na instrução dessa maneira, resultando em possíveis ataques de injeção de SQL; portanto, o usuário não tem permissão para inserir esses campos ou escapar e verificar por si mesmos.