Mybatis & Oracle 中用insert和foreach进行批量插入
2017-10-25 17:35
746 查看
注意:在这里遇到了一个巨坑,先提出来,以防大家被坑:
有时候在万事俱备后,执行控制台会报以下错误
原因是:
<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>
有时候在万事俱备后,执行控制台会报以下错误
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>
相关文章推荐
- 使用mybatis在oracle进行批量插入的insert语句
- Oracle+Mybatis的foreach insert批量插入报错的快速解决办法
- Oracle+Mybatis的foreach insert批量插入报错的快速解决办法
- Mybatis结合Oracle的foreach insert批量插入报错!
- Oracle+Mybatis的foreach insert批量插入报错的解决办法
- Mybatis+Oracle进行数据的批量插入和更新
- MyBatis使用foreach进行批量插入遇到的问题以及解决方法
- oracle+mybatis 使用动态Sql当插入字段不确定的情况下实现批量insert
- oracle+mybatis 使用动态Sql当插入字段不确定的情况下实现批量insert
- oracle+mybatis 使用动态Sql当插入字段不确定的情况下实现批量insert
- mybatis 利用foreach insert 批量插入数据
- mybatis、oracle批量插入配置
- MyBatis foreach语句批量插入数据
- Oracle:用一条 INSERT 语句批量插入多条记录
- spring mybatis组合下对oracle的批量插入
- 使用mybatis 对 oracle数据批量插入、更新
- 使用jdbc进行多数据的批量插入数据库(Oracle)
- MyBatis针对ORACLE的批量插入
- mybatis实现oracle批量插入,带序列(记录一下)
- mybatis注解方式进行批量插入