前言
還記得當初從北京回來的時候,跟着倪文傑師姐做Java ITOO的一卡通模塊,我親姐賈夢潔帶着我一塊做,期間,我遇到了一個特別奇葩的問題,就死我要實現Mybatis的模糊查詢,根據當時親姐教給我方法 select * from table where contions like #{something},就是解決不了問題,一點東西都查不出來,還報錯。后來,我終於明白,世界上還有${}這個東西。只不過等到今天才去把它發出來,有點亡羊補牢的感覺,希望還能幫到一些像我一樣的新手。
#{}實現的是向prepareStatement中的預處理語句中設置參數值,sql語句中#{}表示一個占位符即?。
使用占位符#{}可以有效防止sql注入,在使用時不需要關心參數值的類型,mybatis會自動進行Java類型和jdbc類型的轉換。#{}可以接收簡單類型值或pojo屬性值,如果parameterType傳輸單個簡單類型值,#{}括號中可以是value或其它名稱。說得再通俗一點,當我們使用#{}的時候,發出的sql中,#{}代表的內容會自動被加上“”,而${}是直接把東西取出來直接用舉個例子:
id="liweizhong",#{id}輸出后是"liweizhong",而${value}輸出是liweizhong
${}和#{}不同,通過${}可以將parameterType傳入的內容拼接在sql中且不進行jdbc類型轉換, ${}可以接收簡單類型值或pojo屬性值,如果parameterType傳輸單個簡單類型值,${}括號中只能是value。使用${}不能防止sql注入,但是有時用${}會非常方便,如下的例子:
如果本例子使用#{}則傳入的字符串中必須有%號,而%是人為拼接在參數中,顯然有點麻煩,如果采用${}在sql中拼接為%的方式則在調用mapper接口傳遞參數就方便很多。
如果使用占位符號則必須人為在傳參數中加%
List<User> list =userMapper.selectUserByName("%管理員%");
如果使用${}原始符號則不用人為在參數中加%,直接在mapper配置文件里面接受這個參數就可以了,顯得更加的方便,可是sql注入問題?
List<User>list = userMapper.selectUserByName("管理員");
再比如order by排序,如果將列名通過參數傳入sql,根據傳的列名進行排序,應該寫為:
這樣要執行的sql是:
如果使用#{}將無法實現此功能,因為如果這樣的話,執行的sql就變成了
那樣,你可以試一下,會報錯的,無效列名,sql語句報錯:
![]()