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

Mybatis对Oracle批量插入的配置

2016-09-09 21:39 477 查看
项目里使用了MyBatis做持久层,数据库是Oracle,用到了Batch Insert 功能,因为以前做的都是MySQL,也做过PostgreSQL数据库,批量插入的语句都相同,但是在Oracle上就不好使了。后来网上搜了下,大致的写法有两种:

<insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="false">
insert into USER_CARE_SITE (USER_ID, CARE_SITE_ID)
<foreach collection="list" item="item" index="index" separator="union all" >
(select #{item.userId,jdbcType=INTEGER}, #{item.careSiteId,jdbcType=INTEGER} from dual)
</foreach>
</insert>
<insert id="batchInsert" parameterType="java.util.List">
INSERT ALL
<foreach collection="list" item="item">
INTO USER_CARE_SITE (USER_ID, CARE_SITE_ID)
VALUES ( #{item.userId,jdbcType=INTEGER}, #{item.careSiteId,jdbcType=INTEGER} )
</foreach>
SELECT * FROM DUAL
</insert>


但是我这边的控制台始终报ORA-00933: SQL 命令未正确结束,然后我就把语句直接拷贝到sqldeveloper里面执行,都能工作。然后比对自己的代码和网友的代码,几乎是一模一样的啊,但是MyBatis 始终通不过,所以我就在猜这个可能是MyBatis里面的错误。
然后就google到了网友 mybatis批量插入数据到oracle ,里面提到了 “原因竟是mybatis批量插入oracle时需要显式指定为 useGeneratedKeys="false" 不然报错~~~”。测试下,果然可以,但是其他网友的能不设这个属性都可以工作,是因为他们在 MyBatis 的配置文件里面(我的是mybatis-config.xml )要么没设这个属性值,因为默认值就是false,
要么就是将这个值设置为 false 了,而我的偏偏就将其设置为 true,悲哀。。。。

<!-- 允许 JDBC 支持生成的键。 需要适合的 驱动。 如果设置为 true 则这个设置强制 生成的键被使用, 尽管一些驱动拒绝兼 容但仍然有效(比如 Derby), 默认false -->
<setting name="useGeneratedKeys" value="false" />

不知道这个属性设置为 false 后,哪些功能会受到影响,这个我还没碰到。这次写出来就是为了方便大家在检索问题的时候多一个答案来源。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息