Ibatis的#和$的区别

时间:2022-12-25 16:52:55

来自别人的:https://blog.csdn.net/findmyself_for_world/article/details/49976555

总结:凡是#的,都作为参数,用setobject方式预编译。而$方式的,则直接替换字符串。$很不安全,可能出现sql注入攻击风险。

在实际中,除了like语句外,也有人经常对in参数使用$$,如a.ORDER_STATUS in( $orderStatus$ ) 

对于一条简单的sql语句,例如:

Select * from user where id=#id#

Ibatis会把sql预编译为

select * from user where id=?

接着会把传入的值进行填充,类似于jdbc的preparestatment的形式。

之前的sql是简单的形式,加入需要用到模糊查询的like就比较麻烦,而且可能会出现sql注入的情况。

假如需要查询用户名中带"sa"的用户,可能会这样来写sql

select * from user where name like '%sa%'

但是在ibatis的xml中不能这样写,如果写成

select * from user where name like #%sa%#或者like %#sa#%是肯定不行的,会有报错。

有个很简单的办法,就是写成

select * from user where name like '%$name$%'

的样子,$符号会把参数原样嵌入sql语句中而不进行预编译,这就使得有可能出现sql注入攻击。其实ibatis从根本上简单的说,凡是#的,都作为参数,用setobject方式预编译。而$方式的,则直接替换字符串。 所以说,$很不安全,会把用户的输入直接当参数放入sql。

结论:最好不要用like来进行查询,1是因为效率低,2是因为在ibatis里使用是相当麻烦的,可读性很差,如果真的要用,不要使用$,而是使用#的like拼凑形式:

select * from user where name like '%'||#name#||'%';