基于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 命令未正确结束
- 这个错误主要是数据库本身具备主键自动增长的功能如果没有显示的指定主键策略会报错
- 解决方案:
- 最初原始代码(错误)
- 大批量数据不建议直接insert操作(通过第三方组件或者队列方式)数据库,只是为了说明MyBatis下批量操作
最新同步更新地址:https://www.sunnyblog.top/
感谢您花时间阅读此篇文章,如果您觉得这篇文章你学到了东西也是为了犒劳下博主的码字不易不妨打赏一下吧,让博主能喝上一杯咖啡,在此谢过了!
如果您觉得阅读本文对您有帮助,请点一下左下角“推荐”按钮,您的“推荐”将是我最大的写作动力!另外您也可以选择【关注我】,可以很方便找到我!
本文版权归作者和博客园共有,来源网址:https://www.cnblogs.com/sunny1009 欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利!