预编译SQL
预编译SQL
预编译SQL是指在数据库应用程序中,SQL语句在执行之前已经通过某种机制(如预编译器)进行了解析、优化和准备
,使得实际执行时可以直接使用
优化后的执行计划,而不需要每次都重新解析和编译
。这么说可能有一些抽象,那么让我们结合具体的代码进行讲解。
我们先来看两个JDBC代码,这是第一个:
String sql = "select id, username, password, name, age from user where username = 'liubei' and password = '123456' "
statement.executeQuery(sql);
这个代码完成了一个DQL语句,可以从user
表中查找username
为liubei
,password
为123456
的用户。看起来这个SQL语句和代码都十分简单。因为这个代码中的SQL语句是一个静态SQL(参数硬编码
),直接将查询的条件硬编码
在了SQL语句中,可以直接使用Statement
类发起查询。
我们来看第二个代码:
// 编写SQL语句
String sql = "select id, username, password, name, age from user where username = ? and password = ?";
// 使用PreparedStatement对象创建预编译SQL
PreparedStatement statement = connection.prepareStatement(sql);
// 预编译SQL的两个参数都是String类型的,所以说使用setString方法补全其参数
statement.setString(1, "liubei");
statement.setString(2, "123456");
// 调用executeQuery方法发起一条DQL语句,并将查询结果封装到ResultSet类中
ResultSet resultSet = statement.executeQuery();
这个代码和上一个代码查找的效果、实现的功能是一模一样的,但是明显要复杂更多。其主要原因是因为这个代码中的SQL语句是一个预编译SQL(参数动态传递
),使用?
作为占位符,然后使用setString方法
,为占位符传递参数,最后使用PreparedStatement
类进行查询。在查询时,会将这个预编译的SQL和给占位符传递的参数都传给数据库处理
。这确实比静态SQL麻烦了不少,但是预编译SQL使用十分广泛,并且安全性、性能都比静态SQL更高。
安全性:防止SQL注入
SQL注入:通过控制输入来修改事先定义好的SQL语句
,从而达到执行代码对服务器进行攻击
的方法。客户端经常需要提交一些表单给服务端,通过SQL注入
,在表单中输入特殊的字符
,就可以改变定义好的SQL的意思
,从而攻击服务器。
常见场景:登录
当用户登录时,需要在表单中输入用户名和密码
,然后提交表单给服务端,服务端根据用户提交的用户名和密码在数据库中进行查询
(其本质是一个查询数据库的操作),查看是否用户名和密码相匹配。这个SQL语句其实十分简单:
select * from user where username = 'root' and password = '123456';
假如能够查询到用户信息,那么就说明用户名和密码都正确
,那么就可以登录;反之,用户名和密码至少有一个是错误的
,则登录失败。看似这个SQL是没有什么问题的,但是假如在表单中这么输入呢:
用户名:随便输入,比如我输入一串乱码:498asdasas48das689。
密码:密码的输入就有讲究了,需要输入一些攻击性
的内容:' or '1'='1。
这样输入以后,我们将用户名和密码拼接到SQL中看看是什么内容:
select * from user where username = '498asdasas48das689' and password = '' or '1'='1';
这么一看SQL语句的意思就完全改变了,无论用户名输入什么,都可以登录,因为'1'='1'永远为true
,并且两个条件之间用or
连接,这个查询条件就永远为true
了,也就代表着用户表中的所有数据都是符合查询条件的,所以说就可以登录了。这就是静态SQL的劣势
,十分容易被SQL注入,遭到攻击。然而当使用了预编译的SQL之后,就可以解决这个问题:
预编译SQL是通过参数绑定来解决SQL注入的问题的:
参数绑定
在执行预编译的SQL语句之前,需要为预编译SQL中的每个占位符(?
)提供具体的参数值。这个过程被称为参数绑定。参数绑定的过程确保了参数值以正确的数据类型传递给数据库,并且与SQL语法完全隔离。这意味着即使参数包含恶意构造的内容(如单引号'
或其他特殊字符),它们也不会被解释为SQL代码的一部分,而是作为纯粹的数据处理。
高性能
SQL语句的执行流程
如图所示,一条SQL语句从编写到执行是要经过语法检查
,优化
,编译
三个步骤的,而这三个步骤执行之后,这一条SQL语句就会缓存在内存
中,假如后面需要使用同样的SQL语句,就可以直接从缓存中“拿”即可,无需再次经过这三步
,但是假如有这样三个静态SQL:
delete from user where id = 1;
delete from user where id = 2;
delete from user where id = 3;
这三个SQL极其相似,只是查询的条件略有不同,但是就算这样,也必须经过三次编译,才可以执行
(分别),无法重复使用
,因为这是静态SQL,每次的缓存的SQL内容都是写死了的
,只要条件稍微变动,就必须重新编译。
但是假如使用预编译SQL:
delete from user where id = ?
然后分别传递参数1、2、3
,这样只会在第一次使用SQL进行编译(参数是1),缓存中的内容是delete from user where id = ?
,后面传递参数2、3
......时,预编译的SQL都可以在缓存中找到,可以直接使用,无需编译,极大提高了SQL的性能。
相关文章:
预编译SQL
预编译SQL 预编译SQL是指在数据库应用程序中,SQL语句在执行之前已经通过某种机制(如预编译器)进行了解析、优化和准备,使得实际执行时可以直接使用优化后的执行计划,而不需要每次都重新解析和编译。这么说可能有一些抽…...
学英语学Elasticsearch:04 Elastic integrations 工具箱实现对第三方数据源的采集、存储、可视化,开箱即用
📢📢📢: 先看关键单词,再看英文,最后看中文总结,再回头看一遍英文原文,效果更佳!! 关键词 ingestion 摄取 /ɪnˈdʒɛstʃən/ observability 可观察性 …...
【开源免费】基于Vue和SpringBoot的城镇保障性住房管理系统(附论文)
本文项目编号 T 122 ,文末自助获取源码 \color{red}{T122,文末自助获取源码} T122,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...
HTML和CSS相关的问题,为什么某些元素的字体无法加载?
当你在HTML和CSS中遇到字体无法加载的情况时,通常是由几个常见的问题引起的。以下是一些可能导致字体无法加载的原因,以及如何解决这些问题。 常见原因及解决方法 字体文件路径错误字体格式不兼容缺少字体的font-face声明字体加载顺序问题浏览器缓存问…...
[ Spring ] Install MongoDB on Ubuntu24
文章目录 Disable THP ServiceRemove File and Process Count LimitationEnable Swappiness for MongoDBInstall MongoDBEnable MongoDB ServiceCreate MongoDB Admin UserEnable MongoDB AuthenticationCreate a Normal DatabaseUpdate User RolesInsert DocumentUninstall Mo…...
【Block总结】掩码窗口自注意力 (M-WSA)
摘要 论文链接:https://arxiv.org/pdf/2404.07846 论文标题:Transformer-Based Blind-Spot Network for Self-Supervised Image Denoising Masked Window-Based Self-Attention (M-WSA) 是一种新颖的自注意力机制,旨在解决传统自注意力方法在…...
TensorFlow DAY3: 高阶 API(Keras)
TensorFlow 作为深度学习框架,当然是为了帮助我们更便捷地构建神经网络。所以,本次实验将会了解如何使用 TensorFlow 来构建神经网络,并学会 TensorFlow 构建神经网络的重要函数和方法。 知识点 Keras 顺序模型Keras 函数模型Keras 模型存储…...
【CSS】HTML页面定位CSS - position 属性 relative 、absolute、fixed 、sticky
目录 relative 相对定位 absolute 绝对定位 fixed 固定定位 sticky 粘性定位 position:relative 、absolute、fixed 、sticky (四选一) top:距离上面的像素 bottom:距离底部的像素 left:距离左边的像素…...
Spring中三级缓存详细讲解
1、Spring三级缓存是什么,过程是怎么样的? Spring 中的三级缓存主要用于单例 Bean 的生命周期管理,特别是在循环依赖时,它通过不同阶段暴露 Bean 实例来确保依赖注入的顺利完成。缓存的内容如下: 一级缓存 (singleton…...
美摄科技PC端视频编辑解决方案,为企业打造专属的高效创作平台
在当今这个信息爆炸的时代,视频已成为不可或缺的重要内容形式,美摄科技推出了PC端视频编辑解决方案的私有化部署服务,旨在为企业提供一款量身定制的高效创作平台。 一、全面功能,满足企业多样化需求 美摄科技的PC端视频编辑解决…...
转运机器人在物流仓储行业的优势特点
在智能制造与智慧物流的浪潮中,一款革命性的产品正悄然改变着行业的面貌——富唯智能转运机器人,它以卓越的智能科技与创新的设计理念,引领着物流领域步入一个全新的高效、智能、无人的时代。 一、解放双手,重塑物流生态 富唯智能…...
《探索鸿蒙Next上开发人工智能游戏应用的技术难点》
在科技飞速发展的当下,鸿蒙Next系统为应用开发带来了新的机遇与挑战,开发一款运行在鸿蒙Next上的人工智能游戏应用更是备受关注。以下是在开发过程中可能会遇到的一些技术难点: 鸿蒙Next系统适配性 多设备协同:鸿蒙Next的一大特色…...
25/1/12 算法笔记 剖析Yolov8底层逻辑
YOLOv8 是一种基于深度学习的目标检测和图像分割模型,属于 YOLO(You Only Look Once)系列的最新版本。YOLO 系列模型以其高效的实时目标检测能力而闻名,YOLOv8 在此基础上进行了一些优化和改进。 Yolov8的主要特点: …...
JavaScript,ES6,模块化,大程序文件拆分成小文件再组合起来
模块化 模块化是指将一个大的程序文件,拆分成许多小的文件,然后将小文件组合起来。 模块化的好处 模块化的优势有以下几点:1、防止命名冲突,2、代码复用,3、高维护性。 模块化规范产品,ES6 之前的模块化…...
物联网技术入门
在科技日新月异的今天,物联网(Internet of Things,简称IoT)技术正逐渐渗透到我们生活的方方面面,从智能家居到智慧城市,从工业制造到农业管理,物联网的应用无处不在。那么,什么是物联…...
sequelize-cli 多对多关系处理 及某一单项游戏根据成绩降序排名
一、生成模型 Game(游戏表)GameGrades(游戏成绩表)GameUser(用户表) 1.1 对非中间表 做多对多逻辑处理 Game模型 static associate(models) {// define association heremodels.GameUser.belongsToMany(models.Game, {through: models.GameGrade,fore…...
人工智能训练师 - 练习题三
一、单选题 201、在人工智能当中,图像、语音、手势等 识别被认为是()的层次;而问题求解、 创作、推理预测被认为是()的层次。A.感知智能,认知智能 B.认知智能,认知智能 C.感知智能,感知智能 D.认知智能,感知智能 202…...
【EI 会议征稿通知】第四届航空航天、空气动力学与机电工程国际学术会议(AAME 2025)
2025 4th International Conference on Aerospace, Aerodynamics and Mechatronics Engineering 重要信息 大会官网:www.ic-aame.org/ 大会时间:2025年4月11-13日 大会地点:中国-南昌 接受/拒稿通知:投稿后1周 收录检索&…...
uniApp通过xgplayer(西瓜播放器)接入视频实时监控
🚀 个人简介:某大型国企资深软件开发工程师,信息系统项目管理师、CSDN优质创作者、阿里云专家博主,华为云云享专家,分享前端后端相关技术与工作常见问题~ 💟 作 者:码喽的自我修养ǹ…...
STM32F103的ADC通道映射
ADC通道映射 STM32F103带3个ADC控制器,一共支持23个通道,包括21个外部和2个内部信号源。ADC1控制器最多有18个通道,包括16个外部和2个内部信号源。 ADC1和ADC2的16个外部通道相同,且ADC1和ADC2共用一个系统中断向量,A…...
深入了解OpenStack中的隧道网络
在OpenStack环境中,隧道网络是一项关键技术,它确保了虚拟机之间以及虚拟机与外部网络之间的安全通信。通过隧道机制,我们可以有效地隔离不同租户的流量,并支持多租户环境下的复杂网络需求。之前我们介绍了隧道网络,下面…...
【Rust】函数
目录 思维导图 1. 函数的基本概念 1.1 函数的定义 2. 参数的使用 2.1 单个参数的示例 2.2 多个参数的示例 3. 语句与表达式 3.1 语句与表达式的区别 3.2 示例 4. 带返回值的函数 4.1 返回值的示例 4.2 返回值与表达式 5. 错误处理 5.1 错误示例 思维导图 1. 函数…...
数据结构与算法之链表: LeetCode 19. 删除链表的倒数第 N 个结点 (Ts版)
删除链表的倒数第 N 个结点 https://leetcode.cn/problems/remove-nth-node-from-end-of-list/ 描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示…...
每天五分钟深度学习:神经网络中的激活函数
本文重点 激活函数在神经网络中是必不可以缺少的东西,当我们创建一个神经网络的时候,我们需要决定使用哪种激活函数用在隐藏层上,哪种激活函数用在输出结点上,我们以前的课程中我们使用的都是sigmoid激活函数,除此之外还有其它激活函数。本文我们就介绍一下那些经常使用的…...
腾讯云服务器Centos7.6新开或者迁移中java全部依赖环境准备(jdk+nginx+mysql+redis+nacos+kafka等)
1 安装java环境 https://blog.csdn.net/CleverCode/article/details/109160568 2 安装nginx ssl只用配置nacos和网关就可以了。 https://blog.csdn.net/CleverCode/article/details/145078807 3 安装mysql https://blog.csdn.net/CleverCode/article/details/128354479 4…...
半导体数据分析: 玩转WM-811K Wafermap 数据集(三) AI 机器学习
前面我们已经通过两篇文章,一起熟悉了WM-811K Wafermap 数据集,并对其中的一些数据进行了调用,生成了一些统计信息和图片。今天我们接着继续往前走。 半导体数据分析: 玩转WM-811K Wafermap 数据集(二) AI…...
逐笔成交逐笔委托Level2高频数据下载和分析:20250102
level2逐笔成交逐笔委托下载 链接: https://pan.baidu.com/s/1p7OOj5p-QGFrWkt6KKoYng?pwd7f4g 提取码: 7f4g Level2逐笔成交逐笔委托数据分享下载 通过Level2逐笔成交和逐笔委托这种每一笔的毫秒级别的数据可以分析出很多有用的点,包括主力意图,虚假动…...
python3GUI--大屏可视化-XX产业大数据指挥舱(附下载地址) By:PyQt5
文章目录 一.前言二.预览三.软件开发心得1.使用方法2.UI设计3.代码架构4.项目结构 四.代码片段分享1.图片平滑缩放组件2.滚动日志组件 五.心得体会 大小:35.0 M,软件安装包放在了这里! 本软件未…...
PHP 循环控制结构深度剖析:从基础到实战应用
PHP 循环控制结构深度剖析:从基础到实战应用 PHP提供了多种控制结构,其中循环控制结构是最常见的结构之一。它们使得我们能够高效地重复执行一段代码,直到满足某个条件为止。本文将从PHP循环的基础知识出发,逐步分析其在实际项目…...
【数据库】二、关系数据库
文章目录 二、关系数据库1 关系2 关系数据库3 完整性约束4 关系运算 二、关系数据库 1 关系 域:一组具有相同数据类型的值的集合。 笛卡尔积:所有域(域可相同)中所有取值的组合 例如:D1{1,2,3},D2{A,b}&…...
【cuda学习日记】2.2 使用2维网络(grid)和2维块(block)对矩阵进行求和
在2.0中进行了用一维网格和块对一维向量进行了求和。 在2.1中例化了二维的网格和块。 接下来进行2维网络(grid)和2维块(block)对矩阵进行求和。 #include <stdio.h> #include <stdlib.h> #include <time.h> #i…...
【13】制作镜像以及重启实例
制作镜像 k8s集群 有两个镜像需要制作,一个是master节点,一个是node节点。 在master节点上成功部署了k8s的控制平面,在node节点上部署了worker节点的配置,不知道打包镜像重启之后集群的状态是什么样的。 确认集群在运行&#…...
省级-农业科技创新(农业科技专利)数据(2010-2022年)-社科数据
省级-农业科技创新(农业科技专利)数据(2010-2022年)-社科数据https://download.csdn.net/download/paofuluolijiang/90028570 https://download.csdn.net/download/paofuluolijiang/90028570 数据 年份、省份、农业科技专利数量…...
Vue2+OpenLayers接入天地图API实现搜索定位和点击获取经纬度及地址功能(提供Gitee源码)
目录 一、案例截图 二、安装OpenLayers库 三、安装Element-UI 四、完整代码 五、天地图地名搜索API文档 六、Gitee源码 一、案例截图 输入框搜索需要查询的大概地址,可以获取到经纬度和地址信息。 二、安装OpenLayers库 npm install ol 三、安装Element-UI…...
CrossFormer实战:使用CrossFormer实现图像分类任务(一)
摘要 CrossFormer是一种新型的视觉Transformer架构,旨在通过引入跨尺度注意力机制来提升计算机视觉任务的性能。该模型特别关注不同尺度特征之间的交互,解决了现有视觉Transformer在处理多尺度特征时的不足。 研究背景 在计算机视觉中,特征…...
性能测试工具Jmeter中的FTP脚本开发
FTP文件传输协议是TCP/IP协议组织中的常用协议之一,主要用在internet上双向传输文件。FTP协议具有客户端和服务器端两个部分组成部分,具有上传与下载两种功能。Jmeter也提供了FTP请求的测试支持,实现了上传和下载功能测试。 对于上图的FTP请求…...
探索微软 M365 安全:全方位守护数字世界
在当今这个科技呈井喷式飞速发展,数字化浪潮以汹涌澎湃、锐不可当之势席卷全球的时代,企业与个人仿若置身于一片浩瀚无垠、信息奔涌的海洋之中,尽情畅享着技术革新所带来的无穷无尽便利。然而,恰如平静海面下潜藏着暗礁与汹涌暗流,网络安全问题恰似隐匿在暗处、随时可能给…...
Qt C++读写NFC标签NDEF网址URI
本示例使用的发卡器:https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.1d292c1biFgjSs&ftt&id615391857885 #include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> #include "QLibrary" …...
[SMARTFORMS] 自定义SMARTFORMS表单页格式
在SMARTFORMS表单开发过程中,用户打印的纸张有可能不是标准的页格式,需要我自定义页格式 具体操作步骤如下所示 1.定义页格式 事务码SPAD,点击"完全管理" 点击"设备类型"中的页格式的"显示"按钮 点击创建按…...
大模型笔记:KV cache
1 为什么要使用KV cache 假设模型最终生成了四个token 对于第一个token,他的attention的计算方法为: 有了第一个token之后,生成第二个token的时候: sottmaxed表示已经逐行softmax后的结果同理,对于第三个token&…...
Android车机DIY开发之学习篇(三)替换Logo以正点原子为例
Android车机DIY开发之学习篇(三)替换Logo以正点原子为例 启动 logo 包括 u-boot 阶段 logo 内核阶段 logo /sdk/kernel-5.10 目录下替换 logo.bmp 654270 logo_kernel.bmp 654270 编译 Linux 内核...
宝塔面板 php8.0 安装 fileinfo 拓展失败
系统:Albaba Cloud Linux release 3 (OpenAnolis Editon)即 Centos 平替 异常提示: cc: fatal error: ** signal terminated program cc1 compilation terminated. make: *** [Makefile:211: libmagic/apprentice.lo] Error 1搜…...
机器学习数据预处理preprocessing
预处理方法预处理方法预处理方法BinarizerFunctionTransformerKBinsDiscretizerKernelCentererLabelBinarizerLabelEncoderMaxAbsScalerMinMaxScalerMultiLabelBinarizer sklearn.preprocessing.Binarizer 设定一个阈值(threshold),对于每个…...
网络安全 | 什么是Bot防护?
关注:CodingTechWork Bot防护介绍 随着互联网服务的普及和发展,越来越多的网站和应用遭遇了自动化攻击(Bot攻击)。Bot防护是一种安全技术,旨在检测和阻止自动化程序(即“机器人”或“bot”)对网…...
Qt学习笔记第81到90讲
第81讲 串口调试助手实现自动发送 为这个名叫“定时发送”的QCheckBox编写槽函数。 想要做出定时发送的效果,必须引入QT框架下的毫秒级定时器QTimer,查阅手册了解详情。 在widget.h内添加新的私有成员变量: QTimer *timer; 在widget类的构造…...
如何在本地部署大模型并实现接口访问( Llama3、Qwen、DeepSeek等)
如何在本地部署大模型并实现接口访问( Llama3、Qwen、DeepSeek等) 如何在本地部署大模型并实现接口访问( Llama3、Qwen、DeepSeek等)模型地址模型下载模型部署指定显卡运行app.py 运行环境requirements 调用接口代码调用 结语 如何…...
使用 Linux tracepoint、perf 和 eBPF 跟踪数据包
大家读完觉得有帮助记得关注和点赞!!! 目录 1 破局 1.1 逃离迷宫:上帝视角 1.2 网络跟踪:渴求利器 1.3 巨人肩膀:perf/eBPF 2 Perf 2.1 安装 perf 2.2 测试环境 2.3 初体验:跟踪 ping …...
给DevOps加点料:融入安全性的DevSecOps
从前,安全防护只是特定团队的责任,在开发的最后阶段才会介入。当开发周期长达数月、甚至数年时,这样做没什么问题;但是现在,这种做法现在已经行不通了。 采用 DevOps 可以有效推进快速频繁的开发周期(有时…...
MySQL视图笔记
视图的理解 ①视图是一种 虚拟表 ,本身是 不具有数据 的,占用很少的内存空间,它是 SQL 中的一个重要概念。 ②视图建立在已有表的基础上, 视图赖以建立的这些表称为基表。 ③对视图中的数据进行增加删除和修改,对应的数据表&a…...
【Ubuntu与Linux操作系统:十、C/C++编程】
第10章 C/C编程 10.1 Linux编程基础 Linux编程基础涵盖了C/C语言在Linux环境中的特点和使用方法。Linux以其高性能和开源特性成为系统编程的重要平台。 1. C语言与Linux的关系 Linux内核主要是用C语言编写的,因此学习C语言是理解Linux底层机制的必要前提。C语言的…...