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.hqwc.cn/news/626785.html

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

相关文章

代码随想录算法训练营第三十七天| LeetCode 738.单调递增的数字、总结

一、LeetCode 738.单调递增的数字 题目链接/文章讲解/视频讲解:https://programmercarl.com/0738.%E5%8D%95%E8%B0%83%E9%80%92%E5%A2%9E%E7%9A%84%E6%95%B0%E5%AD%97.html 状态:已解决 1.思路 如何求得小于等于N的最大单调递增的整数?98&am…

钉钉OA审批评论接口,如何@ 人并发送通知

钉钉OA审批评论接口,如何 人并发送通 问题描述: 相关接口:https://oapi.dingtalk.com/topapi/process/instance/comment/add 我希望在钉钉oa审批流程中,添加评论的同时通过“”或者其他方式提醒流程发起人去跟进审批工作。 但我…

(vue)el-select选择框加全选/清空/反选

(vue)el-select选择框加全选/清空/反选 <el-form-item label"批次"><el-selectv-model"formInline.processBatch"multiplecollapse-tagsfilterableplaceholder"请选择"style"width: 250px"no-data-text"请先选择企业、日…

C++ stl容器list的底层模拟实现

目录 前言&#xff1a; 1.创建节点 2.普通迭代器的封装 3.反向迭代器的封装 为什么要对正向迭代器进行封装&#xff1f; 4.const迭代器 5.构造函数 6.拷贝构造 7.赋值重载 8.insert 9.erase 10.析构 11.头插头删&#xff0c;尾插尾删 12.完整代码简单测试 总结&…

机器学习周报第37周

目录 一、文献阅读&#xff1a;You Only Look Once: Unified, Real-Time Object Detection1.1 摘要1.2 背景1.3 论文模型1.4 网络设计1.5 YOLO的局限性1.6 实现代码 一、文献阅读&#xff1a;You Only Look Once: Unified, Real-Time Object Detection 1.1 摘要 YOLO是一种新…

比起本地渲染,网渲的优势在哪里?渲染100邀请码1a12

网渲的应用很广泛&#xff0c;在建筑设计和室内装修等行业都能看到它的身影&#xff0c;比起本地渲染&#xff0c;它有以下几个优势。 1、资源充足 网渲平台的资源充足&#xff0c;会根据渲染作业的规模和复杂度自动扩展或缩减分配&#xff0c;以达到动态调节的目的&#xff0c…

王道汽车4S企业管理系统 SQL注入漏洞复现

0x01 产品简介 王道汽车4S企业管理系统(以下简称“王道4S系统”)是一套专门为汽车销售和维修服务企业开发的管理软件。该系统是博士德软件公司集10余年汽车行业管理软件研发经验之大成,精心打造的最新一代汽车4S企业管理解决方案。 0x02 漏洞概述 王道汽车4S企业管理系统…

软件项目总体测试计划(Word原件2024)

一、 前言 &#xff08;一&#xff09; 背景 &#xff08;二&#xff09; 目的 &#xff08;三&#xff09; 测试目标 &#xff08;四&#xff09; 适用范围与读者对象 &#xff08;五&#xff09; 术语与缩写 二、 软件测试实施流程 &#xff08;一&#xff09; 测试工作总体流…

【RSGIS数据资源】2001-2022年中国玉米种植分布数据集

文章目录 数据介绍精彩截图2001&#xff5e;2020年中国玉米种植频率分布2001年至2020年研究区域融合数据的平均填充百分比。 数据介绍 2001-2022年中国玉米种植分布数据集&#xff08;CCD-Maize&#xff09;&#xff0c;涵盖中国22个省、市的玉米种植分布图&#xff0c;文件格…

授权协议OAuth 2.0之如何接入授权服务

写在前面 为了能够更好以场景化的方式来理解OAuth2.0&#xff0c;本文一起看下&#xff0c;假定我们现在要开发一个交友类软件&#xff0c;为了提高用户登录的便利程度&#xff0c;需要对接微信开放平台&#xff0c;获取到用户的微信账号信息&#xff0c;作为用户的注册信息来…

使用SpringBoot将中国地震台网数据保存PostGIS数据库实践

目录 前言 一、数据转换 1、Json转JavaBean 2、JavaBean与数据库字段映射 二、空间数据表设计 1、表结构设计 三、PostGIS数据保存 1、Mapper接口定义 2、Service逻辑层实现 3、数据入库 4、运行实例及结果 总结 前言 在上一篇博客中基于Java的XxlCrawler网络信息爬…

判断二叉树是否对称

解题思路&#xff1a;首先判断特殊情况&#xff0c;比如左右子树是否为一空一有&#xff0c;是否为两空&#xff0c;是否相等&#xff0c;然后递归判断外侧是否相等&#xff08;即为左子树的左节点和右子树的右节点&#xff09;和内侧是否相等&#xff08;即为右子树的左节点和…