#{}與${}的區(qū)別

# {}與${}的區(qū)別

默認情況下,使用#{}語法,MyBatis會產(chǎn)生PreparedStatement語句中,并且安全的設置PreparedStatement參數(shù),這個過程中MyBatis會進行必要的安全檢查和轉義。
示例1:

執(zhí)行SQL:Select * from user where name = #{name}
參數(shù):name=>xin
解析后執(zhí)行的SQL:Select * from user where name = ?

執(zhí)行SQL:Select * from user where name = ${name}
參數(shù):name:ke
解析后執(zhí)行的SQL:Select * from user where name =ke

說明:

  1. # 將傳入的數(shù)據(jù)都當成一個字符串,會對自動傳入的數(shù)據(jù)加一個雙引號。如:order by #{user_id},如果傳入的值是 name , 那么解析成sql時的值為order by “name”, 如果傳入的值是id,則解析成的sql為order by “id”.

  2. $ 將傳入的數(shù)據(jù)直接顯示生成在sql中。如:order by ${user_id},如果傳入的值是name, 那么解析成sql時的值為order by name, 如果傳入的值是id,則解析成的sql為order by id.

綜上所述,$ {}方式會引發(fā)SQL注入的問題、同時也會影響SQL語句的預編譯,所以從安全性和性能的角度出發(fā),能使用#{}的情況下就不要使用 ${}

${} 在什么情況下使用呢?

有時候可能需要直接插入一個不做任何修改的字符串到SQL語句中。這時候應該使用${}語法。

比如,動態(tài)SQL中的字段名,如:ORDER BY ${columnName}

<select id="queryMetaList" resultType="Map">
    Select * from name where name = ${name} ORDER BY ${age}
</select> 

由于${}僅僅是簡單的取值,所以以前sql注入的方法適用此處,如果我們order by語句后用了${},那么不做任何處理的時候是存在sql注入危險的。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • ORACLE自學教程 --create tabletestone ( id number, --序號usernam...
    落葉寂聊閱讀 1,243評論 0 0
  • MYSQL 基礎知識 1 MySQL數(shù)據(jù)庫概要 2 簡單MySQL環(huán)境 3 數(shù)據(jù)的存儲和獲取 4 MySQL基本操...
    Kingtester閱讀 8,060評論 5 115
  • 觀其大綱 page 01 基礎知識 1 MySQL數(shù)據(jù)庫概要 2 簡單MySQL環(huán)境 3 數(shù)據(jù)的存儲和獲取 4 M...
    周少言閱讀 3,255評論 0 33
  • ―—2018年嵐山區(qū)幼兒園優(yōu)質課評選活動觀課筆記 前言 幼兒園集體教學活動,是作為和一日生活活動、活動區(qū)活動相配合...
    漁非子閱讀 1,091評論 0 2
  • 什么時候才能做到不被別人的心情所影響,包括摯愛的人,人都有煩躁的時候,我想做個智者,能很好的控制自己的脾氣,不被他...
    阿標正傳閱讀 76評論 0 0

友情鏈接更多精彩內(nèi)容