您的位置:首页 > 数据库 > Oracle

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

2017-10-25 17:35 746 查看
注意:在这里遇到了一个巨坑,先提出来,以防大家被坑:

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


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

<span style="white-space:pre">  </span><insert id="saveLanguageType" parameterType="map" flushCache="false">  

        <selectKey resultType="java.lang.String" order="BEFORE" keyProperty="ID">    

            <span style="white-space:pre">  </span>SELECT SQ_SYS.Nextval AS ID from DUAL    

        </selectKey>    

        insert into  

        sys_language_type (  

            ID,  

            UPDATE_TIME  

        ) values (  

            #{ID},  

            #{UPDATE_TIME}  

        )  

    </insert>  

获取方式:map.get("ID");

2:批量插入  传入参数list

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

[sql] view
plain copy

<insert id="saveLanguagekeyValue" parameterType="java.util.List" useGeneratedKeys="false" flushCache="false">  

    insert into table  

    (  

        ID,           

        UPDATE_TIME  

    )   

    SELECT   

        SQ_SYS.NEXTVAL AS ID, A.*  

    FROM  

        (  

        <foreach collection="list" item="item"  index="index" separator="UNION ALL">  

            SELECT  

                #{item.UPDATE_TIME}   

            FROM dual  

        </foreach>  

        ) A   

</insert>  

解释:将数据存放在虚表中读出来对应的序列值也就是自增长的ID,在进行插入语句。

3:批量更新 传入参数list

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

[sql] view
plain copy

<update id="Updates" parameterType="java.util.List" flushCache="false">  

    begin  

    <foreach collection="list" item="item" index="index" open="" close="" separator=";">  

        update table  

        <set>  

            UPDATE_TIME =${item.UPDATE_TIME}  

        </set>  

        <span style="white-space:pre">  </span>where ID         =${item.ID}   

    </foreach>  

     ;end;  

</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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: