新聞中心
我們在使用iBATIS時(shí)會(huì)經(jīng)常用到#這個(gè)符號。

銀海ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
比如:
sql 代碼
- select * from member where id =#id#
然后,我們會(huì)在程序中給id這個(gè)變量傳遞一個(gè)值,iBATIS會(huì)自動(dòng)將#id#轉(zhuǎn)成我們傳遞的內(nèi)容。
但是我最近碰到一個(gè)奇怪的問題。我在批量刪除或修改的時(shí)候,居然SQL失效了。
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
sql 代碼
- update user set flag='1' where id in ('1,2,3')
- delete from user where id in ('1,2,3')
這樣的SQL數(shù)據(jù)庫當(dāng)然是不會(huì)執(zhí)行的。那我們只有繞開iBATIS了嗎?
其實(shí)不用,iBATIS其實(shí)還提供了另外一種方式,那就是使用$來傳遞值。你使用$將你的變量括起來,iBATIS不會(huì)給這個(gè)變量做任何的處理,直接生成你要的SQL
SQL代碼
- 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)行替換
比如articleTitle的類型是string, 值是"標(biāo)題"的時(shí)候
$articleTitle$ = 標(biāo)題
#articleTitle# = '標(biāo)題'
如果一個(gè)字段的名字不規(guī)范帶有#,那么在﹤select ...﹥ select name# from reader where id=#id#...﹤/select﹥語句中會(huì)報(bào)錯(cuò),我看過有人問過這個(gè)問題,說是name####但是還是不能解決無法對帶#的字段的查詢。 解決辦法肯定是有的。比如,你可以把這個(gè)字段當(dāng)做一個(gè)參數(shù)來傳遞給ibatis。然后用$$把這個(gè)變量括起來。
網(wǎng)站標(biāo)題:iBATIS使用$和#的一些理解
URL分享:http://www.5511xx.com/article/coeoooh.html


咨詢
建站咨詢
