繁体   English   中英

作法:使用单引号/撇号的Mybatis查询字词

[英]How to: Mybatis query term with a single quote / apostrophe

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

问题是Mybatis会删除搜索词中的任何单引号,无论我是否将其转义。 这些是有效的查询,因为用户需要能够搜索O'Toole之类的字符串,但不会返回任何内容。

这是映射器的代码片段。 有问题的字段是caseWhereConditionDTO.value ,传入的值例如是O''TOOLE (在代码中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注入保护

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

有两种无需转义单引号的选项:

  • 除非确定输入将不包含任何%输入,否则必须首先对其进行转义(如果它们存在于输入中并且不进行转义,则会对SQL造成混淆:输入的一部分是%还是“ 运算符 ”?),然后将其串联%到值: value = value + "%"; 然后是LIKE #{value}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM