预编译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的性能

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件测试预备知识⑥—搭建Web服务器

在软件测试的广阔领域中,搭建Web服务器是一项极为关键的技能。它不仅有助于模拟真实的应用环境,方便我们对Web应用进行全面且深入的测试,还能让测试人员更好地掌控测试场景,提升测试效率与质量。接下来,让我们一同深入…

计算机视觉算法实战——打电话行为检测

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​​​​​ ​​​​​​​​​​​​​​​ ​​​​​​ ​ 1. 引言✨✨ 随着智能手机的普及,打电话行为检测成为了计算机视…

Linux第二课:LinuxC高级 学习记录day01

0、大纲 0.1、Linux 软件安装,用户管理,进程管理,shell 命令,硬链接和软连接,解压和压缩,功能性语句,结构性语句,分文件,make工具,shell脚本 0.2、C高级 …

ISP流程--去马赛克详解

前言 本期我们将深入讨论ISP流程中的去马赛克处理。我们熟知,彩色图像由一个个像元组成,每个像元又由红、绿、蓝(RGB)三通道构成。而相机传感器只能感知光的强度,无法直接感知光谱信息,即只有亮暗而没有颜色…

阿里云-通义灵码:在 PyCharm 中的强大助力(下)

目录 六.通义灵码在 PyCharm 中的优势与不足 1.优势 (1).提高开发效率 (2).提升代码质量 (3).易于使用 (4).不断学习和改进 2.不足 (1).依赖网络 (2).准确性有待提高 (3).局限性 七.未来发展展望 1.提高准确性和可靠性 2.与其他工具的集成 3.智能化程度的提升 八…

开源项目stable-diffusion-webui部署及生成照片

参考链接 https://www.freedidi.com/13133.html 基础环境部署 python 官网链接 Python Release Python 3.10.6 | Python.org 下载 Python 3.10.6 版本安装包 下载好后双击 点击安装,这里需要选择一下,把环境变量加上。(这里是默认安装到C盘…

【芯片封测学习专栏 -- 单 Die 与 多Die(Chiplet)介绍】

请阅读【嵌入式开发学习必备专栏 Cache | MMU | AMBA BUS | CoreSight | Trace32 | CoreLink | ARM GCC | CSH】 文章目录 Overview单个Die(Monolithic Die)多个Die(Chiplet Architecture or Heterogeneous SoC)如何判断一个SoC是…

Windows 安装 Docker 和 Docker Compose

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template 🌺 仓库主页: GitCode︱ Gitee ︱ Github 💖 欢迎点赞 👍 收藏 ⭐评论 …

java_将数据存入elasticsearch进行高效搜索

使用技术简介: (1) 使用Nginx实现反向代理,使前端可以调用多个微服务 (2) 使用nacos将多个服务管理关联起来 (3) 将数据存入elasticsearch进行高效搜索 (4) 使用消息队列rabbitmq进行消息的传递 (5) 使用 openfeign 进行多个服务之间的api调用 参…

Github Copilot学习笔记

(一)Prompt Engineering 利用AI工具生成prompt设计好的prompt结构使用MarkDown语法,按Role, Skills, Constrains, Background, Requirements和Demo这几个维度描述需求。然后收输入提示词:作为 [Role], 拥有 [Skills], 严格遵守 […

android分区和root

线刷包内容: 线刷包是一个完整的android镜像,不但包括android、linux和用户数据,还包括recovery等。当然此图中没有recovery,但是我们可以自己刷入一个。 主要分区 system.img 系统分区,包括linux下主要的二进制程序。 boot.img…

RabbitMQ基础(简单易懂)

RabbitMQ高级篇请看: RabbitMQ高级篇-CSDN博客 目录 什么是RabbitMQ? MQ 的核心概念 1. RabbitMQ 的核心组件 2. Exchange 的类型 3. 数据流向说明 如何安装RabbitQueue? WorkQueue(工作队列): Fa…

大数据环境搭建进度

1.使用虚拟机的系统:centos7.xLinux 2.资源不足,使用云服务器: 1. 3.使用远程登录进行操作 用xshell 4.任务 1.虚拟机装好 2.设置IP地址 3.可以联网 4.设置远程登录访问 5.创建module和software目录,修改两…

Mysql--运维篇--主从复制和集群(主从复制I/O线程,SQL线程,二进制日志,中继日志,集群NDB)

一、主从复制 MySQL的主从复制(Master-Slave Replication)是一种数据冗余和高可用性的解决方案,它通过将一个或多个从服务器(Slave)与主服务器(Master)同步来实现。主从复制的基本原理是&#…

【EI会议征稿通知】第十一届机械工程、材料和自动化技术国际会议(MMEAT 2025)

本次大会旨在汇聚全球机械工程、材料科学及自动化技术的创新学者和行业专家,为他们提供一个卓越的交流与合作平台。随着全球对可持续技术和智能制造需求的不断增加,MMEAT 2025将重点关注这些领域的最新发展趋势和未来前景。此次大会的主要目标是推动机械…

OpenCV基础:视频的采集、读取与录制

从摄像头采集视频 相关接口 - VideoCapture VideoCapture 用于从视频文件、摄像头或其他视频流设备中读取视频帧。它可以捕捉来自多种源的视频。 主要参数: cv2.VideoCapture(source): source: 这是一个整数或字符串,表示视频的来源。 如果是整数&a…

解读Linux Bridge中的东西流向与南北流向

解读Linux Bridge中的东西流向与南北流向 在现代云计算和虚拟化环境中,网络流量的管理和优化变得越来越重要。Linux Bridge作为Linux内核提供的一个强大的二层交换机工具,在虚拟化和容器化应用中扮演着至关重要的角色。本文将深入探讨Linux Bridge中的两…

车联网安全--TLS握手过程详解

目录 1. TLS协议概述 2. 为什么要握手 2.1 Hello 2.2 协商 2.3 同意 3.总共握了几次手? 1. TLS协议概述 车内各ECU间基于CAN的安全通讯--SecOC,想必现目前多数通信工程师们都已经搞的差不多了(不要再问FvM了);…

RuoYi Cloud项目解读【四、项目配置与启动】

四、项目配置与启动 当上面环境全部准备好之后,接下来就是项目配置。需要将项目相关配置修改成当前相关环境。 1 后端配置 1.1 数据库 创建数据库ry-cloud并导入数据脚本ry_2024xxxx.sql(必须),quartz.sql(可选&…

第432场周赛:跳过交替单元格的之字形遍历、机器人可以获得的最大金币数、图的最大边权的最小值、统计 K 次操作以内得到非递减子数组的数目

Q1、跳过交替单元格的之字形遍历 1、题目描述 给你一个 m x n 的二维数组 grid,数组由 正整数 组成。 你的任务是以 之字形 遍历 grid,同时跳过每个 交替 的单元格。 之字形遍历的定义如下: 从左上角的单元格 (0, 0) 开始。在当前行中向…