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

 更新时间:2021年09月28日 09:46:37   作者:人无名,则可专心练剑  
Mybatis是我们日常项目中经常使用的框架,在项目中我们一般会使用like查询作为模糊匹配字符进行搜索匹配,下面的Mapper.xml是我们使用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所有数据。

造成这样结果的原因就是由于像'%'或者'_'这样的字符是通配字符,在模糊匹配的时候需要进行转义执行,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单问题,可以结合一起作为参考。

到此这篇关于MyBatis中模糊搜索使用like匹配带%字符时失效问题的文章就介绍到这了,更多相关MyBatis like模糊搜索内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java8新特性:函数式编程

    Java8新特性:函数式编程

    Java8最新引入函数式编程概念,该项技术可以大大提升编码效率,本文会对涉及的对象等进行两种方法的对比,对新技术更直白的看到变化,更方便学习
    2021-06-06
  • 利用Java设置Word文本框中的文字旋转方向的实现方法

    利用Java设置Word文本框中的文字旋转方向的实现方法

    Word文档中可添加文本框,并设置文本框为横向文本排列或是纵向文本排列,或者设置文本框中的文字旋转方向等.通过Java程序代码,也可以实现以上文本框的操作.下面以Java代码示例展示具体的实现步骤.另外,可参考C#及VB.NET代码的实现方法,需要的朋友可以参考下
    2021-06-06
  • IDEA生成项目maven-tree依赖目录树结构方式

    IDEA生成项目maven-tree依赖目录树结构方式

    这篇文章主要介绍了IDEA生成项目maven-tree依赖目录树结构方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Java自带定时任务ScheduledThreadPoolExecutor实现定时器和延时加载功能

    Java自带定时任务ScheduledThreadPoolExecutor实现定时器和延时加载功能

    今天小编就为大家分享一篇关于Java自带定时任务ScheduledThreadPoolExecutor实现定时器和延时加载功能,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • SpringBoot整合OpenApi的实践

    SpringBoot整合OpenApi的实践

    本文主要介绍了SpringBoot整合OpenApi,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 在Spring Boot中集成RabbitMQ详细步骤(最新推荐)

    在Spring Boot中集成RabbitMQ详细步骤(最新推荐)

    本文将介绍如何在Spring Boot项目中集成RabbitMQ,实现生产者和消费者的基本配置,本文分步骤给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-12-12
  • 详解JavaWeb如何实现文件上传和下载功能

    详解JavaWeb如何实现文件上传和下载功能

    这篇文章主要介绍了如何利用JavaWeb实现文件的上传和下载功能,文中的示例代码讲解详细,对我们的学习或工作有一定的帮助,感兴趣的小伙伴可以学习一下
    2021-12-12
  • 自定义feignClient的常见坑及解决

    自定义feignClient的常见坑及解决

    这篇文章主要介绍了自定义feignClient的常见坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Hibernate初体验及简单错误排除代码详解

    Hibernate初体验及简单错误排除代码详解

    这篇文章主要介绍了Hibernate初体验及简单错误排除代码详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • java中使用dom4j解析XML文件的方法教程

    java中使用dom4j解析XML文件的方法教程

    在最近的开发中用到了dom4j来解析xml文件,所以便有了这篇文章,本文主要给大家介绍了关于java中使用dom4j解析XML文件的方法教程,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-09-09

最新评论