Mysql 字段模糊查询,在页面中输入%查询全部的问题处理

这篇具有很好参考价值的文章主要介绍了Mysql 字段模糊查询,在页面中输入%查询全部的问题处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、背景

  测试小妹闲着无聊,针对某一个查询项进行“%”测试,正常查询效果应该是返回空数据,但是却查出所有的数据。

二、解决方案
1、在使用mybatis的模糊查询时,有两个特殊符号需要注意:

%(百分号):相当于任意多个字符;

_(下划线):相当于任意的单个字符;

2、处理方法:

1:(查询条件参数,比如"xx%_x")param.replaceAll(“%”, “/%”).replaceAll(“-”, “/-”)

2:select * from table where column like concat(’%’,#{param},’%’) escape ‘/’;

处理之后百分号%、下划线_在mybatis执行该拼接的sql语句的时候就不会被转义处理了

escape ‘/’ 指用’/'说明后面的%或_就不作为通配符而是普通字符了,注意前面没有转义字符的%仍然起通配符作用

like concat(’%’,#{param},’%’) 、like ‘%${param}%’ 、 like ‘%’||#{param}||’%'是一个意思;文章来源地址https://www.toymoban.com/news/detail-790434.html

3、转译工具类
public class EscapeUtil {
    /**
     * mysql的模糊查询时特殊字符转义(条件查询%或者_查询所有问题)
     */
    public static String escapeChar(String string){
        if(StringUtils.isNotBlank(string)){
            string = string.replaceAll("_", "/_");
            string = string.replaceAll("%", "/%");
        }
        return string.trim() ;
    }
}
三、实战
1、实战一
假设User有一个name字段
此时在查询数据前需要做一次转译
user.setName(EscapeUtil.escapeChar(user.getName()));Mapper文件需要如下编码
<!-- 姓名 -->
<if test="name !=null and name !='' and name !='null'">
      NAME LIKE CONCAT('%',CONCAT(#{condition.name},'%')) escape '/'
</if>
2、实战二:切面、注解
1、Annotation :用于标注在方法上
/**
 * 功能: 处理模糊查询中的特殊符号
 * <p>
 * ──────────────────────────────────────────
 * version  变更日期    修改人    修改说明
 * ------------------------------------------
 * V1.0.0  2023/03/29  CHY      初版
 * ──────────────────────────────────────────
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Annotation {
    boolean isTrue() default true;
}
2、EncryptField 注解:用于标注在模糊查询字段上
/**
 * 功能: 对模糊查询字段进行处理
 * <p>
 * ──────────────────────────────────────────
 * version  变更日期    修改人    修改说明
 * ------------------------------------------
 * V1.0.0  2023/03/29  CHY      初版
 * ──────────────────────────────────────────
 */
@Target({ElementType.FIELD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface EncryptField {
    String [] values() default "";
}
3、MybatisSpecialCharactersAspect:Mybatis特殊字符处理切面
import cn.hutool.core.util.ObjectUtil;
import com.chy.exception.BusinessException;
import com.chy.Interceptor.annotation.Annotation;
import com.chy.Interceptor.annotation.EncryptField;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
 * 功能: Mybatis特殊字符处理切面
 * <p>
 * ──────────────────────────────────────────
 * version  变更日期    修改人    修改说明
 * ------------------------------------------
 * V1.0.0  2023/03/29  CHY      初版
 * ──────────────────────────────────────────
 */
@Component
@Aspect
public class MybatisSpecialCharactersAspect {
    @Pointcut(value = "@annotation(com.chy.Interceptor.annotation.Annotation)")
    public void execyteAspectj() {
    }
    
    @Around(value = "execyteAspectj();")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        Signature signature = joinPoint.getSignature();
        if (!(signature instanceof MethodSignature)) {
            throw new BusinessException("user permission check fail,stop this request!");
        }
        Object proceed;
        MethodSignature methodSignature = (MethodSignature) signature;
        Object target = joinPoint.getTarget();
        Method declaredMethod = target.getClass().getDeclaredMethod(methodSignature.getName(), methodSignature.getParameterTypes());
        Annotation annotation = declaredMethod.getAnnotation(Annotation.class);
        if (ObjectUtil.isNull(annotation) || !annotation.isTrue()) {
            return proceed = joinPoint.proceed();
        } else {

            Object[] args = joinPoint.getArgs();
            for (Object param : args) {
                if (ObjectUtil.isNotEmpty(param)) {
                    Field[] declaredFields = param.getClass().getDeclaredFields();
                    for (Field filed : declaredFields) {
                        boolean annotationPresent = filed.isAnnotationPresent(EncryptField.class);
                        if (annotationPresent) {
                            filed.setAccessible(true);
                            Object o = filed.get(param);
                            if (o == null) {
                                continue;
                            }
                            filed.set(param, o.toString().replaceAll("/", "//").replaceAll("%", "/%").replaceAll("_", "/_"));
                        }
                    }
                }
            }
            proceed = joinPoint.proceed();
        }
        return proceed;
    }
}
4、应用
1、user类的name字段上使用 @EncryptField 注解
class User{
	@EncryptField
	private String name;
}
2、查询方法加上@Annotation注解
@Annotation
public PageInfo<UserVo> selectUserPage(User user) {
}
3、在Mapper文件需要如下编码
<!-- 姓名 -->
<if test="name !=null and name !='' and name !='null'">
      NAME LIKE CONCAT('%',CONCAT(#{condition.name},'%')) escape '/'
</if>

到了这里,关于Mysql 字段模糊查询,在页面中输入%查询全部的问题处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MyBatis-Plus条件构造器[常用的模糊查询、排序查询、逻辑查询和指定字段查询案例]

    Mybatis-Plus知识点[MyBatis+MyBatis-Plus的基础运用]_心态还需努力呀的博客-CSDN博客  Mybatis-Plus+SpringBoot结合运用_心态还需努力呀的博客-CSDN博客 MyBaits-Plus中@TableField和@TableId用法_心态还需努力呀的博客-CSDN博客 MyBatis-Plus中的更新操作(通过id更新和条件更新)_心态还需努力呀的博客

    2024年02月06日
    浏览(86)
  • MySQL两个字段模糊匹配

    今天遇到一个业务需求:两张MySQL表做join,两个关联键是包含关系,SQL该怎么实现。 由于两个关联键是包含关系,那么首先想到的就是like模糊匹配。 通常我们见过的like语法都是类似 a like ‘%aa%’; 那么根据这个思路,我们如何实现两个字段模糊匹配呢? 原始表a: 原始表

    2024年02月10日
    浏览(46)
  • Element UI input输入框实现模糊查询

    Element UI的input输入框进行搜索的时候(根据输入内容提供对应的输入建议)有个坑,它只能用第一个字进行搜索,不能够实现模糊匹配,下面的方法就是填这个坑。 原来搜“奖”,后台给返回数据,但是不会出现下拉框。 例如:  只要搜“抽”才出现下拉框 解决后实现效果

    2024年02月13日
    浏览(33)
  • easyui combobox下拉框组件输入检索全模糊查询

            easyui下拉组件(combobox),输入检索下拉内容,是默认的右模糊匹配,而且不支持选择。因业务要求需要做成全模糊查询,目前网上搜索有两种方案:         1.修改easyui源码,这个得看运气,每个项目easyui版本不相同,文章里提供的源码位置我这个版本没有对

    2024年04月15日
    浏览(43)
  • mysql 国密加密字段排序和模糊搜索

    双写 加密字段和明文分别存到两个字段中 , 查询只对明文进行操作 .  (备注: 这种只是应对检查或者设计的方式 , 对于程序没有实际意义) 使用函数 利用mysql已有加解密的函数 , 在排序和模糊搜索之前解密数据 , 再进行排序或者模糊搜索 . (备注: 查询速度受到很大影响 , 不能

    2024年02月05日
    浏览(42)
  • ElasticSearch nested 字段多关键字搜索,高亮全部匹配关键字的处理

    ElasticSearch 版本号: 6.7.0 用户会传入多个去ES查询 ElasticSearch nested 字段 的多个字段,要求在返回的结果中被搜索的字段需要高亮所有匹配的。例如同时通过 上海 和 策划 ,再 工作经历 的列表中的 工作内容 和 公司名称 中搜索。如果有人员的 工作经历 中

    2024年04月22日
    浏览(56)
  • 如何使用ES做简单的时间条件过滤+模糊查询+精确匹配+关键字排除,查询 elasticsearch查询结果包含或排除某些字段、_source查询出需要的属性名称

    目录 一、时间条件过滤+模糊查询+精确匹配+排除 1. 查询出包含 log_geo 的数据 “wildcard”: { “message”: “log_geo” } 2. 查询某个时间段的数据 3. 条件查询与条件排除数据 4. from 表示起始的记录的ID 5. size 表示显示的记录数 6.sort排序 desc降序、asc升序  7.should查询在mysql中

    2024年01月18日
    浏览(68)
  • MySQL查询条件OR导致模糊查询失效

    起因:查出来的列表数据,通过查询条件过滤,发现过滤条件并不起作用 检查发现:where查询条件里面有or的过滤条件,用来进行权限控制,模糊查询条件本来是起效果的,但是OR的条件一执行,就有多了些数据 代码: 期望的结果:先查出来所有符合要求的,然后再根据过滤

    2024年01月22日
    浏览(44)
  • 趣谈MySQL 多个%等模糊查询

    一、建表并插入数据 1、创建一个people表 2、向people表添加数据 二、查询语句   ------有趣的查询(网页端前端传参%测试)------ 注:mysql 通配符查询必须用 rlike 若本文有帮助到阅读本文的同学,欢迎点赞、关注、收藏,互相学习交流。 

    2024年02月12日
    浏览(43)
  • 个人学习记录——MySQL的模糊查询

    模糊查询实质上是用利用数据库SQL语言的模糊搜索,如‘like’,通配符‘%’,‘_’。 但我后来了解到还有‘[]’和\\\'[^]\\\'的用法,特此记录 1 “%” 表示0个或多个字符 Select * from 表名 where 列名 like \\\'%\\\' //查询出全部数据  Select * from 表名 where 列名 like \\\'x\\\' //完全匹配 Select * fro

    2024年02月09日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包