一般來(lái)說(shuō),我們使用mybatis generator來(lái)生成mapper.xml文件時(shí),會(huì)生成一些增刪改查的文件,這些文件中需要傳入一些參數(shù),傳參數(shù)的時(shí)候,我們會(huì)注意到,參數(shù)的大括號(hào)外面,有兩種符號(hào),一種是#,一種是$。這兩種符號(hào)有什么區(qū)別呢?
SELECT*FROMemployeeWHEREname=#{name}SELECT*FROMemployeeORDERBY${salary}
從上面的內(nèi)容我們可以比較清楚的看到,一般#{}用于傳遞查詢的參數(shù),一般用于從dao層傳遞一個(gè)string或者其他的參數(shù)過(guò)來(lái),mybatis對(duì)這個(gè)參數(shù)會(huì)進(jìn)行加引號(hào)的操作,將參數(shù)轉(zhuǎn)變?yōu)橐粋€(gè)字符串。
比如,這邊我們想根據(jù)姓名查詢某個(gè)人的信息,我們會(huì)從dao傳一個(gè)參數(shù),比如jack過(guò)來(lái),mybatis生成對(duì)應(yīng)的sql為:
SELECT*FROMemployeeWHEREname="jack"
而$則不同,我們一般用于ORDER BY的后面。此時(shí)mybatis對(duì)這個(gè)參數(shù)不會(huì)進(jìn)行任何的處理,直接生成sql語(yǔ)句。例如,此處我們傳入salary作為參數(shù),傳入第二個(gè)中,此時(shí),mybatis生成的sql語(yǔ)句為:
SELECT*FROMemployeeORDERBYsalary
可以看到,mybatis對(duì)其沒(méi)有做任何的處理。
但是,我們一般推薦使用的是#{},不使用${}的原因如下:
會(huì)引起sql注入,因?yàn)?{}會(huì)直接參與sql編譯
會(huì)影響sql語(yǔ)句的預(yù)編譯,因?yàn)?${ } 僅僅為一個(gè)純碎的 string 替換,在動(dòng)態(tài) SQL 解析階段將會(huì)進(jìn)行變量替換