SQL预编译 作者:马育民 • 2022-01-15 10:57 • 阅读:10178 # 数据库执行SQL的步骤 通常,数据库接收一条 SQL,到返回结果,分为三个过程: 1. 词法和语义解析 2. 优化sql语句,制定执行计划 3. 执行并返回结果 越 **复杂** 的 SQL,第1、2步的时间就 **越长** # 为什么有预编译 很多情况下,一条SQL语句会 **反复执行**,或者每次执行的时候 **只有个别的值不同** 比如:`select`的`where` 条件的值不同,`update`的 `set`的值不同,`insert` 的 `values` 值不同,都会造成SQL语句的不同 如下: `select * from emp where sal>3000` `select * from emp where sal>4000` `select * from emp where sal>5000` 这些 SQL 语句,只是 查询条件的值不同,其他完全相同 ### 缺点 当这些值不同时,就认为是不同的SQL语句,就进行 **词法语义解析**、**优化**、**制定执行计划**,就会 **影响效率**,如下: 执行 `select * from emp where sal>3000` 语句,需要执行步骤1、2、3 执行 `select * from emp where sal>4000` 语句,需要执行步骤1、2、3 执行 `select * from emp where sal>5000` 语句,需要执行步骤1、2、3 而且越 **复杂** 的 SQL,第1、2步的时间就 **越长**,很有可能 **步骤 1、2 加起来的时间** 比 **步骤 3的时间还要长** ### 解决 数据库支持预编译 # 预编译 将这类 SQL中的 `值` 用 `占位符` 替代,相当于将sql语句模板化,如下: `select * from emp where sal>?` ### 缓存预编译 第一次执行时,需要预编译,之后会被数据库缓存,当再次执行该 SQL 时,就 **不需要预编译**,直接将参数传入,就会执行。 **注意:**不是所有预编译语句都一定会被缓存,数据库本身会用一种策略(内部机制) ### 好处 1. 提高 SQL 执行效率。第一次需要预编译,之后不需要编译,直接执行 2. 防止SQL注入 # 预编译与JDBC 在 JDBC 中,通过 `PreparedStatement` 启用预编译 原文出处:http://malaoshi.top/show_1IX2b20M4IpL.html