この記事はアピリッツの技術ブログ「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>