三、PreparedStatement对象(重点)

一、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 信息开启服务端预编译。

原文地址:https://www.cnblogs.com/qiaoxin11/p/12817180.html