Ibatis的#和$的区别

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

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

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

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

Select * from user where id=#id#rest

Ibatis会把sql预编译为xml

select * from user where id=?blog

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

以前的sql是简单的形式,加入须要用到模糊查询的like就比较麻烦,并且可能会出现sql注入的状况。编译

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

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#||'%';

相关文章
相关标签/搜索