Oracle+Mybatis的foreach insert批量插入報(bào)錯(cuò)的快速解決辦法
最近做一個(gè)批量導(dǎo)入的需求,將多條記錄批量插入數(shù)據(jù)庫中。
解決思路:在程序中封裝一個(gè)List集合對(duì)象,然后把該集合中的實(shí)體插入到數(shù)據(jù)庫中,因?yàn)轫?xiàng)目使用了MyBatis,所以打算使用MyBatis的foreach功能進(jìn)行批量插入。期間遇到了“SQL 命令未正確結(jié)束 ”的錯(cuò)誤,最終解決,記錄下來供以后查閱和學(xué)習(xí)。
首先,在網(wǎng)上參考了有關(guān)Mybatis的foreach insert的資料,具體如下:
foreach的主要用在構(gòu)建in條件中,它可以在SQL語句中進(jìn)行迭代一個(gè)集合。
foreach元素的屬性主要有 item,index,collection,open,separator,close。
item表示集合中每一個(gè)元素進(jìn)行迭代時(shí)的別名,index指定一個(gè)名字,用于表示在迭代過程中,每次迭代到的位置,open表示該語句以什么開始,separator表示在每次進(jìn)行迭代之間以什么符號(hào)作為分隔符,close表示以什么結(jié)束,在使用foreach的時(shí)候最關(guān)鍵的也是最容易出錯(cuò)的就是collection屬性,該屬性是必須指定的,但是在不同情況 下,該屬性的值是不一樣的,主要有一下3種情況:
1.如果傳入的是單參數(shù)且參數(shù)類型是一個(gè)List的時(shí)候,collection屬性值為list
2.如果傳入的是單參數(shù)且參數(shù)類型是一個(gè)array數(shù)組的時(shí)候,collection的屬性值為array
3.如果傳入的參數(shù)是多個(gè)的時(shí)候,我們就需要把它們封裝成一個(gè)Map了,當(dāng)然單參數(shù)也可以封裝成map
然后,照葫蘆畫瓢寫了如下的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)行起來后就一直報(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ù)制出來在PL/SQL中運(yùn)行也是報(bào)同樣的錯(cuò),如上也可以看出,使用批量插入執(zhí)行的SQL語句等價(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) 這種語法是通不過的 。再回過頭去看那篇文章,發(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)行通過。
在Oracle的版本中,有幾點(diǎn)需要注意的:
1.SQL中沒有VALUES;
2.<foreach>標(biāo)簽中的(selece ..... from dual);
3.<foreach>標(biāo)簽中的separator的屬性為"UNION ALL",將查詢合并結(jié)果集。
以上所述是小編給大家介紹的Oracle+Mybatis的foreach insert功能批量插入報(bào)錯(cuò)的快速解決辦法,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- oracle在導(dǎo)入數(shù)據(jù)時(shí)報(bào)600錯(cuò)誤的解決方法
- PL/SQL登錄Oracle數(shù)據(jù)庫報(bào)錯(cuò)ORA-12154:TNS:無法解析指定的連接標(biāo)識(shí)符已解決(本地未安裝Oracle需要連接服務(wù)器上的)
- Oracle實(shí)例啟動(dòng)時(shí)報(bào)錯(cuò):ORA-32004的解決方法
- Oracle SQL Developer連接報(bào)錯(cuò)(ORA-12505)的解決方案(兩種)
- Oracle 通過impdp導(dǎo)入報(bào)ORA-39002 ORA-39165錯(cuò)誤的解決方案
相關(guān)文章
SpringBoot實(shí)戰(zhàn):Spring如何找到對(duì)應(yīng)轉(zhuǎn)換器優(yōu)雅使用枚舉參數(shù)
這篇文章主要介紹了SpringBoot實(shí)戰(zhàn)中Spring是如何找到對(duì)應(yīng)轉(zhuǎn)換器優(yōu)雅的使用枚舉參數(shù),文中附有詳細(xì)的實(shí)例代碼有需要的朋友可以參考下,希望可以有所幫助2021-08-08Spring Boot整合ElasticSearch實(shí)現(xiàn)多版本兼容的方法詳解
簡單說,ElasticSearch(簡稱 ES)是搜索引擎,是結(jié)構(gòu)化數(shù)據(jù)的分布式搜索引擎。下面這篇文章主要給大家介紹了關(guān)于Spring Boot整合ElasticSearch實(shí)現(xiàn)多版本兼容的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧2018-05-05Java多線程讀寫鎖ReentrantReadWriteLock類詳解
本文詳細(xì)講解了Java多線程讀寫鎖ReentrantReadWriteLock類,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12項(xiàng)目管理利器-Maven(Windows安裝)圖文教程
下面小編就為大家?guī)硪黄?xiàng)目管理利器-Maven(Windows安裝)圖文教程。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06SpringSecurity請(qǐng)求授權(quán)規(guī)則配置與注解詳解
這篇文章主要介紹了SpringSecurity請(qǐng)求授權(quán)規(guī)則配置與注解詳解,我們常使用@Secured與@PreAuthorize兩個(gè)注解在進(jìn)入方法前進(jìn)行角色、權(quán)限的控制,進(jìn)入方法前數(shù)據(jù)的過濾@PreFilter注解偶爾會(huì)看到,需要的朋友可以參考下2023-12-12