最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Oracle+Mybatis的foreach insert批量插入報(bào)錯(cuò)的快速解決辦法

 更新時(shí)間:2016年08月26日 16:50:00   投稿:mrr  
本文給大家介紹Oracle+Mybatis的foreach insert批量插入報(bào)錯(cuò)的快速解決辦法,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友參考下吧

最近做一個(gè)批量導(dǎo)入的需求,將多條記錄批量插入數(shù)據(jù)庫(kù)中。

解決思路:在程序中封裝一個(gè)List集合對(duì)象,然后把該集合中的實(shí)體插入到數(shù)據(jù)庫(kù)中,因?yàn)轫?xiàng)目使用了MyBatis,所以打算使用MyBatis的foreach功能進(jìn)行批量插入。期間遇到了“SQL 命令未正確結(jié)束 ”的錯(cuò)誤,最終解決,記錄下來(lái)供以后查閱和學(xué)習(xí)。

首先,在網(wǎng)上參考了有關(guān)Mybatis的foreach insert的資料,具體如下:

foreach的主要用在構(gòu)建in條件中,它可以在SQL語(yǔ)句中進(jìn)行迭代一個(gè)集合。

foreach元素的屬性主要有 item,index,collection,open,separator,close。

item表示集合中每一個(gè)元素進(jìn)行迭代時(shí)的別名,index指定一個(gè)名字,用于表示在迭代過(guò)程中,每次迭代到的位置,open表示該語(yǔ)句以什么開(kāi)始,separator表示在每次進(jìn)行迭代之間以什么符號(hào)作為分隔符,close表示以什么結(jié)束,在使用foreach的時(shí)候最關(guān)鍵的也是最容易出錯(cuò)的就是collection屬性,該屬性是必須指定的,但是在不同情況 下,該屬性的值是不一樣的,主要有一下3種情況:

1.如果傳入的是單參數(shù)且參數(shù)類(lèi)型是一個(gè)List的時(shí)候,collection屬性值為list

2.如果傳入的是單參數(shù)且參數(shù)類(lèi)型是一個(gè)array數(shù)組的時(shí)候,collection的屬性值為array

3.如果傳入的參數(shù)是多個(gè)的時(shí)候,我們就需要把它們封裝成一個(gè)Map了,當(dāng)然單參數(shù)也可以封裝成map

然后,照葫蘆畫(huà)瓢寫(xiě)了如下的xml文件,

xxxMapper.xml文件:

<insert id="addSupCity" parameterType="java.util.List">
<selectKey keyProperty="cityId" order="BEFORE" resultType="String">
<![CDATA[SELECT SEQ_OCL_SUPCITY.NEXTVAL FROM dual]]>
</selectKey>
INSERT INTO T_OCL_SUPCITY
(CITY_ID,CITY_CODE, CITY_NAME, AREA_DESC, SUP_ID, STAT)
VALUES 
<foreach collection="list" item="item" index="index" separator=","> 
(
#{item.cityId,jdbcType=VARCHAR},
#{item.cityCode,jdbcType=VARCHAR},
#{item.cityName,jdbcType=VARCHAR},
#{item.areaDesc,jdbcType=VARCHAR},
#{item.supId,jdbcType=VARCHAR},
#{item.stat,jdbcType=VARCHAR}
)
</foreach>
</insert>

但是運(yùn)行起來(lái)后就一直報(bào)錯(cuò),報(bào)錯(cuò)信息如下:

### SQL: INSERT INTO T_OCL_SUPCITY
(CITY_ID,CITY_CODE, CITY_NAME, AREA_DESC, SUP_ID, STAT) VALUES (?,?,?,?,?),(?,?,?,?,?)
### Cause: java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正確結(jié)束

把SQL復(fù)制出來(lái)在PL/SQL中運(yùn)行也是報(bào)同樣的錯(cuò),如上也可以看出,使用批量插入執(zhí)行的SQL語(yǔ)句等價(jià)于: INSERT INTO T_OCL_SUPCITY (CITY_ID,CITY_CODE, CITY_NAME, AREA_DESC, SUP_ID, STAT) VALUES (?,?,?,?,?),(?,?,?,?,?),而在oracle中用insert into xxx values (xxx,xxx),(xxx,xxx) 這種語(yǔ)法是通不過(guò)的 。再回過(guò)頭去看那篇文章,發(fā)現(xiàn)這是適用于MySQL的,不適用于Oracle,因此把xml文件修改一下:

<insert id="addSupCity" parameterType="java.util.List">
INSERT INTO T_OCL_SUPCITY
(CITY_ID,CITY_CODE, CITY_NAME, AREA_DESC, SUP_ID, STAT)
SELECT SEQ_OCL_SUPCITY.NEXTVAL CITY_ID, A.*
FROM(
<foreach collection="list" item="item" index="index" separator="UNION ALL">
SELECT 
#{item.cityCode,jdbcType=VARCHAR} CITY_CODE,
#{item.cityName,jdbcType=VARCHAR} CITY_NAME,
#{item.areaDesc,jdbcType=VARCHAR} AREA_DESC,
#{item.supId,jdbcType=VARCHAR} SUP_ID,
#{item.stat,jdbcType=VARCHAR} STAT
FROM dual
</foreach>
)A
</insert>

運(yùn)行通過(guò)。

在Oracle的版本中,有幾點(diǎn)需要注意的:

1.SQL中沒(méi)有VALUES;

2.<foreach>標(biāo)簽中的(selece ..... from dual);

3.<foreach>標(biāo)簽中的separator的屬性為"UNION ALL",將查詢(xún)合并結(jié)果集。

以上所述是小編給大家介紹的Oracle+Mybatis的foreach insert功能批量插入報(bào)錯(cuò)的快速解決辦法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

最新評(píng)論

榆中县| 鄂伦春自治旗| 中超| 龙南县| 安平县| 城步| 静安区| 陆河县| 阿克陶县| 阿拉尔市| 明溪县| 轮台县| 青川县| 南川市| 台东县| 绥宁县| 郁南县| 沾益县| 四子王旗| 射阳县| 涞源县| 阳原县| 寿阳县| 鄂托克旗| 泰安市| 新昌县| 佳木斯市| 大洼县| 河西区| 哈巴河县| 巨野县| 芜湖市| 石嘴山市| 且末县| 阜宁县| 威海市| 仁怀市| 江油市| 浏阳市| 黑河市| 海原县|