MySQL:Prepared Statement 预处理语句

预处理语句(Prepared Statements)是 MySQL 中一种用于执行 SQL 查询的高效、安全的方法。通过使用预处理语句,可以显著提升查询性能,并防止 SQL 注入攻击。本文将详细介绍 MySQL 预处理语句的概念、使用方法及其优势。

一、预处理语句概述

预处理语句是一种预编译的 SQL 语句,包含 SQL 语句模板和绑定参数。预处理语句的执行过程分为两步:

  1. 预编译 SQL 语句:服务器对 SQL 语句进行语法检查,并生成执行计划。
  2. 执行预处理语句:将参数值绑定到预编译的 SQL 语句中并执行。
二、使用预处理语句
1. 准备环境

首先,我们需要一个测试用的数据库表。例如,我们创建一个名为 employees 的表:

复制代码
CREATE TABLE employees (
    emp_id INT AUTO_INCREMENT PRIMARY KEY,
    emp_name VARCHAR(100),
    dept_id INT,
    salary DECIMAL(10, 2)
);

INSERT INTO employees (emp_name, dept_id, salary) VALUES
('Alice', 1, 5000.00),
('Bob', 2, 6000.00),
('Charlie', 1, 5500.00),
('David', 3, 7000.00),
('Eve', 2, 6500.00);
​
2. 预处理语句的基本使用

预处理语句主要包括三个步骤:准备、执行和关闭。

准备预处理语句:

复制代码
PREPARE stmt_name FROM 'SQL语句';
​

绑定参数并执行预处理语句:

复制代码
EXECUTE stmt_name USING @param1, @param2, ...;
​

关闭预处理语句:

复制代码
DEALLOCATE PREPARE stmt_name;
​
3. 示例

我们使用预处理语句来查询部门 ID 为 1 的员工信息:

复制代码
-- 准备预处理语句
PREPARE stmt FROM 'SELECT emp_id, emp_name, salary FROM employees WHERE dept_id = ?';

-- 设置参数
SET @dept_id = 1;

-- 执行预处理语句
EXECUTE stmt USING @dept_id;

-- 关闭预处理语句
DEALLOCATE PREPARE stmt;
​
三、预处理语句的优势
1. 提升性能

预处理语句通过预编译 SQL 语句,避免了每次执行 SQL 语句时都进行解析和编译,从而提升了查询性能,特别是在需要多次执行相同 SQL 语句的场景中。

2. 防止 SQL 注入

预处理语句将参数绑定与 SQL 语句分离,避免了将用户输入直接插入到 SQL 语句中,从而有效防止了 SQL 注入攻击。

四、高级用法
1. 使用多个参数

预处理语句可以使用多个参数。以下示例演示了如何使用多个参数:

复制代码
-- 准备预处理语句
PREPARE stmt FROM 'SELECT emp_id, emp_name, salary FROM employees WHERE dept_id = ? AND salary > ?';

-- 设置参数
SET @dept_id = 2;
SET @min_salary = 6000;

-- 执行预处理语句
EXECUTE stmt USING @dept_id, @min_salary;

-- 关闭预处理语句
DEALLOCATE PREPARE stmt;
​
2. 在存储过程中使用预处理语句

预处理语句也可以在存储过程中使用。以下是一个示例存储过程:

复制代码
DELIMITER $$

CREATE PROCEDURE GetEmployeesByDept(IN dept_id INT)
BEGIN
    PREPARE stmt FROM 'SELECT emp_id, emp_name, salary FROM employees WHERE dept_id = ?';
    EXECUTE stmt USING dept_id;
    DEALLOCATE PREPARE stmt;
END $$

DELIMITER ;

-- 调用存储过程
CALL GetEmployeesByDept(1);
相关推荐
恋猫de小郭3 小时前
2026 Flutter VS React Native ,同时在 AI 时代 VS Native 开发,你没见过的版本
android·前端·flutter
冬奇Lab4 小时前
PowerManagerService(上):电源状态与WakeLock管理
android·源码阅读
NineData8 小时前
NineData智能数据管理平台新功能发布|2026年1-2月
数据库·sql·数据分析
IvorySQL8 小时前
双星闪耀温哥华:IvorySQL 社区两项议题入选 PGConf.dev 2026
数据库·postgresql·开源
BoomHe9 小时前
Now in Android 架构模式全面分析
android·android jetpack
ma_king11 小时前
入门 java 和 数据库
java·数据库·后端
jiayou6415 小时前
KingbaseES 实战:审计追踪配置与运维实践
数据库
随风飘的云16 小时前
mysql的innodb引擎对可重复读做了那些优化,可以避免幻读
mysql
二流小码农17 小时前
鸿蒙开发:上传一张参考图片便可实现页面功能
android·ios·harmonyos
鹏程十八少17 小时前
4.Android 30分钟手写一个简单版shadow, 从零理解shadow插件化零反射插件化原理
android·前端·面试