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

前言html

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

 

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

 

[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中,#{}表明的內容會自動被加上「」,而${}是直接把東西取出來直接用舉個例子:sql

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

 

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

 

[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接口傳遞參數就方便不少。oop

若是使用佔位符號則必須人爲在傳參數中加%this

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

 

若是使用${}原始符號則不用人爲在參數中加%,直接在mapper配置文件裏面接受這個參數就能夠了,顯得更加的方便,但是sql注入問題?  .net

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語句報錯:

相關文章
相關標籤/搜索