Mybatis中 和 的區別?

2021-10-03 14:17:22 字數 1425 閱讀 1325

#{}是做為預編譯的,$是做為字串替換的。

mybatis在處理#{}時替換為?,呼叫preparedstatement的set來賦值。處理${}時替換成變數的值。

使用#{}可以有效的防止sql注入,有效的提高**的安全性。

首先看#{}解析乙個jdbc預編譯的語句(preparedstatement)的引數標記符,把引數部分用佔位符?替代,動態解析為:

select

*from t_user where username = ? ;

而傳入的引數會經過preparedstatement方法進行強制檢查和安全檢查處理,最後做為乙個合法的字串傳入

在#{}預處理之後可以預防sql注入傳入username為 a』or』1=1,使用#{},經過sql動態解析和預編譯,會把單引號轉為』,那麼sql最終解析會成為

select

*from t_user where username =

"a\'or\'1=1"

;

接下來看${}方式只會做簡單的字串替換,在動態sql解析階段會將變數替換, 比如傳遞的引數為數值 1,那麼最終的處理結果為

select

*from t_user where username =

1;

在預編譯之前就會被替換,有被注入的風險,假如傳入的username為字串 『a』or』1=1』,那麼使用{}處理直接替換成字串後,最終sql解析為:

select

*from t_user where username =

'a'or

'1=1'

;

這樣該錶的所有資訊都會被查出來

還用剛才的sql稍微改一下加乙個order by按年齡排序操作

#{}方式:

select

*from t_user order

by# ;

${}方式:

select

*from t_user order

by $ ;

加入我們傳入的引數為字串 age ,那麼兩種方式最終的sql解析為:

#{}方式:

select

*from t_user order

by"age"

;

becauser:#{}作為佔位符,字串賦值的時候都會加一對引號

${}方式:

select

*from t_user order

by age ;

becauser:${} 作為字串替換,相當於直接拼接乙個字串

結束。新手出上路,有問題請指出,thanks!

myBatis中 和 區別

1.將傳入的資料都當成乙個字串,會對自動傳入的資料加乙個雙引號。如 order by user id 如果傳入的值是111,那麼解析成sql時的值為order by 111 如果傳入的值是id,則解析成的sql為order by id 2.將傳入的資料直接顯示生成在sql中。如 order by u...

mybatis 中 和 區別

在使用mybatis 框架時 在xml的配置檔案中,通常是使用 來獲取數值的 如 select from t user inf where id 這時 如果你傳入的值為zhangsan 則會編譯成為 select from t user inf where id zhangsan mybatis 會...

Mybatis 中 和 區別

號與 區別 號表示引數,代表乙個字串。如 select a,b,c from table1 where id value 傳入引數後如 value 1 則可生成 select a,b,c from table1 where id 1 select a,b,c from table1 where ci...