jdbcTemplate使用变量名的方式替换SQL,实现批量查询和模糊查询

Java SQL注入漏洞深度解析:从原理到实战审计与修复 SQL注入是一种将用户输入数据误当作代码执行的Web安全漏洞,其核心原理在于程序未对用户输入与SQL指令进行有效分离,导致恶意输入能够改变原始查询的语义。在Java开发中,尽管普遍采用了参数化查询等防护手段,但在动态SQL拼接、框架特性误用等场景下,风险依然存在。理解其技术原理,对于构建安全的应用架构至关重要。通过系统性的代码审计,可以主动发现并修复此类漏洞,提升应用自身的安全水位。本文聚焦于Java生态,深入剖析SQL注入的产生机制,并结合MyBatis、JPA等主流框架,详解在参数化查询、动态排序、IN 阅读详情

        在项目中遇到了一种优化场景,既需要条件查询、批量查询,又需要判断进行模糊查询,同时,在某种特殊场景下,会查询大量的数据,在不使用缓存的前提下,针对操作数据库的层级,进行了优化,同时只返回固定数据,减轻数据库的I/O负担。代码如下:

       特别说明:考虑过使用jdbcTemplate拼接SQL后的查询效率和使用Mybatis的方式进行比较,但个人比较喜欢jdbcTemplate的方式,高效且灵活,而且支持的数据量也较大,唯一的遗憾就是拼接SQL时,会占据些些内存,不如Mybatis直接替换灵活。

       这样说起来,就见仁见智了,各位有好的建议欢迎评论。

......        

String sql = "select app_id, name from app where (";
Map<String, Object> params = new HashMap<>();
if(StringUtils.isNotBlank(searchAppName)){
    sql += " name = :name ";
    // 拼接使用,相当于like操作,进行模糊查询
    params.put("name", "%" + searchAppName + "%");
}

if (!userInnerMgr.isLoginUserSuperAdmin()) {
    List<String> appIds = null;

    // 用户是否是超级管理员
    boolean isIsvAdmin = /** 此处是业务代码,判断权限 **/;

    if(!sql.endsWith("(")) {
        sql += " and ";
    }
    if(StringUtils.isNotBlank(isvId)){
        sql += "isv_id = :isvId ";
        params.put("isv", isvId);
    }

    // 普通用户查询自己的权限
    if (!isIsvAdmin && "true".equals(PropertyUtil.getPropertyByKey(DA_ENABLE))) {
        try {
            // 查询自己的权限
            appIds = daService.fetchAuthAppIds(auth, null);

            if(!sql.endsWith("(")) {
                sql += " and ";
            }
            if(StringUtils.isNotBlank(userId)){
                sql += "user_id = :userId ";
                params.put("userId", userId);
            }

            if(sql.endsWith("(")) {
                sql = sql.substring(0, sql.length() - 1);
            } else {
                sql += ")";
            }

            if(null != appIds){
                if(appIds.size() > 0) {
                    // 在in操作后面使用变量名替换,进行批量查询
                    sql += " or  app_id in (:appIds)";
                    params.put("appIds", appIds);
                }
            }
        } catch (Exception e) {
            logger.error("查询权限报错:[{}]", e);
        }
    }
}
if(sql.endsWith("where (")){
    sql = sql.substring(0, sql.indexOf("where ("));
}else{
    if(!sql.endsWith(")")){
        sql += ")";
    }
}

// 至此,拼接SQL完成,并且准备好了每个SQL可能存在的条件及对应的参数


// 重中之重,使用NamedParameterJdbcTemplate,以支持变量名替换的查询方法
NamedParameterJdbcTemplate jdbc = new NamedParameterJdbcTemplate(jdbcTemplate);
List<Map<String, Object>> resultMaps = jdbc.queryForList(sql, params);

......

至此,解决需求。

      最后,说下优化结果,原本查询1W+的数据,耗时2s多点,通过这里的优化,第一次查询耗时0.8s~0.5s,再次查询将控制在0.2s以下,基本在0.1s上下波动,若再辅以缓存食用,口感更佳。

Webgoat平替:PHPStudy搭建SQL注入靶场与多语言防御实战 SQL注入是一种经典的Web安全漏洞,其原理在于攻击者通过构造恶意输入,篡改后端数据库查询语句的逻辑,从而绕过认证、窃取或篡改数据。这项技术的核心价值在于揭示了应用程序层与数据层之间信任边界的重要性,是理解应用安全攻防的基础。在实际开发中,无论是PHP、Java还是ASP.NET Core项目,如果未对用户输入进行有效过滤和参数化处理,都可能成为攻击面。本文聚焦于通过PHPStudy快速搭建轻量级SQL注入学习环境,手动复现包括万能密码、联合查询在内的经典攻击手法,并横向对比了不同技术栈下的漏洞代码与修复方 阅读详情

