mybatis中的#和$的區別
1. #將傳入的數據都當成一個字符串,會對自動傳入的數據加一個雙引號。如:order by #user_id#,如果傳入的值是111,那么解析成sql時的值為order by "111", 如果傳入的值是id,則解析成的sql為order by "id".
2. $將傳入的數據直接顯示生成在sql中。如:order by $user_id$,如果傳入的值是111,那么解析成sql時的值為order by user_id, 如果傳入的值是id,則解析成的sql為order by id.
3. #方式能夠很大程度防止sql注入。
4.$方式無法防止Sql注入。
5.$方式一般用于傳入數據庫對象,例如傳入表名.
6.一般能用#的就別用$.
防止Sql注入
注意:SQL語句不要寫成select * from t_stu where s_name like '%$name$%',這樣極易受到注入攻擊。
”${xxx}”這樣格式的參數會直接參與sql編譯,從而不能避免注入攻擊。但涉及到動態表名和列名時,只能使用“${xxx}”這樣的參數格式。
在編寫mybatis的映射語句時,盡量采用“#{xxx}”這樣的格式。若不得不使用“${xxx}”這樣的參數,要手工地做好過濾工作,來防止sql注入攻擊。
例子
1
2
3
4
5
|
<sql id= "condition_where" > <isNotEmpty property= "companyName" prepend= " and " > t1.company_name like #companyName# </isNotEmpty> </sql> |
java代碼和你原來的差不多,其實也沒什么不好,你要覺得麻煩 把判斷null和'%'封裝到一個方法里就可以了
1
2
3
|
if (!StringUtil.isEmpty( this .companyName)) { table.setCompanyName( "%" + this .companyName + "%" ); } |
以上就是小編為大家帶來的淺談mybatis中的#和$的區別 以及防止sql注入的方法全部內容了,希望大家多多支持服務器之家~