在使用mybatis的模糊查询时,有两个特殊符号需要注意:
%(百分号):相当于任意多个字符;
_(下划线):相当于任意的单个字符;
处理方法:
1:(查询条件参数,比如"xx%_x")param.replaceAll("%", “/%”).replaceAll("-", “/-”)
2:select * from table where column like concat(’%’,#{param},’%’) escape ‘/’;
处理之后百分号%、下划线_在mybatis执行该拼接的sql语句的时候就不会被转义处理了
escape ‘/’ 指用’/'说明后面的%或_就不作为通配符而是普通字符了,注意前面没有转义字符的%仍然起通配符作用
like concat(’%’,#{param},’%’) 、like ‘%${param}%’ 、 like ‘%’||#{param}||’%'是一个意思;
LIKE操作符常用于模式匹配查询数据。以正确的方式使用LIKE运算符对于提高查询性能至关重要。
LIKE操作符允许您从基于指定的模式选择表中的数据。因此,LIKE操作符经常用于SELECT语句的WHERE子句中。
MySQL提供了两个通配符与LIKE操作符一起使用:百分比 %和下划线_。
percent(%)通配符允许您匹配任何零个或多个字符的字符串。
下划线(_)通配符允许您匹配任何单个字符。
MySQL LIKE示例
让我们练习一些使用LIKE操作符的例子。请参employees见下表。
MySQL LIKE 百分号(%)通配符
假设要查找名字以字符a开头的员工,可以在模式匹配的结尾处使用百分比(%)通配符,如下所示:
SELECT
employeeNumber, lastName, firstName
FROM
employees
WHERE
firstName LIKE 'a%';
结果如下:
MySQL扫描整个employees表以查找名字以字符a开头,后跟任意数量字符的员工。
如果要查找名字以on结尾的员工,可以在模式匹配查询中使用通配符%开头,“on”结尾的组合, 如:
SELECT
employeeNumber, lastName, firstName
FROM
employees
WHERE
lastName LIKE '%on';
结果如下:
如果你要查找名字含有on的员工,则可以使用 like ‘%on%’,如:
SELECT
employeeNumber, lastName, firstName
FROM
employees
WHERE
lastname LIKE '%on%';
结果如下:
MySQL LIKE通配符下划线(_)
如果要查找姓名以T开头,m结尾并且名字为三个字符的员工,可以使用下划线通配符来构造一个SQL查询语句,如:
SELECT
employeeNumber, lastName, firstName
FROM
employees
WHERE
firstname LIKE 'T_m';
结果如下:
MySQL LIKE运算符与NOT运算符
MySQL允许您结合NOT运算符和LIKE运算符来查找不匹配特定模式的字符串。
假设要查找姓氏不以字符B开头的员工,可以使用 NOT LIKE 模式匹配:
SELECT
employeeNumber, lastName, firstName
FROM
employees
WHERE
lastName NOT LIKE 'B%';
结果如下:
请注意,如果LIKE运算符的查询模式使用的是字母,那么它是不区分大小写的,因此b%和B%两个型态查询产生的结果是相同的。
MySQL LIKE与ESCAPE
有时,要匹配的模式包含通配符,例如10%,_20等。在这些情况下,可以使用ESCAPE子句指定转义字符,以便MySQL将通配符解释为文字字符。如果没有明确指定转义字符,默认的转义字符是反斜杠""。
例如,如果要查找products表中productCode字段包含字符串_20的产品,则可以使用模式%_20%查询:
SELECT
productCode, productName
FROM
products
WHERE
productCode LIKE '%\_20%';
或者也可以指定一个不同的转义字符。例如,通过ESCAPE子句使用 $ 作为转义符:
SELECT
productCode, productName
FROM
products
WHERE
productCode LIKE '%$_20%' ESCAPE '$';
结果如下:
模式%$_20%匹配包含_20字符串的任何字符串。
LIKE语句会扫描表中的所以行,因此,索引对优化like语句来说没有任何效果。所以,使用LIKE操作符查询大量数据时,其性能非常低。
参考:https://blog.csdn.net/q343509740/article/details/80602537