相关推荐

Apache ShardingSphere 数据脱敏 Java API 配置实战指南

数据脱敏是数据安全领域的一项关键技术,旨在保护敏感信息免遭未授权访问。其核心原理是在数据存储、传输或展示过程中,通过替换、屏蔽或加密等手段,将原始敏感数据转换为无法识别个人身份或商业价值的形式,同时确保数据在授权场景下仍可用于业务处理。这项技术的价值在于,它能在不牺牲数据可用性的前提下,满足日益严格的隐私法规(如GDPR、个人信息保护法)要求,有效防范数据泄露风险。在金融、医疗、电商等涉及大量用户隐私数据的应用场景中,数据脱敏已成为系统设计的标配。Apache ShardingSphere 作为一款流行的分

weixin_34380948的博客 389

Spring JdbcTemplate.queryForList()

在本文中,我们将学习使用方法。queryForList()方法执行给定的 SQL 并返回结果List对象。queryForList()方法通过以下方式接受参数。执行给定的静态查询并返回一个列表。它使用 JDBC Statement语句,而不是 PreparedStatement。结果列表包含映射。一个映射实例表示一行,其中映射键是列名,映射值是列值。执行给定的静态查询并返回一个列表。它使用 JDBC Statement语句,而不是PreparedStatement。

allway2的博客 1万+

代号OneNET02 STM32+ESP8266 WIFI系列-第2节-STM32单片机通过ESP8266连接WIFI访问OneNET OTA服务器实现SOTA远程程序升级

第2节-STM32单片机通过ESP8266连接WIFI访问OneNET OTA服务器实现SOTA远程程序升级,这一节主要是实现通过OneNET OTA服务器将需要更新的程序远程下载到STM32单片机,这一节主要是引导程序和应用程序的讲解。

weixin_44862509的博客 1906

JdbcTemplate.queryForList(sql)产生的漏洞问题修复

JdbcTemplate.queryForList(sql)产生的漏洞问题修复 1、在一些遗留项目中使用的是JdbcTemplate.queryForList(sql)语句来查询数据,JdbcTemplate是Spring框架封装的数据库查询工具类,连接池也是安全的。但是在持续集成的时候扫描出了漏洞,一查才发现是String sql 是使用的+=“”来拼接的。这样产生了sql注入的漏洞。 ...

qq_43732387的博客 3963

基于yolo11的BGA图像目标检测

15.YOLOv8的n/s版本(如YOLOv8n-1280),或通过TensorRT量化压缩模型。3.使用自适应batch_size(如根据GPU显存动态调整),推荐16-32。为采集分辨率整数倍(如原图2592×1944,训练时缩放为640×480),保持宽高比。14.采用余弦退火学习率(cos_lr)和早停(patience=50),防止过拟合。1.模型标注后,少量标注全部人工校验,大量数据抽检,部分人工检验。13.部署模型后持续收集困难样本(如模棱两可的预测结果),定期迭代更新模型。

qq_47798402的博客 1206

算法面试准备 - 手撕系列第五期 - 单头注意力机制(包括Self_atten和Cross_atten)

算法面试准备 - 手撕系列第五期 - 单头注意力机制(包括Self_atten和Cross_atten)

m0_62030579的博客 3609

JdbcTemplate like模糊查询

正确方法: List<Object> queryList = new ArrayList<>(); if (!param1.equals("")) { sql += " and param1 like ? "; queryList.add("%" + param1 + "%"); } return getJdb

1511

【论文翻译】VIT:An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale

VIT摘要介绍相关工作模型VISION TRANSFORMER (VIT)微调和高分辨率实验结论 摘要 虽然Transformer架构在自然语言处理任务中已经成为事实标准,但是它在计算机视觉领域的应用仍然受限。在视觉领域,注意力要么和卷积网络结合使用,要么替换卷积网络中的某些部分,同时保持整体结构不变。本文表明对CNNs的依赖不是必要的,纯转换器(pure transformer)直接应用于图像块(image patches)序列在图像分类任务中能发挥很好的作用。当对大量数据进行预训练并把它转移到多个中型或

栗子菜菜 1846

