MyBatis中$和#的區(qū)別

動態(tài) SQL 是 mybatis 的強大特性之一,也是它優(yōu)于其他 ORM 框架的一個重要原因。mybatis 在對 sql 語句進行預(yù)編譯之前,會對 sql 進行動態(tài)解析,解析為一個 BoundSql 對象,也是在此處對動態(tài) SQL 進行處理的。在動態(tài) SQL 解析階段, #{ } 和 ${ } 會有不同的表現(xiàn)
1.都可以獲取對象中的屬性值,$[name] 和#[name]相同
2.#可以防止sql注入.先把sql中使用#的地方變成?占位 再設(shè)置參數(shù)值,

    SELECT * FROM user WHERE name = #{name} AND password  = #{password}

#{} 在動態(tài)解析的時候, 會解析成一個參數(shù)標記符。就是解析之后的語句是:

    SELECT * FROM user WHERE name = ?  AND password  = ?

那么我們使用 ${}的時候

select * from user where name = ${name}; 

${}在動態(tài)解析的時候,會將我們傳入的參數(shù)當(dāng)做String字符串填充到我們的語句中,就會變成下面的語句

select * from user where name = "xxx";
預(yù)編譯之前的 SQL 語句已經(jīng)不包含變量了,完全已經(jīng)是常量數(shù)據(jù)了。相當(dāng)于我們普通沒有變量的sql了。
$會導(dǎo)致sql注入,可以拼接sql

  SELECT * FROM user WHERE name = $[name] AND password  = $[password]

假如 name = OR 1 = 1 OR;
最終上面的sql會變成——>

SELECT * FROM user WHERE name = OR 1 = 1 OR  AND password  = 

3.#會把傳入的參數(shù)使用引號包起來
參數(shù)值?: 'name’

SELECT * FROM user WHERE name = ? AND password  = ?

總結(jié):一般的使用#獲取數(shù)據(jù)即可,在分組和排列操作值使用$,如果連接一個參數(shù)值使用$,拼接一段sql使用$.
#方式能夠很大程度防止sql注入。
$方式無法防止Sql注入。
$方式一般用于傳入數(shù)據(jù)庫對象,例如傳入表名.
一般能用#的就別用$.
在使用mybatis的時候,盡量的使用#方式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容