一般來說,我們使用mybatis generator來生成mapper.xml文件時,會生成一些增刪改查的文件,這些文件中需要傳入一些參數,傳參數的時候,我們會注意到,參數的大括號外面,有兩種符號,一種是#,一種是$。這兩種符號有什么區別呢?
SELECT * FROM employee WHERE name=#{name} SELECT * FROM employee ORDER BY ${salary}
從上面的內容我們可以比較清楚的看到,一般#{}用於傳遞查詢的參數,一般用於從dao層傳遞一個string或者其他的參數過來,mybatis對這個參數會進行加引號的操作,將參數轉變為一個字符串。
比如,這邊我們想根據姓名查詢某個人的信息,我們會從dao傳一個參數,比如jack過來,mybatis生成對應的sql為:
SELECT * FROM employee WHERE name="jack"
而$則不同,我們一般用於ORDER BY的后面。此時mybatis對這個參數不會進行任何的處理,直接生成sql語句。例如,此處我們傳入salary作為參數,傳入第二個中,此時,mybatis生成的sql語句為:
SELECT * FROM employee ORDER BY salary
可以看到,mybatis對其沒有做任何的處理。
但是,我們一般推薦使用的是#{},不使用${}的原因如下:
- 會引起sql注入,因為${}會直接參與sql編譯
- 會影響sql語句的預編譯,因為 ${ } 僅僅為一個純碎的 string 替換,在動態 SQL 解析階段將會進行變量替換
這是一個比較小的知識點,但是也容易為遺忘,所以記錄在此。