JdbcTemplate使用SQL语句查询

Class:package com.jdsy.crscal.oper.service;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;i

kevin_w_l的专栏 3235

当爬虫遇到TikTok滑块:一份给开发者的verifyV2避坑指南与调试心得

本文详细解析了TikTok滑块验证码verifyV2的破解与优化策略,涵盖验证码触发机制、滑块图片获取、验证请求构造及高级调试技巧。通过实战案例和代码示例,帮助开发者有效应对复杂反爬机制,提升验证通过率。特别针对verifyV2系统的加密算法和轨迹模拟提供了专业解决方案。

weixin_30919429的博客 642

Oracle 11g RAC 节点通信故障排查与修复指南

本文详细介绍了Oracle 11g RAC集群发生节点通信故障时的系统性排查与修复方法。当出现节点异常重启时,核心问题往往源于心跳网络中断。文章提供了从快速诊断、日志分析到六层深度检查的完整指南,并给出了针对网络配置、内核参数及Oracle已知Bug等常见根因的实战解决方案,帮助DBA快速恢复集群稳定。

weixin_29246195的博客 281

jdbcTemplate 模糊查找 和 in

在JdbcTemplate中使用模糊查找like的时候  如果sql = "..... LIKE %?% " 是不可以的 直接用 sql="...like ? " jdbcTemplate.query(sql, new Object[]{"%abc%"})就可以过去 另外在IN中直接使用 in(?)或者in ? 那种都不行

chenjafo的博客 5902

Potplayer + LAVFilters + madVR 配置教程

文章目录Potplayer + LAVFilters + madVR 配置教程工具安装篇设置调教1.potplayer播放器设置加载LAVFilters和madVR1.选择“源滤镜/分离器”选项,选择“滤镜/解码器管理”2.“添加外部滤镜”3.浏览到刚才LAVFilters解压的文件夹,分别添加图示项。4.添加后回到管理界面设置,点击左边的”LAV AudioDecoder”,将右边”音频解码器”...

re 16万+

建立mysql模板和以中文作为参数进行模糊查询的问题

建立mysql模板和以中文作为参数进行模糊查询的问题 1. 为什么要建立mysql模板 因为有时候我们并不知道这次的sql查询语句需要多少个参数 有可能是select * fom tab where id = ?,也有可能是select * fom tab where id = ? and name = ? 那么建立模板是为了做一个通用的写法,方便即使在不同查询情况下一条函数就可搞定 2. 假如现...

阿福呀 290

以太网GMAC-RK3568

第 2 章和第 3 章中针对 RMII/RGMII 接口芯片和 USB 以太网两种类型芯片在 SDK 上的配置做详细的描述,第 4 章介绍以太网在 Android 上的相关调用接口。第 5 章提供常见问题的排查建议由于在 RK 系列的 SoC 中内置了以太网 MAC 控制器,所以只需要搭配一颗以太网 PHY 芯片,即可实现以太网卡功能按照规范,即使是不同厂家的 PHY,仍然有一部分寄存器的定义是通用的,只要配置了这些通用的寄存器,基本上 PHY 就可以正常工作代码位置在。

qq_24093081的博客 1943

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【spring框架】JdbcTemplate

1 前言 JdbcTemplate 对 jdbc 进行了封装,是一个小型的轻量级持久层框架 需要导入的 jar 包如下,其中最后三个包是JdbcTemplate 所需的 jar 包。

little_fat_sheep 851

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

关于Spring中jdbc的模糊查询

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34014555的博客 664

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

mybatis模糊查询防止sql注入

SQL注入,大家都不陌生,是一种常见的攻击方式。攻击者在界面的表单信息或URL上输入一些奇怪的SQL片段(例如“or ‘1’=’1’”这样的语句),有可能入侵参数检验不足的应用程序。所以,在我们的应用中需要做一些工作,来防备这样的攻击方式。在一些安全性要求很高的应用中(比如银行软件),经常使用将SQL语句全部替换为存储过程这样的方式,来防止SQL注入。这当然是一种很安全的方式,但我们平时开发中,可...

男人放得下自己的高傲,才能撑得起自己的野心 732

Spring JPA 动态 SQL 越写越乱?无需迁移 MyBatis,这套轻量方案彻底根治

