·概念
prepare statement,一种预先编译SQL指令的方式 (然后命令执行)
- 预处理不同于直接处理,是将要执行的SQL指令先发送给服务器编译,然后通过指令执行
●发送预处理:prepare 预处理名字 from '要执行的SQL指令'
●执行预处理:execute 预处理名字
- 预处理管理
●预处理属于会话级别:即当前用户当次连接有效 (断开会被服务器清理掉)
●删除预处理:deallocate / drop 预处理名字
示例
#普通操作
select * from my_stuent;
#预处理操作:发送预处理
prepare p1 from 'select * from my_stuent';
#预处理操作:执行预处理
execute p1;
#删除预处理
deallocate prepare p1;
·作用
性能优化
- 效率优化:同样的SQL不用每次都进行编译(编择耗时)
普通处理:每次都需要编译
预处理:编译一次 - 网络传输优化:复杂的SQL指令只需要传输一-次
普通处理:每次都需要网络传输SQL指令
预处理:传输一次SQL指令,以后都是执行指令
安全:有效防止SQL注入(外部通过数据的特殊使用使得SQL的执行方式改变)
- 普通处理:直接发送给服务器执行(容易出现SQL注入)
- 预处理:发送的是结构,数据是后期执行传入(传入协议不一样,数据安全性高)
·预处理传参
在执行预处理的时候传入预处理需要的可变数据,一般预处理都不会是固定死的SQL指令,而是具有一些数据可变的执行(条件),在执行预处理的时候将实际数据传进去代替占位符执行SQL
●可变数据的位置使用占位符?占位
prepare 预处理名字 from '预处理指令 变化部分使用?替代';
●数据存储到变量(预处理传入的值必须是变量保存的)
set @变量名 = 值;
●使用using关键字传参
execute 预处理名字 using @变量名;
●数据传入的顺序与预处理中占位符的顺序一致
示例
#准备预处理:涉及参数
prepare p1 from 'insert into my_student values (?,?,?,?,?,?)';
#设置变量并传入参数
set @stu_id = 'stu008';
set @stu_name = 'jay';
set @class_id = 5;
set @gender = 1;
set @stu_height = 175;
set @stu_age = 41;
#执行预处理
execute p1 using @stu_id, @stu_name, @class_id, @gender, @stu_height, @stu_age;
来源:CSDN
作者:绿皮豚二号
链接:https://blog.csdn.net/qq_39323164/article/details/104155965