mysql多字段模糊查询及模糊匹配,使用ESCAPE处理模糊查询%的问题

文章介绍了如何在Java中创建一个工具类`StringUtils`,用于在进行模糊查询时处理包含百分号(%)等特殊字符的情况。该工具类提供方法将特殊字符转换,避免在SQL查询中产生未预期的结果。在实际应用中,DAO服务调用这个工具类的方法处理查询词,然后在Mapper.xml中使用`LIKE`语句配合`ESCAPE`关键字进行查询。
摘要由CSDN通过智能技术生成

前言:在模糊查询时,如果要查询的内容中有%,比例:小明%
如果不做处理,那么就会查询到所以的小明相关的数据,不能只查询到小明%的数据。

1.创建工具类

/**
 * 工具类
 */
public class StringUtils {

    private static final String FUZZY_MATCH_DEFAULT_CHAR="/";

    public static boolean isBlank(final CharSequence cs){
        return org.apache.commons.lang3.StringUtils.isBlank(cs);
    }
    /**
     * 模糊匹配字符串转换规则,使用默认的escape 字符 '/'
     * @param source 源字符串
     * */
    public static String fuzzyMatchingStringReplace(String source){
        if (isBlank(source)){
            return source;
        }
        return source
                .replace(FUZZY_MATCH_DEFAULT_CHAR, FUZZY_MATCH_DEFAULT_CHAR + FUZZY_MATCH_DEFAULT_CHAR)
                .replace("%", FUZZY_MATCH_DEFAULT_CHAR + "%")
                .replace("/", FUZZY_MATCH_DEFAULT_CHAR + "/")
                .replace("_", FUZZY_MATCH_DEFAULT_CHAR + "_");
    }

    /**
     * 模糊匹配字符串转换规则
     * @param source 源字符串
     * @param escapeChar SQL中 escape 后面紧跟的字符
     * */
    public static String fuzzyMatchingStringReplace(String source, CharSequence escapeChar){
        if (isBlank(source)){
            return source;
        }
        return source
                .replace(escapeChar.toString(), escapeChar.toString() + escapeChar)
                .replace("%", escapeChar + "%")
                .replace("/", escapeChar + "/")
                .replace("_", escapeChar + "_");
    }
}

2.工具类使用

daoService调用方法

@Override
    public List<Bceshi> selectAllBceshi(String fuzzyWord) {
        fuzzyWord= StringUtils.fuzzyMatchingStringReplace(fuzzyWord);
        return bceshiMapper.selectAllBceshi(fuzzyWord);
    }

Mapper.xml中使用escape

<select id="selectAllBceshi" resultType="com.atguigu.paymentdemo.entity.Bceshi">
        select * from b_ceshi
        <where>
            <if test="fuzzyWord !=null">
                concat_ws('',bname,btype) like concat('%',#{fuzzyWord},'%')  escape '/'
            </if>
        </where>
    </select>

到这里就结束了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值