MyBatis编写模糊查询时使用concat函数时需注意单个字符为'%'和'_'的模糊搜索情况,MySQL函数instr()
concat函数
模糊查询时需要注意单个字符为'%'和'_'的情况,否则会全匹配,控制层参数需要进行相关拦截!
拦截校验(如果待搜索的信息含有通配符,此方法不通!)
// 通配符数组
public static final String[] WILDCARD_CHARACTER = new String[]{"%","_"};
// 需要替换的内容
public static final String REPLACEMENT_CHARACTER= "\\";
public List<Test> getTestList(Test test){
if(StringUtils.isNotEmpty(test.getTitle) && test.getTitle.length == 1){
// % _ 这两个通配符都要进行替换
if (WILDCARD_CHARACTER.contains(test.getTitle)) {
throw new RuntimeException("你好有意思呀!");
}
// 或者
test.setTitle(StringUtils.replace(test.getTitle(),WILDCARD_CHARACTER,REPLACEMENT_CHARACTER));
}
return testMapper.selectTestList(Test test);
}
MySQL函数之instr()
1)instr()函数的格式 (俗称:字符查找函数)
格式一:instr( src, dest ) ===> instr(源字符串, 目标字符串)
格式二:instr( string1, string2,start_position,nth_appearance ) ===> instr(源字符串, 目标字符串, 起始位置, 匹配序号) 解析:string2 的值要在string1中查找,是从start_position给出的数值(即:位置)开始在string1检索,检索第nth_appearance(几)次出现string2。
instr( string1, string2, start_position,nth_appearance )
参数
string1:源字符串,要在此字符串中查找。
string2:要在string1中查找的字符串 。
start_position:代表string1 的哪个位置开始查找。此参数可选,如果省略默认为1. 字符串索引从1开始。如果此参数为正,从左到右开始检索,如果此参数为负,从右到左检索,返回要查找的字符串在源字符串中的开始索引。
nth_appearance:代表要查找第几次出现的string2. 此参数可选,如果省略,默认为 1.如果为负数系统会报错。
注:在Oracle/PLSQL中,instr函数返回要截取的字符串在源字符串中的位置。只检索一次,也就是说从字符的开始到字符的结尾就结束。
MySQL中的常用的三个通配符
-
%:用来表示任意多个字符,包含0个字符
-
_ : 用来表示任意单个字符
-
escape:用来转义特定字符(使用escape,转义字符后面的%或_就不作为通配符了,注意前面没有转义字符的%和_仍然起通配符作用)