相同點(diǎn)與不同點(diǎn)?:
1.兩者都是動(dòng)態(tài)的向sql語(yǔ)句中傳入需要的參數(shù)
2.#傳入的參數(shù)在SQL中顯示為字符串
? ? ?比如 :select * from student where id =#{id},當(dāng)把id值1,傳入到后臺(tái)的時(shí)候,就相當(dāng)于?select *from student where id ='1'.
3.$傳入的參數(shù)在SqL中直接顯示為傳入的值瞭吃。
????比如:select * from student where id =${id},當(dāng)傳入id值1咨演,傳入到后臺(tái)的時(shí)候侮叮,就相當(dāng)于?select * from student where id =?1.
4.#可以防止SQL注入的風(fēng)險(xiǎn)(語(yǔ)句的拼接)
5.但是如果使用在order by 中就需要使用 $.
原理:
#{}: 解析為一個(gè) JDBC 預(yù)編譯語(yǔ)句(prepared statement)的參數(shù)標(biāo)記符,一個(gè) #{ } 被解析為一個(gè)參數(shù)占位符?酌媒。
?????${}: 僅僅為一個(gè)純碎的 string 替換候齿,在動(dòng)態(tài) SQL 解析階段將會(huì)進(jìn)行變量替換。傳入一個(gè)不改變的字符串或者傳入數(shù)據(jù)庫(kù)字段(列名)瞳筏,例如要傳入order by 后邊的參數(shù)這種情況下必須使用${}稚瘾。
????綜上,#{}方式一般用于傳入字段值姚炕,并將該值作為字符串加到執(zhí)行sql中摊欠,一定程度防止sql注入;${}方式一般用于傳入數(shù)據(jù)庫(kù)對(duì)象柱宦,例如傳入表名些椒,不能防止sql注入,存在風(fēng)險(xiǎn)掸刊。
使用案例(order by ):
直接用動(dòng)態(tài)參數(shù)生成免糕,不會(huì)排序:
????比如 ?ORDER BY #{orderColumn} #{orderDir}
需要將#改為$:
????ORDER BY ${orderColumn} ${orderDir}。