MySQL Prepared语句(Prepared Statements)

在数据库应用中,很多SQL语句都会重复执行很多次,每次执行可能只是where条件中的变量值不同,但MySQL依然会解析SQL语法并生成执行计划。对于这类情况,可以利用prepared语句来避免重复解析SQL的开销。

文章目录

  • 一、prepared语句优点
  • 二、prepare语句用法
    • 2.1 prepare语句
    • 2.2 execute语句
    • 2.3 deallocate prepare语句

一、prepared语句优点

prepared语句通过准备一个SQL执行对象,然后通过execute语句来重复进行执行,在每次执行的过程中提供变量的实际值。相比于重复执行SQL语句,prepared statement具有如下优势:

  • 在execute语句重复执行的过程中,每次只有传入的变量值不同,SQL的执行计划不会改变,避免重复解析SQL。
  • 避免SQL注入攻击。

二、prepare语句用法

prepare statement主要有3个组成部分:

  • prepare语句:生成一个prepared statement对象并为其指定别名,可使用占位符?指定变量。
  • execute语句:通过别名执行一个prepared statement,可通过using子句为变量提供值。
  • deallocate prepared语句:通过别名释放一个prepared statement。

Prepare语句的生效范围是会话,MySQL使用参数max_prepared_stmt_count来控制语句的最大数量,如果将该参数设置为0,将会禁用prepared statement功能。

show variables like 'max_prepared_stmt_count';

在这里插入图片描述

执行如下SQL准备示例数据:

create table person(
id int auto_increment primary key,
name varchar(32));
insert into person values (null, 'Vincent'), (null, 'Victor'), (null, 'Grace');
select * from person;

在这里插入图片描述

2.1 prepare语句

prepare语句根据文本生成一个SQL语句对象,并为其指定一个别名,在准备过程中,可以使用占位符?来替代变量:

set @sql = 'select name from person where id=?';
prepare stmt from @sql;

在这里插入图片描述
示例中通过变量名来传入SQL文本,也可以直接通过SQL文本prepare,例如:prepare stmt from ‘select name from person where id=?’;

prepare语句还有一个较常用的场景为动态SQL拼接。即根据用户选择的条件来快速调整过滤条件拼接出不同的SQL:

set @base = 'select * from person where 1=1';
set @id_filter = ' and id=?';
set @name_filter = ' and name=?';
set @sql2 = concat(@base, @id_filter, @name_filter);   -- 选择了条件,就加入拼接
prepare stmt2 from @sql2;

在这里插入图片描述

2.2 execute语句

执行完prepare语句后,即可用execute语句来执行,如果有?代替的变量,则需要通过using语句为其指定值(数量要和prepare语句中?数量相同)。execute语句在每次执行提供不同的变量,即可实现一次解析,多次执行:

set @var1 = 1;
execute stmt using @var1;
set @var2 = 2;
execute stmt using @var2;

在这里插入图片描述

注意using子句中只能通过变量来提供值,如果通过常量提供值,则会报错:

execute stmt using 1;

在这里插入图片描述

2.3 deallocate prepare语句

prepare语句使用完成后可以使用deallocate/drop prepare ….语句手动进行释放,另外当会话断开时,所有未释放的prepare语句也会自动释放,因此重连或者异常中断都会导致prepare statement丢失。

deallocate prepare stmt;

在这里插入图片描述

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

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

相关文章

Java——继承与组合

和继承类似, 组合也是一种表达类之间关系的方式, 也是能够达到代码重用的效果。组合并没有涉及到特殊的语法 (诸如 extends 这样的关键字), 仅仅是将一个类的实例作为另外一个类的字段。 继承表示对象之间是is-a的关系,比如:狗是动物,猫是动…

模板(二)

