その他
    ホーム 技術発信 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>

    記事を共有