Diferença entre # e $ em mybatis
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 $.
Impedir a injeção de SQL
Nota: Não escreva as instruções SQL como selecione * de T_STU onde S_NAME como '%$ Name $%', que é extremamente vulnerável a ataques de injeção.
Os parâmetros no formato "$ {xxx}" participarão diretamente da compilação SQL, impedindo os ataques de injeção. No entanto, quando se trata de nomes dinâmicos de tabela e nomes de colunas, você pode usar apenas formatos de parâmetros como "$ {xxx}".
Ao escrever declarações de mapeamento mybatis, tente usar o formato "#{xxx}". Se você precisar usar parâmetros como "$ {xxx}", deve fazer um bom trabalho de filtragem para evitar ataques de injeção de SQL.
exemplo
<sql id = "condicione_where"> <isNotEmpty Property = "CompanyName" precend = "e"> t1.company_name como # CompanyName # </snotEmpty> </sql>
O código Java é semelhante ao seu original, mas não há nada de errado com ele. Se você acha que é problemático encapsular o julgamento nulo e '%' em um método.
if (! stringutil.isEmpty (this.companyname)) {table.SetComPanyname ("%" + this.companyname + "%"); }O exposto acima é a breve discussão sobre a diferença entre # e $ em mybatis e o método para impedir a injeção de SQL. Espero que todos apoiem mais wulin.com ~