一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - Oracle+Mybatis的foreach insert批量插入報錯的快速解決辦法

Oracle+Mybatis的foreach insert批量插入報錯的快速解決辦法

2020-06-08 11:48mrr JAVA教程

本文給大家介紹Oracle+Mybatis的foreach insert批量插入報錯的快速解決辦法,非常不錯,具有參考借鑒價值,感興趣的朋友參考下吧

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

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

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

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

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

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

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

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

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

然后,照葫蘆畫瓢寫了如下的xml文件,

xxxMapper.xml文件:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<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)行起來后就一直報錯,報錯信息如下:

?
1
2
3
### 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ù)制出來在PL/SQL中運(yùn)行也是報同樣的錯,如上也可以看出,使用批量插入執(zhí)行的SQL語句等價于: 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) 這種語法是通不過的 。再回過頭去看那篇文章,發(fā)現(xiàn)這是適用于MySQL的,不適用于Oracle,因此把xml文件修改一下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<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)行通過。

在Oracle的版本中,有幾點需要注意的:

1.SQL中沒有VALUES;

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

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

以上所述是小編給大家介紹的Oracle+Mybatis的foreach insert功能批量插入報錯的快速解決辦法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對服務(wù)器之家網(wǎng)站的支持!

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 海角社区在线登录 | 国产99久久九九精品免费 | 果冻传媒新在线观看免费 | 男人猛进女人屁股免费 | 欧美╳bbbb | 91九色porn偷拍在线 | 学校捏奶揉下面污文h | 亚洲午夜性春猛交xxxx | 大又大又粗又爽女人毛片 | 亚洲精品九色在线网站 | 包臀裙女教师波多野结衣 | 欧美福利在线观看 | 激情偷拍网| 国产在线精品观看 | 青草草产国视频 | 美女沟厕撒尿全过程高清图片 | 2022色婷婷综合久久久 | 成年人在线视频观看 | 亚洲区在线播放 | 国产99在线观看 | 欧美日韩国产成人综合在线 | 国产男女性特黄录像 | 日本大片网| 人成午夜免费大片在线观看 | 日韩人成免费网站大片 | 国产手机在线αⅴ片无码观看 | 亚洲网红精品大秀在线观看 | 国产自在线观看 | 91视在线国内在线播放酒店 | 欧美洲大黑香蕉在线视频 | 精品在线一区 | 精品国产乱码久久久久久免费 | 草草视频在线免费观看 | 亚洲2卡三卡4卡5卡精品 | 亚洲高清成人 | 国产v在线播放 | 国产在线观看a | youjizzxxx69日本 | 极品在线| 国色天香社区在线视频免费观看 | 国产精品原创巨作无遮挡 |