日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

ibatis中使用List作为传入参数的使用方法及 CDATA使用

發(fā)布時間:2023/12/13 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ibatis中使用List作为传入参数的使用方法及 CDATA使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)⑴龅降膸讉€小問題:

入?yún)⒅饕袃煞N方法一種是以list直接作為入?yún)?#xff0c;另一種是將list作為map的元素之一為入?yún)?#xff0c;個人覺得第一種明顯優(yōu)勢,就一個list為入?yún)?#xff0c;還用map包裝一層多蛋疼。下面的介紹都以這個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)注,重點放在倒數(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">

即多了一個property,這個時候ibatis會從參數(shù)中尋找屬性為projectIdList的對象,而list是一個對象沒有屬性就會報錯:

Cause: com.ibatis.common.beans.ProbeException: Error getting ordinal list from JavaBean.
Cause java.lang.StringIndexOutOfBoundsException: String index out of range: -1

異常,解決方法就是去掉property="projectIdList"

其實這種寫法是相對第二種以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>

擴大轉(zhuǎn)義范圍會出現(xiàn)如下錯誤:

com.ibatis.common.beans.ProbeException: There is no READABLE property named 'projectIdList[]' in class 'java.util.ArrayList'

解決方法,就是縮小 CDATA的范圍。原因是CDATA導(dǎo)致系統(tǒng)無法識別動態(tài)判斷部分。

在使用ibatis時,經(jīng)常需要配置待執(zhí)行的sql語句。使用過ibatis的朋友都知道,無可避免的都會碰到一些不兼容、沖突的字符,多數(shù)人也都 知道用<![CDATA[? ]]>標(biāo)記避免Sql中與xml規(guī)范相沖突的字符對xml映射文件的合法性造成影響。但是,如果在ibatis中使用了動態(tài)語句的時候,還是有一些 細(xì)節(jié)需要注意。下面舉例說明一下:

環(huán)境:oracle、ibatis、java

錯誤例1:符號“<=”會對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>

錯誤例2:將整個sql語句用<![CDATA[? ]]>標(biāo)記來避免沖突,在一般情況下都是可行的,但是由于該sql配置中有動態(tài)語句(where部分),將導(dǎo)致系統(tǒng)無法識別動態(tài)判斷部分,導(dǎo)致整個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)的實體。?下面是五個在XML文檔中預(yù)定義好的實體:

<&gt;?小于號
>&lt;?大于號
&&
&apos;'單引號
""雙引號

一個 CDATA 部件以"< ! [CDATA[" 標(biāo)記開始,以"]]>"標(biāo)記結(jié)束:

<message>if salary < 1000 then</message>

為了避免出現(xiàn)這種情況,必須將字符"<" 轉(zhuǎn)換成實體,象下面這樣:

<message>if salary < 1000 then</message>

這里有一個問題,由于我在ibatis中用到了一個循環(huán)標(biāo)簽"<iterate>" ,為了寫一個??類似

SELECT * FROM b?

WHERE b.trade_no in
?<iterate property="tradeNoList" open="(" close=")" conjunction=",">#tradeNoList[]#</iterate>
???AND .........這樣的一個語句。

由于"<iterate"標(biāo)簽以 "<"開頭,那么可能被"< ! [CDATA["轉(zhuǎn)義了,所以造成語法錯誤,sql不能正常執(zhí)行,去掉"<![CDATA["后發(fā)現(xiàn)sql能正常執(zhí)行。

所以在碰到類似問題的時候,應(yīng)該留意,在"< ! [CDATA["轉(zhuǎn)義符中間不要用標(biāo)簽。

轉(zhuǎn)載于:https://www.cnblogs.com/longshiyVip/p/4753443.html

總結(jié)

以上是生活随笔為你收集整理的ibatis中使用List作为传入参数的使用方法及 CDATA使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。