From 57e880d0285256c8ddb502d79c967f904ac52f51 Mon Sep 17 00:00:00 2001 From: quanhengf Date: Sun, 22 Dec 2019 13:06:43 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/Mybatis/核心处理层/5、Executor组件.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/docs/Mybatis/核心处理层/5、Executor组件.md b/docs/Mybatis/核心处理层/5、Executor组件.md index 867fcdf..24912be 100644 --- a/docs/Mybatis/核心处理层/5、Executor组件.md +++ b/docs/Mybatis/核心处理层/5、Executor组件.md @@ -407,22 +407,29 @@ ReuseExecutor.doQuery()、doQueryCursor()、doUpdate()方法的实现与SimpleEx **1、数据库预编译起源** (1)数据库SQL语句编译特性 + 数据库接收到sql语句之后,需要词法和语义解析,以优化sql语句,制定执行计划。这需要花费一些时间。但是很多情况,我们的同一条sql语句可能会反复执行,或者每次执行的时候只有个别的值不同(比如:query的where子句值不同,update的set子句值不同,insert的values值不同)。 (2)减少编译的方法 + 如果每次都需要经过上面的词法语义解析、语句优化、制定执行计划等,则效率就明显不行了。为了解决上面的问题,于是就有了预编译,预编译语句就是将这类语句中的值用占位符替代,可以视为将sql语句模板化或者说参数化。一次编译、多次运行,省去了解析优化等过程。 (3)缓存预编译 + 预编译语句被DB的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要重复编译,只要将参数直接传入编译过的语句执行代码中(相当于一个函数)就会得到执行。并不是所以预编译语句都一定会被缓存,数据库本身会用一种策略(内部机制)。 -(4) 预编译的实现方法 + (4) 预编译的实现方法 + 预编译是通过PreparedStatement和占位符来实现的。 **2.预编译作用** + (1)减少编译次数 提升性能 + 预编译之后的 sql 多数情况下可以直接执行,DBMS(数据库管理系统)不需要再次编译。越复杂的sql,往往编译的复杂度就越大。 (2)防止SQL注入 + 使用预编译,后面注入的参数将不会再次触发SQL编译。也就是说,对于后面注入的参数,系统将不会认为它会是一个SQL命令,而默认其是一个参数,参数中的or或and等(SQL注入常用技俩)就不是SQL语法保留字了。 **3.mybatis是如何实现预编译的**