SQL的语句处理分为两类
1.即时SQL:
一条 SQL 在 DB 接收到最终执行完毕返回,大致的过程如下:
词法和语义解析;
优化 SQL 语句,制定执行计划;
执行并返回结果;
如上,一条 SQL 直接是走流程处理,一次编译,单次运行,
此类普通语句被称作 Immediate Statements
2.预处理SQL
但是,绝大多数情况下,某需求某一条 SQL 语句可能会被反复调用执行,或者每次执行的时候只有个别的值不同(比如 select 的 where 子句值不同,update 的 set 子句值不同,insert 的 values 值不同)。如果每次都需要经过上面的词法语义解析、语句优化、制定执行计划等,则效率就明显不行了。
所谓预编译语句就是将此类 SQL 语句中的值用占位符替代,可以视为将 SQL 语句模板化或者说参数化,一般称这类语句叫Prepared Statements。
预编译语句的优势在于归纳为:一次编译、多次运行,省去了解析优化等过程;此外预编译语句能防止 SQL 注入。
使用预处理
prepare、execute、deallocate 统称为 PREPARE STATEMENT。翻译也就习惯的称其为预处理语句。PREPARE SQL1 FROM 'SELECT * FROM test WHERE TEST = ?';
SET @param = 123;
EXECUTE SQL1 USING @param;
Mybatis中的预处理