经常会有模糊查询的需求,写个模糊查询其实很简单,但是其中可能会遇到一些极少见的问题。例如通配符问题。
模糊查询如下:
//查询param相似的参数,例如1param和param3都会匹配到
//第一种写法:
select s.iid,s.word from sensitive_word s where s.word
LIKE CONCAT(CONCAT('%','param'),'%')
//第二种写法
select s.iid,s.word from sensitive_word s
where s.word LIKE CONCAT('%','param','%');
//mybatis中的xml配置写法
<select id="selectPageByWord" parameterType="string"
resultMap="sensitiveWordResultResult">
select s.iid,s.word from sensitive_word s where
<if test="param3 != '' and param3 != null">
s.word LIKE CONCAT(CONCAT('%',#{param3}),'%') and
</if>
s.is_deleted = 0 ORDER BY s.update_time DESC
</select>
通配符的问题,例如输入的参数是’%’或‘_’,则会匹配到所有的数据,则当然不是我们需要的结果,所以,可用转义字符的方式对这俩字段进行处理。
sql语句中可进行如下处理:在’%’前加‘\’即可,即如下:
select s.iid,s.word,s.create_time from sensitive_word s
where s.word LIKE CONCAT(CONCAT('%','\%'),'%') ;
对于mybatis中的使用,在xml配置里加上这个比较麻烦,则可在业务代码里对入参进行处理,比较方便,加如下代码即可:
if(sensitiveWord.contains("%") || sensitiveWord.contains("_")){
sensitiveWord=sensitiveWord.replace("%", "\\%");
sensitiveWord=sensitiveWord.replace("_", "\\_");
}
相当于人为给字符前加上转义字符。也就避免了通配符的滥用尴尬。