返回顶部
首页 > 资讯 > 数据库 >Mysql 字段模糊查询,在页面中输入%查询全部的问题处理
  • 393
分享到

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

mysqlmybatisjava后端 2023-08-20 17:08:00 393人浏览 薄情痞子
摘要

一、背景   测试小妹闲着无聊,针对某一个查询项进行“%”测试,正常查询效果应该是返回空数据,但是却查出所有的数据。 二、解决方案 1、在使用mybatis的模糊查询时,有两个特殊符号需要注意: %(百分号):相当于任意多个字符; _(下划

一、背景

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

二、解决方案

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

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

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

2、处理方法:

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

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

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

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

like concat(’%’,#{param},’%’) 、like ‘%${param}%’ 、 like ‘%’||#{param}||’%'是一个意思;

3、转译工具
public class EscapeUtil {        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 :用于标注在方法上
@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Annotation {    boolean isTrue() default true;}
2、EncryptField 注解:用于标注在模糊查询字段上
@Target({ElementType.FIELD,ElementType.PARAMETER})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @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;@Component@Aspectpublic 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{@EncryptFieldprivate String name;}2、查询方法加上@Annotation注解@Annotationpublic PageInfo<UserVo> selectUserPage(User user) {}3、在Mapper文件需要如下编码<!-- 姓名 --><if test="name !=null and name !='' and name !='null'">      NAME LIKE CONCAT('%',CONCAT(#{condition.name},'%')) escape '/'</if>

来源地址:https://blog.csdn.net/Amber_1/article/details/129835607

您可能感兴趣的文档:

--结束END--

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

本文链接: https://lsjlt.com/news/376567.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作