以前印象里#{}可以防止注入,所以一直都是使用#{}。直到最近踩了坑,才去又理了一遍#{}和${}的區別。
事情是這樣,我在xml中寫sql的時候 查詢列的是不確定的 要由條件傳入。 我當時寫的sql如下:
SELECT #{XXXX} AS NUM FROM TABLE1。
但是我發現查詢結果是NUM這個字段的值一直是XXX。
查了下#{}和${}的區別才知道。 #{}會把里面的數據直接轉成字符串,所以我的SQL在被mybatis解析出來后就是 SELECT "XXX" AS NUM,這會直接將XXX值賦給NUM,所以導致了我查詢結果不對。
而${}並不會將里面的數據轉成字符串,還是要 SELECT XXX列。所以只用將#{}替換成${}就好了。
不過也正是因為 #{}多了一步轉成字符串的步驟,才能防止SQL注入。