MySQL学习笔记(13)--预处理

只愿长相守 提交于 2020-02-03 17:42:03

·概念

prepare statement,一种预先编译SQL指令的方式 (然后命令执行)

  1. 预处理不同于直接处理,是将要执行的SQL指令先发送给服务器编译,然后通过指令执行
    ●发送预处理: prepare 预处理名字 from '要执行的SQL指令'
    ●执行预处理: execute 预处理名字
  2. 预处理管理
    ●预处理属于会话级别:即当前用户当次连接有效 (断开会被服务器清理掉)
    ●删除预处理:deallocate / drop 预处理名字

示例

#普通操作
select * from my_stuent;
#预处理操作:发送预处理
prepare p1 from 'select * from my_stuent';
#预处理操作:执行预处理
execute p1;
#删除预处理
deallocate prepare p1;

·作用

性能优化

  1. 效率优化:同样的SQL不用每次都进行编译(编择耗时)
    普通处理:每次都需要编译
    预处理:编译一次
  2. 网络传输优化:复杂的SQL指令只需要传输一-次
    普通处理:每次都需要网络传输SQL指令
    预处理:传输一次SQL指令,以后都是执行指令

安全:有效防止SQL注入(外部通过数据的特殊使用使得SQL的执行方式改变)

  1. 普通处理:直接发送给服务器执行(容易出现SQL注入)
  2. 预处理:发送的是结构,数据是后期执行传入(传入协议不一样,数据安全性高)

·预处理传参

在执行预处理的时候传入预处理需要的可变数据,一般预处理都不会是固定死的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;
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!