一、PreparedStatement 特点:
- PreparedStatement 接口继承Statement 接口
- PreparedStatement 效率高于Statement
- PreparedStatement 支持动态绑定参数
- PreparedStatement 具备SQL 语句预编译能力
- 使用PreparedStatement 可防止出现SQL 注入问题
二、PreparedStatement的预编译能力
2.1什么是预编译
2.1.1SQL 语句的执行步骤
- 语法和语义解析
- 优化sql 语句,制定执行计划
- 执行并返回结果
但是很多情况,我们的一条sql 语句可能会反复执行,或者每次执行的时候只有个别的值不同(比如select 的where 子句值不同,update 的set 子句值不同,insert 的values 值不同)。如果每次都需要经
过上面的词法语义解析、语句优化、制定执行计划等,则效率就明显不行了。
所谓预编译语句就是将这类语句中的值用占位符替代,可以视为将sql 语句模板化或者说参数化。
预编译语句的优势在于:一次编译、多次运行,省去了解析优化等过程;此外预编译语句能防止sql 注入
2.1.2 解析过程
(1)硬解析
在不开启缓存执行计划的情况下,每次SQL 的处理都要经过:语法和语义的解析,优化器处理SQL,生成执行计划。整个过程我们称之为硬解析。
(2) 软解析
如果开启了缓存执行计划,数据库在处理sql 时会先查询缓存中是否含有与当前SQL语句相同的执行计划,如果有则直接执行该计划。
三、预编译方式
开始数据库的日志:
- show VARIABLES like '%general_log%'
- set GLOBAL general_log = on
- set GLOBAL log_output='table'
3.1 依赖数据库驱动完成预编译
如果我们没有开启数据库服务端编译,那么默认的是使用数据库驱动完成SQL 的预编译处理。
3.2 依赖数据库服务器完成预编译
我们可以通过修改连接数据库的URL 信息,添加useServerPrepStmts=true 信息开启服务端预编译。