JavaWeb分页条件查询参数特殊字符处理
问题背景
在项目开发过程中,基本都会有列表条件查询,例如用户管理会有通过用户姓名模糊查询用户,课程管理会有课程名称模糊查询课程等等。
而查询过程中如果用户在界面上输入一些特殊字符,例如:%_等等,这时可以发现最终生成的SQL大致如下:
select * from t_user where name like '%%%'
select * from t_user where name like '%_%'
这样就会导致将用户表的所有数据都查询出来,这显然不是用户想看到的结果,用户的本意只是想找名字叫%的人,而由于这些字符因为在数据库(Mysql等)中有着特殊含义,
%表示任意字符,_表示任意一个字符,所有导致了这样的结果。
如何解决
很容易想到的解决方案就是在生成SQL的时候对这些个字符进行转义,让数据库将这些字符当作普通的字符串来处理,而不是字符通配符。
例如如果是使用mybatisplus可以这样写:
LambdaQueryWrapper<User> queryWrapper = Wrappers.lambdaQuery(User.class)//使用对用户姓名里面的%_\进行替换.like(StringUtils.isNotBlank(qo.getName()), User::getName, replaceStr(qo.getName()));private String replaceStr(String str) {if (str != null && !"".equals(str)) {str = str.replaceAll("\\\\", "\\\\\\\\").replace("_", "\\_").replace("\'", "\\'").replace("%", "\\%").replace("*", "\\*");}return str;}
这样如果输入的name=%,最终生成的SQL如下:
select * from t_user where name like '%\%%'
这里的\%就会当作普通的字符串进行条件匹配,如果有name里面含有%就会被查询出来,满足了用户的期望。
但是,一个系统中这样的条件查询肯定不止一个,会有几十、几百个,每一个都这样处理会显得很麻烦,那有什么办法可以统一处理吗?
当然是有的,咱们不是有AOP嘛,对所有分页查询的入参做个拦截,对这些个特殊字符进行处理,然后再去调用接口就可以了,可以这样处理:
/*** 统一处理列表分页条件查询的入参的特殊字符* 再Mysql查询中有%_\三个特殊字符* %:代表通配符任意字符* _: 代表任意一个字符* \: 在Java代码中需要四个\\\\才能查出数据库中一个\***/
@Component
@Aspect
public class QueryRequestAspect {/*** 定义切面,根据自己的情况定义* 所有controller下面所有page开头的接口*/@Pointcut(value = "execution(* com.xxx.xxx.controller..*.page*(..))")private void queryPointCut() {}//可以使用Before类型的通知、也可以使用Around类型通知@SneakyThrows@Before(value = "queryPointCut()")public void process(JoinPoint joinPoint) {Object[] args = joinPoint.getArgs();if (args != null && args.length != 0) {//对入参进行处理for (int i = 0; i < args.length; i++) {Field[] declaredFields = args[i].getClass().getDeclaredFields();for (Field declaredField : declaredFields) {declaredField.setAccessible(true);Object o = declaredField.get(args[i]);if (o instanceof String) {declaredField.set(args[i], replaceStr((String) o));}}}}}private String replaceStr(String str) {if (str != null && !"".equals(str)) {str = str.replaceAll("\\\\", "\\\\\\\\").replace("_", "\\_").replace("\'", "\\'").replace("%", "\\%").replace("*", "\\*");}return str;}}
这样通过这个QueryRequestAspect 切面就可以统一处理分页查询的条件入参了。
参考资料:
Java查询Mysql数据库时,查询条件带特殊字符(\ % ‘ * _)的处理方式_查询数据库字段包含某特殊字符_weixin_43828846的博客-CSDN博客
SpringBoot AOP拦截、修改请求参数_aop 修改参数值_HouXinLin_CSDN的博客-CSDN博客
相关文章:
JavaWeb分页条件查询参数特殊字符处理
问题背景 在项目开发过程中,基本都会有列表条件查询,例如用户管理会有通过用户姓名模糊查询用户,课程管理会有课程名称模糊查询课程等等。 而查询过程中如果用户在界面上输入一些特殊字符,例如:%_等等,这…...
ubuntu18服务安装
一、JDK安装 将jdk解压缩到该目录 /opt/ sudo tar -zxvf jdk-8u261-linux-x64.tar.gz -C /opt/ #重命名 cd /opt sudo mv jdk-8u261-linux-x64 jdk_8 修改环境变量 sudo vi ~/.bashrc #在文件最后追加以下文本 #进入编辑器后输入以下指令: #1. G //将光标移到最后一…...
这些使用工具大推荐,现在知道不晚
1.Snip Snip是一款截图软件,它突出的优点就是可以制作滚动截图。 例如:对整个网页进行截图,使用Snip即可轻松获取,无需处理水印。 2.Sleep Cycle 快节奏、高压力的生活导致我们越来越晚睡觉,睡眠质量越来越差。 想提…...
【Java|golang】1048. 最长字符串链
给出一个单词数组 words ,其中每个单词都由小写英文字母组成。 如果我们可以 不改变其他字符的顺序 ,在 wordA 的任何地方添加 恰好一个 字母使其变成 wordB ,那么我们认为 wordA 是 wordB 的 前身 。 例如,“abc” 是 “abac”…...
Hive基础和使用详解
文章目录 一、启动hive1. hive启动的前置条件2. 启动方式一: hive命令3. 方式二:使用jdbc连接hive 二、Hive常用交互命令1. hive -help 命令2. hive -e 命令3. hive -f 命令4. 退出hive窗口5. 在hive窗口中执行dfs -ls /; 三、Hive语法1.DDL语句1.1 创建数据库1.2 两…...
c/c++:栈帧,传值,传址,实参传值给形参,传地址指针给形参
c/c:栈帧,传值,传址,实参传值给形参,传地址指针给形参 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,此时学会c的话, 我所知道的周边的会c的同学&…...
玩元宇宙血亏后 蓝色光标梭哈AI也挺悬
蓝色光标2022年年度报告出炉,巨亏21.75 亿元,其中20.38亿亏损因商誉、无形资产及其他资产减值造成,而在实际亏损业务中,元宇宙占比不小。 蓝色光标在元宇宙领域的布局,主要通过三家子公司实施,分别为蓝色宇…...
生物---英文
标题 前言必学场景词汇及用法鸟类昆虫类哺乳类爬行类情境常用单词鸟类虫类哺乳类两栖类与爬行类分类与动物相关的习语前言 加油 必学场景词汇及用法 鸟类 1bird [b[插图]d] n.鸟bird’s-eye-view[ˈb[插图]dzaɪˌvju]adj.鸟瞰图的a bird’s-eye view鸟瞰a flock of bird…...
ENVI 国产高分2号(GF-2)卫星数据辐射定标 大气校正 影像融合
1.数据 高分2号卫星数据,包含: MSS-1\2多光谱数据,4m分辨率; Pan-1\2全色波段数据,0.8m分辨率。 2.处理软件 ENVI5.3 国产插件下载地址:ENVI App Store (geoscene.cn) 首先下载插件文件; …...
操作系统考试复习——第二章 进程控制 同步与互斥
进程控制一般是由OS中的原语来实现的。 大多数OS内核都包含了两大方面的功能: 1.支撑功能:1)中断处理 2)时钟管理 3)原语操作(原语操作就是原子操作。所谓原子操作就是一个操作中所有动作要不全做要不全不做) 2.资源管理功能:1)进程管理…...
mac gitstats查看git提交记录
一、介绍: 进一步来讲,Gitstats它是一个git仓库分析软件,它可以检查仓库并生成历史数据的统计信息。可以帮助你查看git仓库的提交状态,根据不同维度分析计算,并自动生成数据图表。 官网介绍:http://gitst…...
电脑系统错误怎么办?您可以看看这5个方法!
案例:电脑出现系统错误该如何解决? 【这几天长时间使用我的电脑,导致它的系统出现了错误。有没有小伙伴知道如何解决电脑系统出错的问题?求一个能快速解决的方法。】 电脑系统出现错误是使用电脑时难免会遇到的问题之一…...
九款顶级AI工具推荐
ChatGPT OpenAI开发的最强对话系统 地址:chat.openai.com ChatGPT能够在同一个会话期间内回答上下文相关的后续问题。其在短时间内引爆全球的原因在于,在网友们晒出的截图中,ChatGPT不仅能流畅地与用户对话,甚至能写诗、撰文、编…...
StringRedisTemplate-基本使用
StringRedisTemplate继承自RedisTemplate,在这里说明一下,当我们使用RedisTemplate往redis中存储java对象的时候,他会顺带着将该java对象的字节码文件也同时存进了内存中,这是为了实现自动反序列化Autowired private StringRedisTemplate red…...
ansible自动运维——ansible使用临时命令通过模块来执行任务
大家好,这里是天亮之前ict,本人网络工程大三在读小学生,拥有锐捷的ie和红帽的ce认证。每天更新一个linux进阶的小知识,希望能提高自己的技术的同时,也可以帮助到大家 另外其它专栏请关注: 锐捷数通实验&…...
python 之数据类型(四)
1、字符串(String) 使用双引号或者单引号中的数据,就是字符串 注:python中使用三引号时允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其它特殊符号 a a c g print(a)运行结果: a c g1、下标 …...
洛谷P1345 无向图最小割点数
题意: 给出一副有 n n n个点, m m m条边的无向图,求出这副图的最小割点数 题意: 首先对于有向图,求他的最小割边,只需要令每条边的容量为 1 1 1,求出起点到终点的最大流就是最小割边数了。 容…...
适合程序员阅读的有用书籍:
几本适合程序员阅读的有用书籍: 1.《计算机程序设计艺术》(The Art of Computer Programming)是由Donald E. Knuth撰写的一系列著作,是计算机科学领域的经典之作。该系列著作共分为三卷,分别介绍了算法和计算机程序设计的基础知识和技巧。 …...
MySQL: 自动添加约束、更改(删除)表名和字段、删除表
目录 自动添加表的属性: 向表内插入数据: 查看表中的数据: 查看表结构: 查看表的详细结构: 更改表名和字段: 更改表名: 更改字段数据类型: 修改字段名: 添加字段…...
基于微博评论的细粒度的虚假信息识别软件
任务 目标:能检测单模态的虚假信息就可以,是个软件就可以 参考文章:基于多模态深度融合的虚假信息检测 Multi-modal deep fusion for false information detection 思路 多模态指的是多种不同类型的数据,比如图像、文本、音频等。虚假信息识别软件可以从这些不同类型的数据…...
嵌入式C++轻量级生命体基类:面向OOP的零开销实体抽象
1. 项目概述life_entity是一个面向嵌入式系统与游戏逻辑建模场景设计的轻量级 C 基类,其核心定位并非通用游戏引擎组件,而是为资源受限环境(如 Cortex-M3/M4 微控制器运行 FreeRTOS 或裸机实时调度器)中实现可继承、可多态、可生命…...
一站式AI应用开发:在PyTorch 2.8环境中集成Dify与Ollama部署大模型
一站式AI应用开发:在PyTorch 2.8环境中集成Dify与Ollama部署大模型 1. 企业级AI开发的新范式 想象一下这样的场景:你的开发团队需要在两周内上线一个智能客服系统,要求能理解专业术语、生成高质量回复,还要能与企业现有系统无缝…...
2.2.2.3 Spark实战:词频统计
本次实战涵盖了Spark词频统计(WordCount)的两种主流实现方式。首先,利用Scala在spark-shell中完成从读取文件、flatMap分词、map映射到reduceByKey聚合的完整流程,并实现结果的降序排序。其次,针对Spark 3.3.2版本的需…...
牙科手术显微镜市场:其中中国市场占比超15%
在口腔诊疗向精细化、微创化演进的进程中,牙科手术显微镜作为核心光学放大设备,凭借其高照度、高景深与高清晰度特性,成为提升根管治疗、牙周手术及种植修复等环节精准性的关键工具。该设备集成连续变倍观察、同轴照明、术野调焦及影像记录系…...
面试题-Mysql篇
什么是存储过程存储过程是一组SQL语句的集合,它们在数据库中预先编译并存储。它们用于封装一组操作,提高性能、减少网络流量,并提供可重用的代码逻辑。存储过程还可以实现数据安全性和数据完整性。mysql如何查询最后一条数据使用ORDER BY根据…...
koanf自定义Provider开发:扩展你的配置源终极指南
koanf自定义Provider开发:扩展你的配置源终极指南 【免费下载链接】koanf Simple, extremely lightweight, extensible, configuration management library for Go. Supports JSON, TOML, YAML, env, command line, file, S3 etc. Alternative to viper. 项目地址…...
我的杭州亲子旅游线路总结(坐船版)
我的杭州亲子旅游线路总结(坐船版) 这是我带娃走过的线路。孩子最近迷恋坐船,我看到新闻说梅花碑有公交船,而且梅花开了很漂亮,就去看看。 这里记录一下行程,说不定以后还去,能做参考。 文中提及…...
IntelliJ IDEA中SVN与Git版本管理的高效配置指南
1. 为什么需要版本管理工具? 如果你曾经因为误删代码而熬夜重写,或者因为团队协作时文件覆盖而崩溃,那你一定需要版本管理工具。想象一下,代码就像写作文时的草稿纸——每次修改都保留历史版本,随时可以回退到上周二下…...
Redis 单线程真的是单线程吗?源码角度全面解析
Redis 是单线程的——这句话流传太广了,以至于很多人真的以为 Redis 就一个线程在跑。但实际上,如果你 ps -ef 或者 top 看一眼正在运行的 Redis 进程,会发现线程数不止一个。 到底怎么回事?这篇文章从源码角度把这个问题彻底说清…...
N_m3u8DL-CLI-SimpleG:让M3U8视频下载变得简单高效的图形化工具
N_m3u8DL-CLI-SimpleG:让M3U8视频下载变得简单高效的图形化工具 【免费下载链接】N_m3u8DL-CLI-SimpleG N_m3u8DL-CLIs simple GUI 项目地址: https://gitcode.com/gh_mirrors/nm3/N_m3u8DL-CLI-SimpleG 在数字内容日益丰富的今天,我们经常遇到需…...
