如何:Mybatis用单引号/撇号查询术语

时间:2017-04-26 19:49:04

标签: java sql mybatis spring-mybatis

我有一个搜索页面,它使用用户输入的术语来查询数据库。我在Spring中使用Mybatis 3.4.0。

问题是Mybatis正在删除搜索词中的任何单引号,无论我是否逃避它们。这些是有效的查询,因为用户需要能够搜索像O'Toole这样的字符串,但没有返回任何内容。

以下是mapper代码的片段。相关字段为caseWhereConditionDTO.value,传入的值为O''TOOLE(在代码之前手动转义)

<if test="caseWhereConditionDTO.value != null">
    ${caseWhereConditionDTO.leftExpression}
    ${caseWhereConditionDTO.operator} 
    #{caseWhereConditionDTO.value}
    ${caseWhereConditionDTO.closeConditionString}
</if>

导致where子句

where  UPPER(p.last_name ||', ' || p.first_name ) LIKE 'OTOOLE%'

缺少双重逃脱的O''TOOLE

在映射器中,一切正常,我用#替换#和环绕用单引号

'${caseWhereConditionDTO.value}' 

导致sql输出

where  UPPER(p.last_name ||', ' || p.first_name ) LIKE 'O''TOOLE%'

给出了预期的查询结果

但当然我想保留#{}

的sql注入保护

所以我的问题是,如何在仍使用#{} / prepared语句的sql注入保护的情况下查询带单引号的术语?

1 个答案:

答案 0 :(得分:0)

有两个选项,无需转义单引号:

  • 除非确定输入不包含任何%,否则必须首先对它们进行转义(如果它们存在于输入中且未进行转义,则会对SQL造成混淆:{{1}输入的一部分或&#34; 运算符&#34;?)然后将%连接到值:%然后value = value + "%";。< / p>

  • 更好的选择是在SQL查询中连接LIKE #{value}%。它确实有效,我刚刚重新检查过它。