预编译应该是PrepareStatement
(
先编译后执行)(
mybatis
的底层原理)
SQL执行器是Statement
(
编译并执行,完整的sql)
Mybatis的#{}
与${}
,
#{}:表示预编译(SQL预编译 – 安全的),
${}:表示占位符(仅仅做文本的替换 – 不安全的)。
定义
预编译是做些代码文本的替换工作。是整个编译过程的最先做的工作。
作用
防止SQL注入和SQL执行效率更高
另:防止SQL注入(SQL注入只能对编译过程起作用):
将SQL语句全部替换为存储过程
MyBatis的SQL是一个具有“输入+输出”的功能,类似于函数的结构
(防止SQL注入的原理)
在SQL执行前,会先将上面的SQL发送给数据库进行编译;
执行时,直接使用编译好的SQL,替换占位符“?”就可以了
原理
SQL语句传给MySQL服务器的时候,服务器就已经帮我们编译了,编译成了一个SQL模板(可以类比函数),同时占位符“?”成了参数,当我们使用setInt()、setString()插入数据时,
(高效的原因)实际上只是往SQL模板里面传入参数,这个过程编译与执行是分开的,模板被放入了模板池,当需要时取出插入数据即可,不需要继续编译。
( = SQL已编译好,再次执行时无需再编译。)
标签:SQL,占位,编译,MySQL,执行,模板 From: https://www.cnblogs.com/yzhone/p/16921708.html