Java 如何:带单引号/撇号的Mybatis查询术语
我有一个搜索页面,它使用用户输入的术语来查询数据库。我正在使用Mybatis 3.4.0和Spring 问题是Mybatis正在剥离搜索词中的任何单引号,不管我是否转义它们。这些是有效的查询,因为用户需要能够搜索像O'Toole这样的字符串,但没有返回任何内容 下面是映射程序中的代码片段。所讨论的字段是Java 如何:带单引号/撇号的Mybatis查询术语,java,sql,mybatis,spring-mybatis,Java,Sql,Mybatis,Spring Mybatis,我有一个搜索页面,它使用用户输入的术语来查询数据库。我正在使用Mybatis 3.4.0和Spring 问题是Mybatis正在剥离搜索词中的任何单引号,不管我是否转义它们。这些是有效的查询,因为用户需要能够搜索像O'Toole这样的字符串,但没有返回任何内容 下面是映射程序中的代码片段。所讨论的字段是case,其中conditiondto.value,传入值是,例如,O''TOOLE(在代码之前手动转义) 这是错过了双逃脱O'TOOLE 在mapper中,我将#替换为$,并用单引号括起来,一切
case,其中conditiondto.value
,传入值是,例如,O''TOOLE
(在代码之前手动转义)
这是错过了双逃脱O'TOOLE
在mapper中,我将#替换为$,并用单引号括起来,一切正常
'${caseWhereConditionDTO.value}'
导致sql输出为
where UPPER(p.last_name ||', ' || p.first_name ) LIKE 'O''TOOLE%'
这将给出预期的查询结果
但我当然希望保留#{}的sql注入保护
所以我的问题是,在仍然使用{}/prepared语句的sql注入保护的情况下,如何查询带有单引号的术语?有两个选项不需要转义单引号:
- 除非确定输入将不包含任何
,否则必须首先对其进行转义(如果它们存在于输入中且未转义,则会对SQL造成混淆:%
是输入的一部分还是“运算符”?),然后将%
连接到值:%
然后值=值+“%”
像#{value}
- 更好的选择是在SQL查询中连接
:%
。它确实有效,我刚刚重新检查过如#{value}| |'%'
%
,而是'
正在被删除。答案:引号不需要转义,而%
可以。我现在明白了,是的,在我的映射程序代码段中,我单独连接了%,这是“${caseWhereConditionDTO.closeConditionString}”,它是%。你能详细介绍一下不需要转义的报价吗?mybatis去掉引号,不管我是否转义引号不需要转义:意思是不要对你的值进行预先处理,按原样传递它。此外,忘记我建议的第一个选项,使用第二个选项:不要在java/mybatis中连接,在SQL中连接,这意味着caseWhereConditionDTO.closeConditionString=“| |'%”
'${caseWhereConditionDTO.value}'
where UPPER(p.last_name ||', ' || p.first_name ) LIKE 'O''TOOLE%'