我們?cè)谑褂胕BATIS時(shí)會(huì)經(jīng)常用到#這個(gè)符號(hào)罐呼。
比如:
select * from member where id =#id#
然后,我們會(huì)在程序中給id這個(gè)變量傳遞一個(gè)值侦高,iBATIS會(huì)自動(dòng)將 #id# 轉(zhuǎn)成我們傳遞的內(nèi)容嫉柴。
但是我最近碰到一個(gè)奇怪的問題。我在批量刪除或修改的時(shí)候奉呛,居然SQL失效了计螺。
SQL如下:
update user set flag=#flag# where id in (#id#)
delete from user where id in (#id#)
傳遞的id為1,2,3。但是數(shù)據(jù)卻沒有任何的修改瞧壮。
后來查找了半天登馒,原來原因就是這個(gè) # 的問題。因?yàn)閕BATIS默認(rèn)會(huì)把 “#” 中間的變量作為字符串來處理咆槽。這樣陈轿,就會(huì)出現(xiàn)這樣的SQL:
update user set flag='1' where id in ('1,2,3')
delete from user where id in ('1,2,3')
這樣的SQL數(shù)據(jù)庫(kù)當(dāng)然是不會(huì)執(zhí)行的。那我們只有繞開iBATIS了嗎罗晕?
其實(shí)不用济欢,iBATIS其實(shí)還提供了另外一種方式赠堵,那就是使用 $ 來傳遞值小渊。你使用 $ 將你的變量括起來,iBATIS不會(huì)給這個(gè)變量做任何的處理茫叭,直接生成你要的SQL
如下面代碼從后臺(tái)傳入的參數(shù)為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>
update user set flag=$flag$ where id in ($id$)
--update user set flag=1 where id in (1,2,3)
delete from user where id in ($id$)
--delete from user where id in (1,2,3)
還可以用ibatis的iterate解決:
SQL:
<select id="test" parameterClass="java.util.List" resultClass="test.Roadline">
select * from SYS_ROAD_LINE_INFO where ROAD_LINE_NO in
<iterate open="(" close=")" conjunction=",">
#value[]#
</iterate>
</select>
List list = new ArrayList();
list.add("aaa");
list.add("bbb");
List rsList = sqlMap.queryForList("roadline.test", list);
生成的SQL:
select * from SYS_ROAD_LINE_INFO where ROAD_LINE_NO in (?,?)
$ 中間的變量就是直接替換成值的
# 會(huì)根據(jù)變量的類型來進(jìn)行替換
原文可見:iBATIS使用$和#的一些理解