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)

大家都在看

  • mybatis中文文档PDF版

    https://share.weiyun.com/2Dwd35jD 密码:dguiby Original: https://www.cnblogs.com/qingxin12345…

    数据库 2023年6月9日
    0108
  • 运维DBA要不要学python

    我个人认为是:要 现在python在运维数据库的工作中主要用在 1、编写一些运维脚本 2、编写运维管理平台 3、研究互联网大厂的运维脚本/工具并应有 特别是运维开源数据库的时候,第…

    数据库 2023年6月9日
    070
  • 如何干涉MySQL优化器使用hash join

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。 GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。 前言 实验 总结 前言 数据库的…

    数据库 2023年6月11日
    083
  • index_merge引发的死锁排查

    前几天排查了一个死锁问题,最开始百思不得其解,因为发生死锁的两个事务是单语句事务,语句类型相同(where属性列相同,仅值不同),而且语句都走了相同的索引,但最终确实发生了死锁。通…

    数据库 2023年6月9日
    086
  • SQL Server如何修改登录密码

    SQL Server如何修改登录密码 我们在打开SQLserver的时候一般选择的是”Windows身份认证”进行登录,如果选择混合模式该怎么登录呢?或者忘…

    数据库 2023年6月9日
    081
  • 正则表达式与SQL

    在我心中正则表达式和SQL就是一样的东西。 SQL是结构化查询语言,是根据某个查询、修改规则来查询修改数据,是描述一个规则给数据库,数据库来执行,数据库返回结果,过程不需要考虑,不…

    数据库 2023年6月9日
    062
  • 数据库设计的十个最佳实践

    数据库是应用及计算机的核心元素,负责存储运行软件应用所需的一切重要数据。为了保障应用正常运行,总有一个甚至多个数据库在默默运作。我们可以把数据库视为信息仓库,以结构化的方式存储了大…

    数据库 2023年5月24日
    092
  • 希望腿上的伤快点好

    明天去星巴克泡一会儿想把一些课程关联到的课程学习一下 Original: https://www.cnblogs.com/ukzq/p/16747859.htmlAuthor: D…

    数据库 2023年6月11日
    078
  • 编译型语言和解释型语言

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

    数据库 2023年6月6日
    0113
  • MySQL操作题(mysql_V20190307)

    DB操作题(mysql_V20190307) 登陆数据库 MYSQL -H LOCALHOST -U ROOT -P 创建DEMO01数据库 CREATE DATABASE DEM…

    数据库 2023年6月9日
    054
  • Oracle培训-介绍与体系架构

    1979年,公司推出Oracle 2,这是计算机软件史上第一个由纯软件公司开发的商用关系型数据库管理系统。公司改名为”关系软件公司” (Relational…

    数据库 2023年6月11日
    093
  • 2022-8-15 数据库 mysql 第一天

    Mysql数据库 数据库 数据库[根据数据结构组织、存储和管理数据的仓库]。它是有组织的、可共享的、统一管理的大量数据的集合,这些数据长期存储在计算机中。 [En] Databas…

    数据库 2023年5月24日
    052
  • 计算机网络 | TCP 连接的建立 和 TCP 连接的断开

    TCP 连接的建立过程 一开始,客户端和服务端都处于 close 状态。 先是服务端监听某个端口,此时服务端处于 listen 状态。 这个时候客户端就可以发送连接请求报文了。 第…

    数据库 2023年6月11日
    0117
  • 从源码角度谈谈open_files_limit的生成逻辑及”Too many open files”的解决思路

    “Too many open files”是一个比较常见的错误,不仅仅是在 MySQL 中。只要是在 Linux 中启动的进程,都有可能遇到这个错误。 究其…

    数据库 2023年6月11日
    0132
  • SpringMvc(四)- 下载,上传,拦截器

    1、图片下载 图片下载:将服务器端的文件以流的形式写到客户端,通过浏览器保存到本地,实现下载; 1.1 图片下载步骤 1.通过session获取上下文对象(session.getS…

    数据库 2023年6月16日
    054
  • InnoDB数据存储结构

    MySQL服务器上 &#x5B58;&#x50A8;&#x5F15;&#x64CE;负责对表中数据的读取和写入工作,不同存储引擎中 &#x5…

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