Java 如何:带单引号/撇号的Mybatis查询术语

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中,我将#替换为$,并用单引号括起来,一切

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

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

下面是映射程序中的代码片段。所讨论的字段是
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}| |'%'
    。它确实有效,我刚刚重新检查过


如果您已经使用双引号手动转义casehereconditiondto.value,是否可以使用文本文字语法?例如,查看并努力生成where子句,如where q'[UPPER(p.last|u name | | | |','| p.first|u name)如'O'TOOLE%']我不确定我是否明白,问题不是
%
,而是
'
正在被删除。答案:引号不需要转义,而
%
可以。我现在明白了,是的,在我的映射程序代码段中,我单独连接了%,这是“${caseWhereConditionDTO.closeConditionString}”,它是%。你能详细介绍一下不需要转义的报价吗?mybatis去掉引号,不管我是否转义引号不需要转义:意思是不要对你的值进行预先处理,按原样传递它。此外,忘记我建议的第一个选项,使用第二个选项:不要在java/mybatis中连接,在SQL中连接,这意味着
caseWhereConditionDTO.closeConditionString=“| |'%”
'${caseWhereConditionDTO.value}' 
where  UPPER(p.last_name ||', ' || p.first_name ) LIKE 'O''TOOLE%'