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