MyBatis 注意事項

2021-07-29 06:28:16 字數 1542 閱讀 4436

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.一對多種的表中,...