基于Oracle数据库下MyBatis批量新增list数据

  • 业务场景:报表统计中通常会出现将excell中的数据批量导出到数据库中、目前项目用到的是MyBatis,所以需要用到MyBatis批量插入,将数据封装到List集合中实现
  • 说明: 
    •   大批量数据不建议直接insert操作(通过第三方组件或者队列方式)数据库,只是为了说明MyBatis下批量操作
      • 最初原始代码(错误)
        1 <!-- 添加活动与商品关联信息 -->
        2     <insert id="addGroupBuyDzGoodsInfo" parameterType="java.util.List">
        3         INSERT INTO TB_DZ_GROUPBUY_GOODS
        4         (F_GROUPBUY_ID,F_GAME_CATA_ID,F_GAME_ID) VALUES
        5         <foreach collection="list" item="item" index="index" separator=",">
        6             #{item.groupBuyId,jdbcType=DECIMAL},#{item.gameCatId,jdbcType=DECIMAL},#{item.gameId,jdbcType=DECIMAL}
        7         </foreach>
        8         )
        9     </insert>

        此段代码看起来符合Oracle的insert table (字段1、字段2) values ()....但是通过后台日志可以看到如下sql信息

        通过查阅资料发现这种写法适用于mySql不适用于Oracle,修改后的代码如下

      •  1 <!-- 添加活动与商品关联信息 -->
         2     <insert id="addGroupBuyDzGoodsInfo" parameterType="java.util.List">
         3         INSERT INTO TB_DZ_GROUPBUY_GOODS
         4         (F_GROUPBUY_ID,F_GAME_CATA_ID,F_GAME_ID)
         5         SELECT * FROM (
         6         <foreach collection="list" item="item" index="index" separator=" union all ">
         7             SELECT
         8             #{item.groupBuyId,jdbcType=DECIMAL},#{item.gameCatId,jdbcType=DECIMAL},#{item.gameId,jdbcType=DECIMAL}
         9             FROM DUAL
        10         </foreach>
        11         )
        12     </insert>

        主要修改:取消values,添加separator=" union all "属性,、foreach 标签新增select

      • 再次运行会报如下错误:Mybatis,oracle,ORA-00933: SQL 命令未正确结束
      • 这个错误主要是数据库本身具备主键自动增长的功能如果没有显示的指定主键策略会报错
      • 解决方案:
posted @ 2017-10-20 15:38  sunny1009  阅读(545)  评论(0)    收藏  举报