您好,登录后才能下订单哦!
这篇文章主要讲解了“如何解决MyBatis中模糊搜索使用like匹配带%字符时失效问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何解决MyBatis中模糊搜索使用like匹配带%字符时失效问题”吧!
1.问题背景
2.解决方法
2.1.在入参SearchVo上进行特殊符号relpace转换
2.2.使用ESCAPE
2.3.总结
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执行解析器才会把它当成是单个字符进行匹配,否则则会按照匹配两个''字符进行模糊匹配,得出全表搜索的错误结果。
使用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("_", "\\\\_"); } }
使用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("_", "/_"); } }
感谢各位的阅读,以上就是“如何解决MyBatis中模糊搜索使用like匹配带%字符时失效问题”的内容了,经过本文的学习后,相信大家对如何解决MyBatis中模糊搜索使用like匹配带%字符时失效问题这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。