日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

mybatis3 oracle,Mybatis3中對oracle的批量插入

發布時間:2025/3/11 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mybatis3 oracle,Mybatis3中對oracle的批量插入 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Mybatis批量插入的資料,很多都是mysql的,insert into ... values (),(),...醬紫。oracle中不支持這種語法,oracle中的批量插入是醬紫insert intoselcect... union all select ...。在這里http://my.oschina.net/u/232879/blog/118245有說明mysqlINSERT INTO T_P_ROLE_MODULE (ROLE_ID, MODULE_ID)VALUES ( #{item.roleId}, #{item.moduleId})oracleINSERT INTO T_P_ROLE_MODULE (ROLE_ID, MODULE_ID)SELECT #{item.roleId}, #{item.moduleId} FROM DUALmybatis的foreach說明如下foreach的主要用在構建in條件中,它可以在SQL語句中進行迭代一個集合。foreach元素的屬性主要有 item,index,collection,open,separator,close。item表示集合中每一個元素進行迭代時的別名,index指 定一個名字,用於表示在迭代過程中,每次迭代到的位置,open表示該語句以什么開始,separator表示在每次進行迭代之間以什么符號作為分隔 符,close表示以什么結束,在使用foreach的時候最關鍵的也是最容易出錯的就是collection屬性,該屬性是必須指定的,但是在不同情況 下,該屬性的值是不一樣的,主要有一下3種情況:如果傳入的是單參數且參數類型是一個List的時候,collection屬性值為list如果傳入的是單參數且參數類型是一個array數組的時候,collection的屬性值為array如果傳入的參數是多個的時候,我們就需要把它們封裝成一個Map了,當然單參數也可以封裝成map,實際上如果你在傳入參數的時候,在breast里面也是會把它封裝成一個Map的,map的key就是參數名,所以這個時候collection屬性值就是傳入的List或array對象在自己封裝的map里面的key測試這種方式可行,但現在想插入同時指定序列,想當然這樣改了下SELECT SEQ_XXX.NEXTVAL , #{item.roleId}, #{item.moduleId} FROM DUAL報ORA-02287: sequence number not allowed here錯誤。ORA-02287錯誤網上最多的例子就是序列不能跟group by一起使用,解決方法就是把group by語句包起來,外層再select序列就可以了。目前這個錯誤顯示不是group by的問題,也有神似大仙的人物建議使用oracle的insert all,可這個是將數據插入多張表的語句,與當前問題不屬於同一范疇。在一個wiki里看到ORA-02287錯誤的詳細描述http://www.orafaq.com/wiki/ORA-02287The following are the cases where you can't use a sequence:

For a SELECT Statement:

In a WHERE clause

In a GROUP BY or ORDER BY clause

In a DISTINCT clause

Along with a UNION or INTERSECT or MINUS

In a sub-query

Other areas:

A sub-query of Update or Delete

In a View or snapshot

In a DEFAULT or CHECK Condition of a table definition

Within a single SQL statement that uses CURRVAL or NEXTVAL, all referenced LONG columns, updated tables, and locked tables must be located on the same database.其中講到union中也不用使用序列。UNION 指令的目的是將兩個 SQL 語句的結果合並起來,可以查看你要的查詢結果. UNION在進行表鏈接后會篩選掉重復的記錄,所以在表鏈接后會對所產生的結果集進行排序運算,刪除重復的記錄再返回結果。 UNION ALL的用法和union一樣,只不過union含有distinct的功能,它會把兩張表了重復的記錄去掉,而union all不會,所以從效率上,union all 會高一點。這里就是union中不能使用序列的問題,將select序列語句再往里包一層也是不行的,union會嵌套向里層檢查。往里包不行,就往外包,寫成這樣可行select SEQ_XXX.NEXTVAL, a.* from(select 1,'66' from dual unionselect 2,'77' from dual) a於是foreach的配置變成這個樣子就可以了select #{item.code,jdbcType=VARCHAR}, #{item.name,jdbcType=VARCHAR} from dual使用mybatis將數據批量插入到oracle中,在映射文件中怎么寫啊?

1.mybaits版本,3.1.0

2.

insert into b_agent_info

(id,hkgs,userName,custName,office,remark) values

separator=",">

(#{item.id},#{item.hkgs},#{item.userName},#{item.custName},#{item.office},#{item.remark})

3

select seq_preson_id.nextval from dual

insert into preson

separator="union">

select #{id},#{item.presonName},#{item.presonTel},#{item.presonEmail},#{item.presonAge} from dual

insert into PRESON

select SEQ_PRESON_ID.NEXTVAL,A.* from(

separator="UNION">

SELECT

#{item.presonName},

#{item.presonTel},

#{item.presonEmail},

#{item.presonAge}

from dual

) A

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的mybatis3 oracle,Mybatis3中對oracle的批量插入的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。