天天看點

Ibatis的#和$的差別

來自别人的: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#||\'%\';

Ibatis的#和$的差別