MyBatis中模糊搜索使用like匹配带%字符时失效问题

1.问题背景

Mybatis是我们日常项目中经常使用的框架,在项目中我们一般会使用like查询作为模糊匹配字符进行搜索匹配,下面的Mapper.xml是我们使用like在项目中进行模糊匹配的常用方式:

<sql id="searchCondition">
    <trim prefix="where" prefixOverrides="and|or">
        <if test="paramVo.detail != null and paramVo.detail != '' ">
          and idwl.detail like concat('%', #{paramVo.detail, jdbcType=VARCHAR}, '%')
        if>
     trim>
sql>

这样使用模糊查询在分页搜索中可以解决90%的匹配搜索功能,但是,还是有10%是阴沟翻船的事情。比如现在我要匹配文件名detail中带有’%’的文件,使用这个语句就会造成搜索失效,直接返回表中的limit所有数据。

MyBatis中模糊搜索使用like匹配带%字符时失效问题

造成这样结果的原因就是由于像’%’或者’_’这样的字符是通配字符,在模糊匹配的时候需要进行转义执行,mysql执行解析器才会把它当成是单个字符进行匹配,否则则会按照匹配两个”字符进行模糊匹配,得出全表搜索的错误结果。

2.解决方法

2.1.在入参SearchVo上进行特殊符号relpace转换

使用Vo入参接收类对前端传入的detail字段进行判别处理,优先替换replace特殊字符:

public class SerachParamVO {
    private String productVersion;
    private String detail;
    private Integer releaseType;
    private String createUser;
    private String createUserAccount;
    private Date createTime;
    private String description;

    public void setDetail(String detail) {
        this.detail = detail.replaceAll("%", "\\\\%")
                .replaceAll("_", "\\\\_");
    }
}

2.2.使用ESCAPE

使用ESCAPE:escape简单来说就是escape ‘字符’,表示在like中从带有’字符’之后不再作为通配字符具有特殊含义,escape的理解可以参考另外一篇博客:

MYSQL escape用法,这里就不再做详细介绍。

对应的解决方式如下:

①修改sql查询语句,添加escape:

<sql id="searchCondition">
    <trim prefix="where" prefixOverrides="and|or">
        <if test="paramVo.detail != null and paramVo.detail != '' ">
          and idwl.detail like concat('%', #{paramVo.detail, jdbcType=VARCHAR}, '%') escape '/'
        if>
     trim>
sql>

②传入SearchVo进行通配符设置:

public class SerachParamVO {
    private String productVersion;
    private String detail;
    private Integer releaseType;
    private String createUser;
    private String createUserAccount;
    private Date createTime;
    private String description;

    public void setDetail(String detail) {
        this.detail = detail.replaceAll("%", "/%")
                .replaceAll("_", "/_");
    }
}

2.3.总结

以上两种方式本质都是对查询的关键字进行了处理,第一种方式更直接简洁,第二种方式更容易理解。两种方式我个人更推荐第一种。

另外还有一种处理方式是在代码中使用拦截器或者AOP等技术进行统一拦截处理,有兴趣的小伙伴可以搜索了解一下。涉及代码较多,这里就不再一一展开。

本博文写作要感谢”阿飞云”提供博文参考:

Mybatis中Like的使用方式以及一些注意点

写的非常不错,也在工作中解决了我的一个Bug单问题,可以结合一起作为参考。

Original: https://www.cnblogs.com/yif0118/p/15345931.html
Author: 人无名,则可专心练剑
Title: MyBatis中模糊搜索使用like匹配带%字符时失效问题

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/575933/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 数据类型

    布尔类型:true和false;占一个位 public class Demo01 {    public static void main(String[] args) { Ori…

    数据库 2023年6月11日
    096
  • 使用Typora + 阿里云OSS + PicGo 打造个人图床

    使用Typora + 阿里云OSS + PicGo 打造个人图床 为什么要打造图床? 让笔记远走高飞 试问以下场景: 我们要 markdown 笔记放到某博客上,直接进行复制即可。…

    数据库 2023年6月9日
    099
  • 什么是真正的HTAP?(一)背景篇

    To digitally transform the business, AI must be real-time. For AI to be real-time, we need…

    数据库 2023年5月24日
    097
  • MySQL主从不生效且无错误

    现象、主从不生效且无错误 前几天配置个MySQL主从,结果MySQL主从不生效,但在show slave status\G还没有错误,当时感觉很奇怪。change master t…

    数据库 2023年6月9日
    0111
  • Redis 哈希Hash底层数据结构

    Redis 底层数据结构 Redis数据库就像是一个哈希表,首先对key进行哈希运算得到哈希值再取模得到一个下标,每个元素是一个节点,节点之间形成链表。这感觉有点像Java中的Ha…

    数据库 2023年6月14日
    0101
  • 第十九章 基于注解的AOP编程

    组装切面 将2 3 4步放在切面类中: 定义切面类: @Aspect 定义额外功能: @Around 原始方法的运行: ProceedingJoinPoint.proceed() …

    数据库 2023年6月14日
    086
  • 4_Spring

    Spring的基本组成: 1、最完善的轻量级核心框架。 2、通用的事务管理抽象层。 3、JDBC抽象层。 4、集成了Toplink, Hibernate, JDO, and iBA…

    数据库 2023年6月11日
    075
  • 百度云服务器环境搭建——安装JDK环境、TomCat服务器、MySQL数据库

    百度云服务器环境搭建——安装JDK环境、TomCat服务器、MySQL数据库 1.JDK安装 以JDK1.8为例 首先查看是否安装过jdk ,通过VS code连接云服务器 jav…

    数据库 2023年6月16日
    0111
  • Github 星标 8K+ 这款国人开源的 Redis 可视化管理工具,真香…

    做程序员就少不了与一些工具打交道,比如:监控工具、管理工具等,有些工具是命令行界面,有些工具是可视化界面,反正都是可以能够满足日常使用的功能需求。 对于redis管理工具来说,也有…

    数据库 2023年6月9日
    0112
  • docker配置容器日志大小限制

    修改docker配置文件/etc/docker/daemon.json,添加如下内容: { "log-driver": "json-file&quot…

    数据库 2023年6月9日
    0106
  • JDK自带线程池学习

    JDK自带线程池 线程池的状态 线程有如下状态 RUNNING状态:Accept new tasks and process queued tasks SHUTDOWN状态:Don…

    数据库 2023年6月11日
    0113
  • 计算机操作系统(慕课版)思维导图

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据库 2023年6月16日
    099
  • Ajax

    AJAX(Asynchronous Javascript And Xml) 传统请求及缺点 传统的请求都有哪些? 直接在浏览器地址栏上输入URL。 点击超链接 提交form表单 使…

    数据库 2023年6月14日
    0101
  • MySQL——基础查询与条件查询

    基础查询 /* 语法: select 查询列表 from 表名; 类似于:System.out.println(打印东西); 1、查询列表可以是:表中的字段、常量值、表达式、函数 …

    数据库 2023年5月24日
    0113
  • windows运行xcopy计划任务 结果是0x4解决方案

    近几天发现一直好好的数据备份计划任务一直返回0x4失败,直接执行bat又是正常的。 bat命令中使用的是xcopy,到处找方案没解决。 今天意外在使用另一个命令时,发现提示:网络连…

    数据库 2023年6月14日
    079
  • 代码圈复杂度

    回到我们日常的写代码的场景,我们一直在说系统很复杂,那到底什么是系统复杂度呢?最近几天,一直在改项目里别人写的代码,某些方法复杂无注释。怎么才能写的一手可读,可扩展,可维护[注1]…

    数据库 2023年6月14日
    096
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球