MyBatis mapper檔案中的變數引用方式#{}與${}的差別

來源:互聯網
上載者:User

標籤:

MyBatis mapper檔案中的變數引用方式#{}與${}的差別

 

#{},和 ${}傳參的區別如下:
使用#傳入參數是,sql語句解析是會加上"",當成字串來解析,這樣相比於$的好處是比較明顯對的吧,#{}傳參能防止sql注入,如果你傳入的參數為 單引號‘,那麼如果使用${},這種方式 那麼是會報錯的
另外一種情境是,如果要做動態排序,比如 order by column,這個時候務必要用${}
select * from table order by ‘name‘ ,這樣是沒用
目前來看,能用#就不要用$,

 

 

 

預設情況下,使用#{}文法,MyBatis會產生PreparedStatement語句中,並且安全的設定PreparedStatement參數,這個過程中MyBatis會進行必要的安全檢查和轉義。
樣本1:
執行SQL:Select * from emp where name = #{employeeName}
參數:employeeName=>Smith
解析後執行的SQL:Select * from emp where name = ?
執行SQL:Select * from emp where name = ${employeeName}
參數:employeeName傳入值為:Smith
解析後執行的SQL:Select * from emp where name =Smith

 

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

但是${}在什麼情況下使用呢?

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

比如,動態SQL中的欄位名,如:ORDER BY ${columnName}

注意:當使用${}參數作為欄位名或表名時、需指定statementType為“STATEMENT”,如:

 

[html] 
    
    1. <select id="queryMetaList" resultType="Map" statementType="STATEMENT">Select * from emp where name = ${employeeName} ORDER BY ${columnName}</select>   

MyBatis mapper檔案中的變數引用方式#{}與${}的差別

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.