Mybatis & Oracle 中用insert和foreach进行批量插入

注意:在这里遇到了一个巨坑,先提出来,以防大家被坑:

有时候在万事俱备后,执行控制台会报以下错误

Mybatis,oracle,ORA-00933: SQL 命令未正确结束

原因是:

<insert id="insert_" useGeneratedKeys="false">
</insert>
批量插入时,如果没有主键,一定要显式指定useGeneratedKeys为false,否则会报: SQL 命令未正确结束

解决方法查自 : http://blog.csdn.net/dou612/article/details/51427566



----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


接下来进入正题:

转自 : http://blog.csdn.net/dzhuqiaolun/article/details/54864521


1:返回插入新数据的主键(主键序列自增)

[sql]  view plain  copy
  1. <span style="white-space:pre">  </span><insert id="saveLanguageType" parameterType="map" flushCache="false">  
  2.         <selectKey resultType="java.lang.String" order="BEFORE" keyProperty="ID">    
  3.             <span style="white-space:pre">  </span>SELECT SQ_SYS.Nextval AS ID from DUAL    
  4.         </selectKey>    
  5.         insert into  
  6.         sys_language_type (  
  7.             ID,  
  8.             UPDATE_TIME  
  9.         ) values (  
  10.             #{ID},  
  11.             #{UPDATE_TIME}  
  12.         )  
  13.     </insert>  
获取方式:map.get("ID");

2:批量插入  传入参数list

注:需配置 useGeneratedKeys="false",才用自定义主键。虽默认为false,但是还是需要配置。

[sql]  view plain  copy
  1. <insert id="saveLanguagekeyValue" parameterType="java.util.List" useGeneratedKeys="false" flushCache="false">  
  2.     insert into table  
  3.     (  
  4.         ID,           
  5.         UPDATE_TIME  
  6.     )   
  7.     SELECT   
  8.         SQ_SYS.NEXTVAL AS ID, A.*  
  9.     FROM  
  10.         (  
  11.         <foreach collection="list" item="item"  index="index" separator="UNION ALL">  
  12.             SELECT  
  13.                 #{item.UPDATE_TIME}   
  14.             FROM dual  
  15.         </foreach>  
  16.         ) A   
  17. </insert>  
解释:将数据存放在虚表中读出来对应的序列值也就是自增长的ID,在进行插入语句。

3:批量更新 传入参数list

注:与MySQL的区别是在语句前后加 begin    ;end;

[sql]  view plain  copy
  1. <update id="Updates" parameterType="java.util.List" flushCache="false">  
  2.     begin  
  3.     <foreach collection="list" item="item" index="index" open="" close="" separator=";">  
  4.         update table  
  5.         <set>  
  6.             UPDATE_TIME =${item.UPDATE_TIME}  
  7.         </set>  
  8.         <span style="white-space:pre">  </span>where ID         =${item.ID}   
  9.     </foreach>  
  10.      ;end;  
  11. </update>  
4:批量删除  与 MySQL的一样。



运行通过。在Oracle的版本中,有几点需要注意的:

        1.SQL中没有VALUES;

        2.<foreach>标签中的(selece ..... from dual);

        3.<foreach>标签中的separator的属性为"UNION ALL",将查询合并结果集。



当不使用Mybatis的主键生成策略,而是使用后台自己生成的UUID作为一个属性传入当做主键时候:

<insert id="insertAttractionsBatch" parameterType="java.util.List" useGeneratedKeys="false">
insert into ATTRACTIONS (
ID, NAME, LONGITUDE, LATITUDE,  UPDATE_TIME
)
  <foreach collection="list" item="item" index="index" separator="union all" > 
      (select  
	#{item.id,jdbcType=VARCHAR}, #{item.name,jdbcType=VARCHAR}, 
	#{item.longitude,jdbcType=DECIMAL}, #{item.updateTime,jdbcType=TIMESTAMP}
       from dual)
    </foreach>
</insert>






评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值