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

相關文章
相關標籤/搜索