iBATIS使用$和#的一些理解


我們在使用iBATIS時會經常用到#這個符號。

比如:

sql 代碼

  1. select * from member where id =#id# 

然后,我們會在程序中給id這個變量傳遞一個值,iBATIS會自動將#id#轉成我們傳遞的內容。

但是我最近碰到一個奇怪的問題。我在批量刪除或修改的時候,居然SQL失效了。

SQL如下:

sql 代碼

  1. update user set flag=#flag# where id in (#id#)     
  2.  
  3. delete from user where id in (#id#)   

傳遞的id為1,2,3。但是數據卻沒有任何的修改。

后來查找了半天,原來原因就是這個#的問題。因為iBATIS默認會把“#”中間的變量作為字符串來處理。這樣,就會出現這樣的SQL


sql 代碼

  1. update user set flag='1' where id in ('1,2,3')     
  2.      
  3. delete from user where id in ('1,2,3')  

這樣的SQL數據庫當然是不會執行的。那我們只有繞開iBATIS了嗎?

其實不用,iBATIS其實還提供了另外一種方式,那就是使用$來傳遞值。你使用$將你的變量括起來,iBATIS不會給這個變量做任何的處理,直接生成你要的SQL

SQL代碼

如下面代碼從后台傳入的參數為String="1,2,3,4";但是通過$value$獲取到的是1,2,3,4

<delete id="deleteEntities" parameterType="java.lang.String">
    DELETE FROM INFO_TERMINALPRIVILEGES WHERE ID in ($value$)
  </delete>

 

  1. update user set flag=$flag$ where id in ($id$)     
  2.  
  3. update user set flag=1  where id in (1,2,3)     
  4.  
  5. delete from user where id in ($id$)  
  6.  
  7. delete from user where id in (1,2,3) 

還可以用ibatis的iterate解決:

SQL:

  1. select id="test" parameterClass="java.util.List" resultClass="test.Roadline"﹥      
  2.     select * from SYS_ROAD_LINE_INFO where ROAD_LINE_NO in       
  3.     ﹤iterate open="(" close=")" conjunction=","﹥      
  4.         #value[]#      
  5.     ﹤/iterate﹥      
  6. ﹤/select﹥   
  1. List list = new ArrayList();      
  2. list.add("aaa");      
  3. list.add("bbb");      
  4.                   
  5. List rsList = sqlMap.queryForList("roadline.test", list);    
  6.  

生成的SQL:

  1. select * from SYS_ROAD_LINE_INFO where ROAD_LINE_NO in (?,?)   

$中間的變量就是直接替換成值的

#會根據變量的類型來進行替換

比如articleTitle的類型是string, 值是"標題"的時候

$articleTitle$ = 標題

#articleTitle# = '標題'

如果一個字段的名字不規范帶有#,那么在﹤select ...﹥ select name# from reader where id=#id#...﹤/select﹥語句中會報錯,我看過有人問過這個問題,說是name####但是還是不能解決無法對帶#的字段的查詢。 解決辦法肯定是有的。比如,你可以把這個字段當做一個參數來傳遞給ibatis。然后用$$把這個變量括起來。


免責聲明!

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



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