ibatis中使用List作为传入参数的使用方法及 CDATA使用
ibatis中l(wèi)ist做回參很簡單,resultClass設(shè)為list中元素類型,dao層調(diào)用:
(List)getSqlMapClientTemplate().queryForList("sqlName", paraName);并經(jīng)類型轉(zhuǎn)換即可,做入?yún)⑦€需要稍微調(diào)整下,本文主要講list做入?yún)⑴龅降膸讉€(gè)小問題:
入?yún)⒅饕袃煞N方法一種是以list直接作為入?yún)?#xff0c;另一種是將list作為map的元素之一為入?yún)?#xff0c;個(gè)人覺得第一種明顯優(yōu)勢,就一個(gè)list為入?yún)?#xff0c;還用map包裝一層多蛋疼。下面的介紹都以這個(gè)sql為例
"getProjectJobIdsByProjectIds" resultClass="java.lang.Integer" parameterClass="java.util.ArrayList"> SELECT id FROM cic_job WHERE last_buildid <> 'NULL' "AND" open="(" close=")" conjunction="or"> CRID=#projectIdList[]#以上是正確的寫法,意義大家不用關(guān)注,重點(diǎn)放在倒數(shù)2到4行,表示以list為入?yún)?#xff0c;其中projectIdList為dao層傳入的參數(shù)名。主要寫法就是parameterClass="java.util.ArrayList",然后加上
"AND" open="(" close=")" conjunction="or"> CRID=#projectIdList[]#意思就是迭代器循環(huán)projectIdList,并用or拼接形成sql,拼接完后用()括起來,在加上前綴and。
1、iterate property的問題
網(wǎng)上很多寫法是:
property="projectIdList" prepend="AND" open="(" close=")" conjunction="or">即多了一個(gè)property,這個(gè)時(shí)候ibatis會(huì)從參數(shù)中尋找屬性為projectIdList的對象,而list是一個(gè)對象沒有屬性就會(huì)報(bào)錯(cuò):
Cause: com.ibatis.common.beans.ProbeException: Error getting ordinal list from JavaBean.Cause java.lang.StringIndexOutOfBoundsException: String index out of range: -1
異常,解決方法就是去掉property="projectIdList"
其實(shí)這種寫法是相對第二種以map為參數(shù)而言的,你可以使用map傳入?yún)?shù)設(shè)置屬性為?property對應(yīng)名即可。
2、< ! [ CDATA[的問題
大家注意到上面sql添加有 ! [ CDATA[,它的作用是對一些字符進(jìn)行轉(zhuǎn)移,具體可以參見http://renren.it/a/JAVAbiancheng/iBATIS/20111105/139874.html
但上面sql如果寫成:
<select id="getProjectJobIdsByProjectIds" resultClass="java.lang.Integer" parameterClass="java.util.ArrayList"> <![CDATA[ SELECT id FROM cic_job WHERE last_buildid <> 'NULL' <iterate prepend="AND" open="(" close=")" conjunction="or"> CRID=#projectIdList[]# </iterate> ]]> </select>擴(kuò)大轉(zhuǎn)義范圍會(huì)出現(xiàn)如下錯(cuò)誤:
com.ibatis.common.beans.ProbeException: There is no READABLE property named 'projectIdList[]' in class 'java.util.ArrayList'解決方法,就是縮小 CDATA的范圍。原因是CDATA導(dǎo)致系統(tǒng)無法識(shí)別動(dòng)態(tài)判斷部分。
在使用ibatis時(shí),經(jīng)常需要配置待執(zhí)行的sql語句。使用過ibatis的朋友都知道,無可避免的都會(huì)碰到一些不兼容、沖突的字符,多數(shù)人也都 知道用<![CDATA[? ]]>標(biāo)記避免Sql中與xml規(guī)范相沖突的字符對xml映射文件的合法性造成影響。但是,如果在ibatis中使用了動(dòng)態(tài)語句的時(shí)候,還是有一些 細(xì)節(jié)需要注意。下面舉例說明一下:
環(huán)境:oracle、ibatis、java
錯(cuò)誤例1:符號“<=”會(huì)對xml映射文件的合法性造成影響
<select id="find" parameterClass="java.util.Map" resultClass="java.lang.Long"> select idfrom tableA a,tableB b<dynamic prepend="WHERE"><isNotNull prepend="AND" property="startDate">a.act_time >= #startDate# and a.act_time <= #endDate#and a.id = b.id </isNotNull> </dynamic> </select>錯(cuò)誤例2:將整個(gè)sql語句用<![CDATA[? ]]>標(biāo)記來避免沖突,在一般情況下都是可行的,但是由于該sql配置中有動(dòng)態(tài)語句(where部分),將導(dǎo)致系統(tǒng)無法識(shí)別動(dòng)態(tài)判斷部分,導(dǎo)致整個(gè)sql語句非法。
<select id="find" parameterClass="java.util.Map" resultClass="java.lang.Long">< ![CDATA[ select idfrom tableA a,tableB b<dynamic prepend="WHERE"><isNotNull prepend="AND" property="startDate">a.act_time >= #startDate# and a.act_time <= #endDate#and a.id = b.id </isNotNull> </dynamic> ]]></select>正確做法:縮小范圍,只對有字符沖突部分進(jìn)行合法性調(diào)整。
<select id="find" parameterClass="java.util.Map" resultClass="java.lang.Long"> select idfrom tableA a,tableB b<dynamic prepend="WHERE"><isNotNull prepend="AND" property="startDate">a.act_time >= #startDate# < ![CDATA[ and a.act_time <= #endDate# ]]>and a.id = b.id </isNotNull> </dynamic> </select> ------------------------------------------------------------------ibatis中應(yīng)該經(jīng)常見到"<![CDATA["這樣的東西吧,它的用處應(yīng)該是轉(zhuǎn)義一些特殊關(guān)鍵字字符,不合法的XML字符必須被替換為相應(yīng)的實(shí)體。?下面是五個(gè)在XML文檔中預(yù)定義好的實(shí)體:
| < | >? | 小于號 |
| > | <? | 大于號 |
| & | & | 和 |
| ' | ' | 單引號 |
| " | " | 雙引號 |
一個(gè) CDATA 部件以"< ! [CDATA[" 標(biāo)記開始,以"]]>"標(biāo)記結(jié)束:
| <message>if salary < 1000 then</message> |
為了避免出現(xiàn)這種情況,必須將字符"<" 轉(zhuǎn)換成實(shí)體,象下面這樣:
| <message>if salary < 1000 then</message> |
這里有一個(gè)問題,由于我在ibatis中用到了一個(gè)循環(huán)標(biāo)簽"<iterate>" ,為了寫一個(gè)??類似
SELECT * FROM b?
WHERE b.trade_no in
?<iterate property="tradeNoList" open="(" close=")" conjunction=",">#tradeNoList[]#</iterate>
???AND .........這樣的一個(gè)語句。
由于"<iterate"標(biāo)簽以 "<"開頭,那么可能被"< ! [CDATA["轉(zhuǎn)義了,所以造成語法錯(cuò)誤,sql不能正常執(zhí)行,去掉"<![CDATA["后發(fā)現(xiàn)sql能正常執(zhí)行。
所以在碰到類似問題的時(shí)候,應(yīng)該留意,在"< ! [CDATA["轉(zhuǎn)義符中間不要用標(biāo)簽。
轉(zhuǎn)載于:https://www.cnblogs.com/longshiyVip/p/4753443.html
總結(jié)
以上是生活随笔為你收集整理的ibatis中使用List作为传入参数的使用方法及 CDATA使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 印度SSLV固体火箭首飞失败:卫星走错轨
- 下一篇: 4000亿美元“妖股”熄火:李嘉诚公司急