【Mybatis架構】Mapper映射文件中的#{}與${}


前言

       還記得當初從北京回來的時候,跟着倪文傑師姐做Java ITOO的一卡通模塊,我親姐賈夢潔帶着我一塊做,期間,我遇到了一個特別奇葩的問題,就死我要實現Mybatis的模糊查詢,根據當時親姐教給我方法 select * from table where contions like #{something},就是解決不了問題,一點東西都查不出來,還報錯。后來,我終於明白,世界上還有${}這個東西。只不過等到今天才去把它發出來,有點亡羊補牢的感覺,希望還能幫到一些像我一樣的新手。

 

#{}實現的是向prepareStatement中的預處理語句中設置參數值,sql語句中#{}表示一個占位符即?。 

 

[html]  view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. <!--根據id查詢用戶信息 -->  
  2. <select id="findUserById"parameterType="int"resultType="user">  
  3.     select * from user where id =#{id}  
  4. </select>  

 

使用占位符#{}可以有效防止sql注入,在使用時不需要關心參數值的類型,mybatis會自動進行Java類型和jdbc類型的轉換。#{}可以接收簡單類型值或pojo屬性值,如果parameterType傳輸單個簡單類型值,#{}括號中可以是value或其它名稱。說得再通俗一點,當我們使用#{}的時候,發出的sql中,#{}代表的內容會自動被加上“”,而${}是直接把東西取出來直接用舉個例子:

id="liweizhong",#{id}輸出后是"liweizhong",而${value}輸出是liweizhong

 

${}和#{}不同,通過${}可以將parameterType傳入的內容拼接在sql中且不進行jdbc類型轉換, ${}可以接收簡單類型值或pojo屬性值,如果parameterType傳輸單個簡單類型值,${}括號中只能是value。使用${}不能防止sql注入,但是有時用${}會非常方便,如下的例子:

 

[html]  view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. <!--根據名稱模糊查詢用戶信息 -->  
  2. <select id="selectUserByName"parameterType="string"resultType="user">  
  3.     select * from user whereusername like '%${value}%'  
  4. </select>  

 

 

如果本例子使用#{}則傳入的字符串中必須有%號,而%是人為拼接在參數中,顯然有點麻煩,如果采用${}在sql中拼接為%的方式則在調用mapper接口傳遞參數就方便很多。

如果使用占位符號則必須人為在傳參數中加%

List<User> list =userMapper.selectUserByName("%管理員%");

 

如果使用${}原始符號則不用人為在參數中加%,直接在mapper配置文件里面接受這個參數就可以了,顯得更加的方便,可是sql注入問題?  

List<User>list = userMapper.selectUserByName("管理員");

 

再比如order by排序,如果將列名通過參數傳入sql,根據傳的列名進行排序,應該寫為:

 

[sql]  view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. ORDER BY ${columnName}  

 


這樣要執行的sql是:

 

[sql]  view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. ORDER BY columnName  

如果使用#{}將無法實現此功能,因為如果這樣的話,執行的sql就變成了

 

[sql]  view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. ORDER BY "columnName"  

 

那樣,你可以試一下,會報錯的,無效列名,sql語句報錯:


免責聲明!

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



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