mybatis/ibatis中#和$的區別
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.一般能用#的就別用$.
ps:在使用mybatis中還遇到的用法,在該符號內的語句,將不會被當成字串來處理,而是直接當成sql語句,比如要執行乙個儲存過程。
預設情況下,使用#{}語法,mybatis會產生preparedstatement語句中,並且安全的設定preparedstatement引數,這個過程中mybatis會進行必要的安全檢查和轉義。
示例1:
執行sql:select * from emp where name = #
引數:employeename=>smith
解析後執行的sql:select * from emp where name = ?
執行sql:select * from emp where name = $
引數:employeename傳入值為:smith
解析後執行的sql:select * from emp where name =smith
綜上所述、${}方式會引發sql注入的問題、同時也會影響sql語句的預編譯,所以從安全性和效能的角度出發,能使用#{}的情況下就不要使用${}
但是${}在什麼情況下使用呢?
有時候可能需要直接插入乙個不做任何修改的字串到sql語句中。這時候應該使用${}語法。
比如,動態sql中的欄位名,如:order by $
注意:當使用${}引數作為欄位名或表名時、需指定statementtype為「statement」,如:
[html]view plain
copy
<selectid=
"querymetalist"
resulttype
="map"
statementtype
="statement"
>select * from emp where
name
= $ order by $
select>
mybatis實現批量插入和批量刪除: 使用foreach標籤
mybatis 巢狀 :association
mybatis注意事項
mabatis中的注意事項 和 的區別。mabatis在對sql語句進行預編譯之前,會對sql進行動態解析,會對動態sql進行處理,乙個 會被解析成乙個引數佔位符?而 僅僅為乙個純粹的字串的替換,在動態sql解析階段會進行變數的替換。能使用 就用它,相同的預編譯可以重複利用,在預編譯之前就已經被變數...
Mybatis注意事項
配置檔案 4 配置檔案中標籤的先後,必須按照順序來。單錶 查 1 返回集合時 不論list,set,map 中的resulttype屬性改為resultmap,同時建立對應的。2 返回集合時,如果資料引數與類中引數一一對應,可設定resulttype 類名,不必如第三條修改。3 返回集合時,如果有多...
mybatis注意事項
1.如果用註解的方式載入配置crud查詢的語句時,對映檔案中的配置是 2.除了查詢,其他的要session.commit 因為增刪改不會自動地提交 3一對一的單錶查詢中,有兩種方式 方式一 巢狀結果 使用巢狀結果對映來處理重複的聯合結果的子集 封裝聯表查詢的資料 去除重複的資料 4.一對多種的表中,...