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”,如:

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM