预编译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表中查找usernameliubeipassword123456的用户。看起来这个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的性能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/952721.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

qemu搭建虚拟的aarch64环境开发ebpf

一、背景 需求在嵌入式环境下进行交叉编译,学习ebpf相关技术,所以想搭建一个不依赖硬件环境的学习环境。 本文使用的环境版本: 宿主机: Ubuntu24.02 libbpf-bootstrap源码: https://github.com/libbpf/libbpf-boots…

深度学习从入门到实战——卷积神经网络原理解析及其应用

卷积神经网络CNN 卷积神经网络前言卷积神经网络卷积的填充方式卷积原理展示卷积计算量公式卷积核输出的大小计算感受野池化自适应均值化空洞卷积经典卷积神经网络参考 卷积神经网络 前言 为什么要使用卷积神经网络呢? 首先传统的MLP的有什么问题呢? - …

2015年西部数学奥林匹克几何试题

2015/G1 圆 ω 1 \omega_1 ω1​ 与圆 ω 2 \omega_2 ω2​ 内切于点 T T T. M M M, N N N 是圆 ω 1 \omega_1 ω1​ 上不同于 T T T 的不同两点. 圆 ω 2 \omega_2 ω2​ 的两条弦 A B AB AB, C D CD CD 分别过 M M M, N N N. 证明: 若线段 A C AC AC, B D BD …

《Spring Framework实战》14:4.1.4.5.自动装配合作者

欢迎观看《Spring Framework实战》视频教程 自动装配合作者 Spring容器可以自动连接协作bean之间的关系。您可以通过检查ApplicationContext的内容,让Spring自动为您的bean解析协作者(其他bean)。自动装配具有以下优点: 自动装配…

JVM之垃圾回收器概述(续)的详细解析

ParNew(并行) Par 是 Parallel 并行的缩写,New 是只能处理的是新生代 并行垃圾收集器在串行垃圾收集器的基础之上做了改进,采用复制算法,将单线程改为了多线程进行垃圾回收,可以缩短垃圾回收的时间 对于其他的行为(…

有一台服务器可以做哪些很酷的事情

有一台服务器可以做哪些很酷的事情 今天我也来简单分享一下,这几年来,我用云服务器做了哪些有趣的事情。 服务器推荐 1. 个人博客 拥有个人服务器,你可以完全掌控自己的网站或博客。 与使用第三方托管平台相比,你能自由选择网站…

灌区闸门自动化控制系统-精准渠道量测水-灌区现代化建设

项目背景 本项目聚焦于黑龙江某一灌区的现代化改造工程,该灌区覆盖广阔,灌溉面积高达7.5万亩,地域上跨越6个乡镇及涵盖17个村庄。项目核心在于通过全面的信息化建设,强力推动节水灌溉措施的实施,旨在显著提升农业用水的…

3.flask蓝图使用

构建一个目录结构 user_oper.py from flask import Blueprint, request, session, redirect, render_template import functools # 创建蓝图 user Blueprint(xkj, __name__)DATA_DICT {1: {"name": "张三", "age": 22, "gender": …

vue3学习日记1 - Pinia

最近发现职场前端用的框架大多为vue,所以最近也跟着黑马程序员vue3的课程进行学习,以下是我的学习记录 视频网址: Day2-02.Pinia-counter基础使用_哔哩哔哩_bilibili 学习日记: vue3学习日记1 - 环境搭建-CSDN博客 vue3学习日…

IP 地址与蜜罐技术

基于IP的地址的蜜罐技术是一种主动防御策略,它能够通过在网络上布置的一些看似正常没问题的IP地址来吸引恶意者的注意,将恶意者引导到预先布置好的伪装的目标之中。 如何实现蜜罐技术 当恶意攻击者在网络中四处扫描,寻找可入侵的目标时&…

Leetocde516. 最长回文子序列 动态规划

原题链接&#xff1a;Leetocde516. 最长回文子序列 class Solution { public:int longestPalindromeSubseq(string s) {int n s.size();vector<vector<int>> dp(n, vector<int>(n, 1));for (int i 0; i < n; i) {dp[i][i] 1;if (i 1 < n &&…

Linux物理地址到虚拟地址的映射

相关理论&#xff1a; Linux中用户空间是无法直操作寄存器的&#xff0c;需要先将寄存器对应的物理地址通过转换成虚拟地址然后在进行操作。 高性能处理器一般会提供一个内存管理单元&#xff08;MMU&#xff09;,该单元辅助操作系统进行内存管理&#xff0c;提供虚拟地址和物理…

openCvSharp 计算机视觉图片找茬

一、安装包 <PackageReference Include"OpenCvSharp4" Version"4.10.0.20241108" /> <PackageReference Include"OpenCvSharp4.runtime.win" Version"4.10.0.20241108" /> 二、准备两张图片 三、编写代码 using OpenCv…

数字孪生助力智慧机场全方位管理

智慧机场利用图扑可视化技术&#xff0c;实现航班动态、乘客流量和行李追踪的实时监控与分析&#xff0c;优化资源配置&#xff0c;提高运营效率&#xff0c;为旅客提供更加便捷的出行体验。

景联文科技提供高质量多模态数据处理服务,驱动AI新时代

在当今快速发展的AI时代&#xff0c;多模态数据标注成为推动人工智能技术进步的关键环节。景联文科技作为行业领先的AI数据服务提供商&#xff0c;专注于为客户提供高质量、高精度的多模态数据标注服务&#xff0c;涵盖图像、语音、文本、视频及3D点云等多种类型的数据。通过专…

【Docker】入门教程

目录 一、Docker的安装 二、Docker的命令 Docker命令实验 1.下载镜像 2.启动容器 3.修改页面 4.保存镜像 5.分享社区 三、Docker存储 1.目录挂载 2.卷映射 四、Docker网络 1.容器间相互访问 2.Redis主从同步集群 3.启动MySQL 五、Docker Compose 1.命令式安装 …

vscode使用Marscode编程助手

下载 vscode 在插件里下载Marscode编程助手 插件完成 在这里点击安装&#xff0c;点击后这里出现AI编程插件。

使用网页版Jupyter Notebook和VScode打开.ipynb文件

目录 正文 1、网页版Jupyter Notebook查看 2、VScode查看 因为总是忘记查看文件的网址&#xff0c;收藏了但分类众多每次都找不到……当个记录吧&#xff08;/捂脸哭&#xff09;&#xff01; 正文 此处以gitub中的某个仓库为例&#xff1a; https://github.com/INM-6/mu…

腾讯云AI代码助手编程挑战赛-知识百科AI

作品简介 知识百科AI这一编程主要用于对于小朋友的探索力的开发&#xff0c;让小朋友在一开始就对学习具有探索精神。在信息化时代下&#xff0c;会主动去学习自己认知以外的知识&#xff0c;同时丰富了眼界&#xff0c;开拓了新的知识。同时催生了在大数据时代下的信息共享化…

Flutter项目适配鸿蒙

Flutter项目适配鸿蒙 前言Flutter项目适配鸿蒙新工程直接支持ohos构建新项目编译运行 适配已有的Flutter项目 前言 目前市面上使用Flutter技术站的app不在少数&#xff0c;对于Flutter的项目&#xff0c;可能更多的是想直接兼容Harmonyos&#xff0c;而不是直接在重新开发一个…