面试的时候经常碰到这样的题目:#{}和${}的区别是什么?
回答这样的问题首先要知道这两个符号是干嘛用的,然后再通过实例来解释两者的不同,这样才能更好的说服面试者。
${}和#{}的区别
1、这两个符号都是用在SQL语句当中,用作占位符,所谓占位符,顾名思义就是先占住一个位置,等待着你往该符号添加内容。
2、举例说明,比如在原SQL语句中:
delete from
ups_role_permission_dataparams
where role_id = #{roleId,jdbcType=INTEGER}
该符号位置用于传入参数,使用#{}符号在SQL解析时首先会进行预编译添加"",如这里role_id = “roleid”;使用${}符号在SQL解析时会默认直接解析参数,如这里role_id = roleid;
3、首先我们要了解什么是预编译机制,预编译是提前对SQL语句进行编译,而其后注入的参数不再进行SQL编译。我们知道,SQL注入是发生在编译的过程中,因为恶意注入了某些特殊字符,最后被编译成了恶意的执行操作,而预编译机制则可以很好的防止SQL注入。因此#{}符号可以防止SQL注入,能使用#{}尽量使用#{},但是Mybatis在进行order by排序时要使用${}。