動態(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的時候,盡量的使用#方式