文章目录 模板(二)1 非类型模板参数2. 模板的特化2.1. 概念2.2 函数模板特化2.3 类模板特化2.3.1 全特化2.3.2 偏特化2.3.3 类模板特化应用示例 3 模板的分离编译3.1 什么是分离编译3.2 模板的分离编译3.3 解决方法 4. 模板总结 模板(二&…

鸿蒙OpenHarmony【LED外设控制】 (基于Hi3861开发板)

概述 OpenHarmony WLAN模组基于Hi3861平台提供了丰富的外设操作能力,包含I2C、I2S、ADC、UART、SPI、SDIO、GPIO、PWM、FLASH等。本文介绍如何通过调用OpenHarmony的NDK接口,实现对GPIO控制,达到LED闪烁的效果。其他的IOT外设控制&#xff0…

谁说快是转瞬即逝,PUMA说快是永恒

巴黎奥运会、欧洲杯、美洲杯......2024年可以说是名副其实的体育大年。在各种全球体育盛事营造的浓厚体育氛围当中,各大体育品牌纷纷开始发力。 4月10日,全球领先运动品牌PUMA率先发布了其为本届奥运会准备的17套奥运装配,包括瑞士、瑞典等国…

Linux多进程(一)创建进程与进程控制

一、进程状态 进程一共有五种状态分别为:创建态,就绪态,运行态,阻塞态(挂起态),退出态(终止态)其中创建态和退出态维持的时间是非常短的,稍纵即逝。主要是就绪态, 运行态, 挂起态三者之间的状态切换。 就绪…

小程序使用阿里巴巴矢量图标库

一、登录官网 www.iconfont.cn 二、在搜索框中搜索想要的图标,将鼠标移动到图标上会看到三个标记 可以使用下载,直接使用: 可以使用css文件使用: 首先点击购物车样式的选项,而后点击下图位置: 点击自己创…

Flume的安装及使用

Flume的安装及使用 文章目录 Flume的安装及使用Flume的安装1、上传至虚拟机,并解压2、重命名目录,并配置环境变量3、查看flume版本4、测试flume5、flume的使用 Flume的安装 1、上传至虚拟机,并解压 tar -zxvf apache-flume-1.9.0-bin.tar.g…

Git TortoiseGit 详细安装使用教程

前言 Git 是一个免费的开源分布式版本控制系统,是用来保存工程源代码历史状态的命令行工具,旨在处理从小型到非常大型的项目,速度快、效率高。《请查阅Git详细说明》。TortoiseGit 是 Git 的 Windows Shell 界面工具,基于 Tortoi…

05_FreeRTOS信号量

信号量 信号量信号量简介常用信号量API函数 信号量 信号量简介 信号量(Semaphore)是一种实现任务间通信的机制,可以实现任务之间同步或临界资源的互斥访问,常用于协助一组相互竞争的任务来访问临界资源。在多任务系统中&#xf…

wireshark RTP分析参数

主要看丢弃和Delta, 丢弃就是丢掉的udp包,所占的比率 Delta是当前udp包接收到的时间减去上一个udp包接收到的时间 根据载荷可以知道正确的delta应该是多少,比如G711A,ptime20,那么delta理论上应该趋近于20. 这里的de…

python创建线程和结束线程

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 python创建线程和结束线程 在 Python 中,线程是一种轻量级的执行单元&#xff…

进程概念(进程第1篇)【Linux复习篇】

目录 1、冯诺依曼体系结构怎么画?中央处理器是什么?存储器是什么?每个部分有什么作用? 2、什么是操作系统? 3、什么叫进程?操作系统如何管理进程的? 4、怎么查看进程? 5、C语言…

基于MLP算法实现交通流量预测(Pytorch版)

在海量的城市数据中,交通流量数据无疑是揭示城市运行脉络、洞察出行规律的关键要素之一。实时且精准的交通流量预测不仅能为交通规划者提供科学决策依据,助力提升道路使用效率、缓解交通拥堵,还能为公众出行提供参考,实现个性化导…

指令和界面【Linux】

指令和界面 前言一、指令 vs 界面交互的需求满足需求的第一阶段——指令满足需求的第二阶段-界面时间 二、指令和界面交互区别为什么要学命令行总结 前言 Linux操作系统提供了丰富的命令行界面和图形用户界面工具,用户可以根据自己的需求选择适合的界面进行操作。命…

【好书推荐7】《机器学习平台架构实战》

【好书推荐7】《机器学习平台架构实战》 写在最前面《机器学习平台架构实战》编辑推荐内容简介作者简介目  录前  言本书读者内容介绍充分利用本书下载示例代码文件下载彩色图像本书约定 🌈你好呀!我是 是Yu欸 🌌 2024每日百字篆刻时光&…

论文阅读:BEVBert: Multimodal Map Pre-training for Language-guided Navigation

BEVBert:语言引导导航的多模态地图预训练 摘要 现存的问题:目前大多数现有的预训练方法都采用离散的全景图来学习视觉-文本关联。这要求模型隐式关联全景图中不完整、重复的观察结果,这可能会损害智能体的空间理解。 本文解决方案&#xf…

TikTok账号0播放是限流了吗?想要播放破万,试试这些方法!

前言 账号0播放问题,想必困扰着许多的TikTok运营同学。精心制作的短视频发布在TikTok,不是零播放,就是仅自己可见。那么,TikTok账号0播放是不是真的意味着被限流了呢?本篇总结了账号0播放的原因并附上解决方案&#xf…

[Flutter3] Json转dart模型举例

记录一下 Android studio plugin -> FlutterJsonBeanFactory 处理json转dart 模型 案例 json字符串, 一个 response的data返回数据 {"code":1,"msg":"\u64cd\u4f5c\u6210\u529f","data":{"list":{"id":"8…

SwiftUI 5.0(iOS 17.0)触摸反馈“震荡波”与触发器模式趣谈

概览 要想创作出一款精彩绝伦的 App,绚丽的界面和灵动的动画并不是唯一吸引用户的要素。有时我们还希望让用户真切的感受到操作引发的触觉反馈,直击使用者的灵魂。 所幸的是新版 SwiftUI 原生提供了实现触觉震动反馈的机制。在介绍它之后我们还将进一步…

等保测评之主机测评详解(二级)

等保测评之主机测评详解(二级)服务器——Windows 身份鉴别: 测评项a): a)应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换; 整改方…