Javaweb模糊查询,特殊字符串的处理(+,#)(% _)

模糊的查询(使用LIKE进行模糊查询)

情况一:使用+ #等这类字符进行模糊查询时,当跳转到“下一页” 时,查询不到数据

原因分析:部分特殊字符串在url上面作为参数时,这个会被自动处理导致后台无法获取到数据。这种是对request获取参数的影响,其中包含的字符有: + #

解决方案:
跳转或请求数据之前,对含有特殊字符的字符串,进行转码
js里面:encodeURIComponent(参数/url);


情况二:使用mysql的通配符(在like语句中主要使用的有:% _)进行数据的查询

原因分析:使用通配符特殊字符进行的查询,若不进行转义,在sql语句中特殊含义,这就导致与预期的查询结果大相径庭。这种是对sql语句的影响   通配符参考链接

解决方案:

  1. 自定义类: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;
    }
}
  1. 在查询之前,调用自定义类,对特殊字符进行预处理

  2. 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>

参考链接

% _特殊字符串的处理

解决获取不到request里面的数据,当有特殊字符时

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值