前言:怀着疑惑和痛苦的心情写下这篇文章,其中疑惑之一是预编译对象,会把编译之后的整个语句保存在对象中,如果保存保存在哪里呢?
注:本文以mysql数据库为基础展开
一、基础知识
1、SQL语句在数据库中的执行过程
一条SQL语句从客户端(如: java 程序、navicat工具、cmd命令行)发送到数据库管理系统后,要经历以下过程:
- 词法和语义的解析
- 优化SQL语句,制定执行计划
- 执行并返回结果
2、预编译语句
形如select * from user where id = 1
,这种普通语句叫做
Immediate Statement,执行时要经历完整的SQL执行过程
形如select * from user where id = ?
, 使用占位符代替语句中字段的值,这种语句叫做Prepared Statement,执行时,首先要进行预编译,之后每次执行都省去了解析优化等过程。
预编译语句适用场景:一条SQL语句需要反复执行多次并且只有字段的值可能存在改变(如query的where子句值不同,update的set子句值不同,insert的values值不同)
二、MySQ数据库的预编译功能
1、开启数据库日志功能
为了更好的了解SQL语句的执行,需要开启mysql的查询日志功能。本文通过设置mysql全局变量方式开启,mysql服务重启后配置失效。
第一步:通过命令行,进入mysql客户端,输入命令:
show variables like "general_%";
general_log = OFF 表明日志功能没有开启。
第二步:开启日志功能,输入命令:
set global general_log = "ON";
修改保存日志的文件(非必要操作),输入命令:
set global general_log_file = "D:\\mysql\\data\query01.log";
第三步: 查看是否开启成功,输入命令
show variables like "general_%";
2、执行mysql预编译命令
在执行相关操作前,需要创建一张表,作为操作对象。建表语句如下:
create table user(
id int auto_increment primary key,
username varchar(50),
passw