模糊的查询(使用LIKE进行模糊查询)
情况一:使用+ #等这类字符进行模糊查询时,当跳转到“下一页” 时,查询不到数据
原因分析:部分特殊字符串在url上面作为参数时,这个会被自动处理导致后台无法获取到数据。这种是对request获取参数的影响,其中包含的字符有: + #
解决方案:
跳转或请求数据之前,对含有特殊字符的字符串,进行转码
js里面:encodeURIComponent(参数/url);
情况二:使用mysql的通配符(在like语句中主要使用的有:% _)进行数据的查询
原因分析:使用通配符特殊字符进行的查询,若不进行转义,在sql语句中特殊含义,这就导致与预期的查询结果大相径庭。这种是对sql语句的影响 通配符参考链接
解决方案:
- 自定义类:StringUtil
package cn.edu.hactcm.online_exam_springboot.util;
import org.apache.commons.lang3.StringUtils;
/**
* @program: online_exma_springboot
* @ClassName: StringUtil
* @description: 字符串的处理类
* @author: Mr.Wang
* @create: 2020/11/26 20:33
**/
public class StringUtil {
public static String escapeSql(String before){
/**
* @Description: 模糊查询,对特殊字符(% _)进行预处理
* @Param: [before]
* @return: java.lang.String
* @Author: Mr.Wang
* @Time: 2020/12/10 19:58
*/
if (StringUtils.isNotBlank(before)) {
before = before.replaceAll("_", "/_");
before=before.replaceAll("%","/%");
}
return before;
}
}
-
在查询之前,调用自定义类,对特殊字符进行预处理
-
sql语句,like后面添加: ESCAPE ‘/’
例如:
SELECT * FROM exam WHERE `exam_name` LIKE #{like} ESCAPE '/'
例如:在mybatis的mapper里面
<select id="findByPage" parameterType="Pagination" resultMap="exam">
<bind name="like" value="'%'+fuzzy+'%'"></bind>
SELECT id,exam_name,effective_time,duration,uid FROM `exam` WHERE is_delete=0
<if test="fuzzy!='' and fuzzy!=null">
AND `exam_name` LIKE #{like} ESCAPE '/'
</if>
</select>