MyBatis面试题,'#{}与${}的区别'以及'sql预编译'

这个问题不算复杂,网上答案也比较”丰富”,
之所以写这篇博文主要是以后查阅方便,自己总结也能加深印象,
毕竟它是面试题中的老相识,以后还要麻烦它关照关照…

MyBatis本身是基于JDBC封装的.
动态sql,是其的强大特性之一.
且mybatis在默认情况下,是会对所有的sql进行预编译的.


1. 什么是#{},什么是${}?

说区别之前,先来介绍一下#{}与${}

#{}会解析为一个JDBC预编译语句的参数标记符;
简单来说就是在你使用#{}的地方替换成一个参数占位符’?’

${}就是一个简单的字符串替换;
替换这个特点也使得其也适合于一些特定的场景

总之,
#{} 就是编译好SQL语句再取值.
${} 就是取值以后再去编译SQL语句.


2. #{}和${}适合什么样的应用场景呢?

存在即合理
但是我的结论也是:能用#{}就尽量用.

#{}最明显的优点就是防止sql注入
这是由于${}在预编译之前就会被变量替换,这会存在sql注入问题

sql注入就是加入一些’破坏性语句’(从url、表单等入口),从而达到破坏网站内部的方法.
小朋友不要乱试,会被网站警告和记录IP等信息. 咦!?我咋知道…


网上说的最多的就是在’传表名‘与‘动态排序‘等场景,应该使用${}
‘动态排序’先不提,
传表名‘不管是普通的#{}全表名传递还是#{}_user半表名传递(表名传递后面还要加上’_user’才算整个表名).我都用过#{}处理,不觉得有问题.

所以啊,我也不知道为啥网上都说’传表名’用#{}会报错之类的;
不知道是我看的资料都太老了没更新,
还是我自己并未深入或者说使用并不规范,所以出现这种错误的理解.


3. sql预编译没有缺点?

好像真没有?我是没查到啊…
而且,sql预编译有太多大神已经详细解释了,我就不重复造轮子了.

优点的话我就拾人牙慧,简明扼要的列重点几个:

1.预编译阶段可以优化sql执行
预编译之后的sql多数情况下可以直接执行,DBMS不需要再次编译,越复杂的sql,编译的复杂度将越大,预编译阶段可以合并多次操作为一个操作.

2.提高执行效率(重复利用)
把一些格式固定的sql编译后缓存下来,当我们再次执行相同的sql语句时就不需要预编译的过程了.

3.减少硬解析,可以节约CPU资源
软解析,就是因为相同文本的sql语句存在于library cache中,所以本次sql语句的解析就可以去掉硬解析中的一个或多个步骤(主要为选择执行计划步骤),从而节省资源的耗费.

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值