本文针对Spring JPA/Hibernate项目在复杂动态SQL查询中的痛点,提出了一套轻量级解决方案。传统JPA项目在简单CRUD场景表现优异,但面对多条件筛选、分页查询等复杂场景时,原生拼接SQL的方式会导致代码混乱、可维护性差。文章分析了两种常见的烂写法(业务层拼接JPQL和退回JdbcTemplate)的缺陷,包括SQL逻辑碎片化、参数维护困难等问题。 提出的解决方案采用模板化动态SQL,通过类JS风格的SQL模板脚本将动态条件、空值判断等逻辑封装,保持SQL完整可读。核心优势包括:零侵入原有架

IT枫斗者的博客 166

Hibernate与MyBatis框架下SQL注入风险深度解析与防御实战

SQL注入作为Web安全领域的经典漏洞,其核心原理在于攻击者通过构造恶意输入,使应用程序将非预期的SQL指令拼接到查询语句中执行。参数化查询是防御SQL注入的根本技术,它通过预编译机制将用户输入严格区分为数据而非代码。在Java企业级开发中,ORM框架如Hibernate和MyBatis极大地提升了数据库操作效率,但若使用不当,其动态查询特性反而会引入注入风险。例如,Hibernate中直接拼接HQL语句,或MyBatis错误使用${}进行字符串替换,都可能导致严重的安全漏洞。本文聚焦于【HQL注入】和【$

weixin_34218579的博客 358

SimpleDAO 实战解析:特性、优势与主流持久框架全方位对比

在 Java 后端开发中,持久层框架是项目基石。Hibernate/JPA 全系ORM框架MyBatis 及衍生生态原生 Spring Jdbc。而SimpleDAO是一套基于 Spring Jdbc 深度封装、面向实战的轻量级持久层框架,既补齐了原生JDBC样板代码多的短板,又规避了ORM、MyBatis 的各类痛点。本文抛开范式理论,从实际使用特性、编码体验、场景适配出发,全面梳理 SimpleDAO 的核心能力,并与三大主流框架做横向对比,帮助开发者清晰认知选型差异。SimpleDAO 精准定位。

gzz_gzz的博客 431

Java SQL注入审计实战:从代码扫描到业务风险深度挖掘

SQL注入作为Web安全领域的经典漏洞,其本质在于应用程序未能正确区分数据与指令的边界,导致用户输入被解释为可执行的SQL代码。其攻击原理是通过构造恶意输入,篡改原始SQL语句的逻辑结构,从而绕过身份验证、窃取敏感数据甚至控制数据库服务器。在Java企业级应用中,这一问题的技术价值尤为突出,它不仅考验着开发者的安全编码能力,更是衡量整个应用数据交互层安全水位的关键指标。随着Spring、MyBatis、JPA等主流框架的普及,漏洞形态从显式的字符串拼接演变为更隐蔽的框架特性误用(如MyBatis的${}拼接

fanjava 414

ShardingJDBC数据加密实战:从原理到配置、迁移与踩坑全解析

数据加密是保障敏感信息安全的基石,尤其在等保合规与数据安全改造中,如何实现透明加密成为焦点。透明数据加密(TDE)虽能防物理泄露,却难挡数据库账号泄露引发的拖库风险。ShardingJDBC作为增强型JDBC驱动,在应用与数据库之间完成SQL解析与改写,实现字段级透明加密:业务代码操作明文,数据库存储密文,无需改动现有逻辑。其核心价值在于与分库分表、读写分离协同,支持AES等算法,并可通过明文列与密文列共存实现存量数据平滑迁移。实际应用中需关注辅助查询列、模糊查询列的性能代价以及密钥管理。本文从工程视角完整

weixin_34392435的博客 241

MyBatis-Plus条件构造器深度解析:从Lambda表达式到动态SQL实战

在Java后端开发中,ORM框架是连接应用与数据库的核心组件,它通过对象关系映射原理,将面向对象的操作转换为SQL语句,极大地提升了开发效率与代码安全性。MyBatis-Plus作为MyBatis的增强工具,其核心价值在于提供了强大的条件构造器,允许开发者以类型安全、符合Java编程习惯的链式API来动态构建查询与更新逻辑,从而告别繁琐的SQL字符串拼接。这一特性在构建后台管理系统、数据报表等需要复杂动态筛选的应用场景时尤为关键。本文将聚焦于**Lambda表达式**和**动态SQL**这两个核心热词,深入

weixin_30855761的博客 389
上一篇: expected single matching bean but found 2: onedbJdbcTemplate,twodbJdbcTemplate
下一篇: 基于消费者生产者模型,使用线程池控制发送HTTP请求的定时器
CCCAAAAFFFFF
博客等级 码龄10年 5粉丝 27原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值