ホーム DoRuby MybatisでOracleにListを一括insert

MybatisでOracleにListを一括insert

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

MybatisでOracleにList<object>を一括insert

主キーIDは自動増加ではないパターン

mybatisを利用して、OracleDBにList<object>を一括insert方法を紹介します。

主キーIDは自動増加ではないパターン

 mapperメソッド定義:

int insertBatch(@Param (“itemList” ) List<objectclass> itemList);

itemListを一括DBにinsertします。

 NGパターン

<insert id=”insertBatch” parametertype=”java.util.List”>

insert into TABLEAAA (C1, C2)

values

<foreach collection=”itemList” item=”item” index=”index” separator=”,”>

(#{item.c1},#{item.c2})

</foreach>

</insert>

書き方は大丈夫そうな感じですが、実は下記エラーが発生します。

Cause: java.sql.BatchUpdateException : ORA-00933: SQLコマンドが正しく終了されていません。

; bad SQL grammar []; nested exception is java.sql.BatchUpdateException: ORA-00933: SQLコマンドが正しく終了されていません。

Oracleの場合は特別です。

 OKパターン1

INSERT ALLを利用します。

<insert id=”insertBatch” parametertype=”java.util.List”>

INSERT ALL

<foreach collection=”itemList” item=”item”>

INTO TABLEAAA (C1, C2) values (#{item.c1},#{item.c2})

</foreach>

SELECT * FROM dual

</insert>

 OKパターン2

union allを利用します。

<insert id=”insertBatch” parametertype=”java.util.List”>

insert into TABLEAAA (C1, C2)

<foreach collection=”itemList” item=”item” separator=”union all”>

(select #{item.c1},#{item.c2} from dual)

</foreach>

</insert>

記事を共有

最近人気な記事