浅谈 MySQL的预编译

以前的一篇 Mybatis中 #{}和${}的区别 中涉及到经过 SQL预编译和 #{} 传值 的方式防止SQL注入。html

由此引起了想了解预编译的想法。那么什么是预编译那?sql

1、三个阶段:

  1. 词法和语义解析

  2. 优化sql语句,制定执行计划

  3. 执行并返回结果

2、预编译出现的缘由

  一、不少状况下,一条SQL语句可能会反复执行,或者每次执行的时候只有个别的值不一样数据库

  二、好比query的where条件的值不一样,update的set的值不一样,insert的values值不一样,都会形成SQL语句的不一样。缓存

  三、每次由于这些值的不一样就进行词法语义解析优化、制定执行计划,就会很影响效率mybatis

  四、并且每每  步骤 一、2 加起来的时间比  步骤 3的时间还要长。ide

 

  这种状况下就须要预编译的出场了。post

 

3、预编译

  一、预编译:指的是数据库驱动在发送 sql 语句和参数给 DBMS 以前对 sql 语句进行编译,这样 DBMS 执行 sql 时,就不须要从新编译。优化

 

  二、预编译的好处:spa

    一、预编译以后的 SQL 多数状况下能够直接执行,DBMS 不须要再次编译。code

    二、越复杂的SQL,编译的复杂度将越大,预编译阶段能够合并屡次操做为一个操做。

    三、相同的预编译 SQL 能够重复利用。(把一个 SQL 预编译后产生的 PreparedStatement 对象缓存下来,

        下次对于同一个 SQL,能够直接使用这个缓存的 PreparedState 对象。)

    四、能够将这类SQL语句中的值用占位符替代,不须要每次编译,能够直接执行,

      只需执行的时候,直接将每次请求的不一样的值设置到占位符的位置。

    五、预编译能够视为将sql语句模板化或者说参数化。

4、mybatis之sql动态解析以及预编译源码

  mybatis sql 动态解析

    mybatis 在调用 connection 进行 sql 预编译以前,会对sql语句进行动态解析,动态解析主要包含以下的功能:

    • 占位符的处理

    • 动态sql的处理

    • 参数类型校验

  注: mybatis 默认状况下,将对全部的 sql 进行预编译。

 

参照:http://www.javashuo.com/article/p-ccoljqxp-dn.html

参照:https://www.jianshu.com/p/9972d7b33061

待续。。。。

相关文章
相关标签/搜索