usegeneratedkeys oracle,记mybatis 标签<selectkey>获取oracle数据库自增主键ID坑!

先说说selectkey的用法吧:

使用背景:本次的使用db对象针对oracle,它不像pgSql和mysql可以直接通过useGeneratedKeys="true"就能直接获取。在insert语句中,在Oracle经常使用序列、在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键。使用myBatis的selectKey标签可以实现这个效果。

使用方法:如下图。

然后这是博主mapper.xml的写法:

SELECT "表序列".nextval FROM DUAL

INSERT INTO xx (

xx,

xx,

xx,

xx,

xx

) VALUES (

#{xx,jdbcType=INTEGER},

#{xx,jdbcType=INTEGER},

#{xx,jdbcType=TIMESTAMP},

#{xx,jdbcType=INTEGER},

#{xx,jdbcType=INTEGER}

)这样写看似没问题(xx省略),也能返回值,博主测试的过程中也没发现什么问题,但是在实际业务上发现了一个巨大的坑!!!

坑:就是返回的id跟数据库的id不一致!!查了很多原因,以为是表序列引起的问题,最后发现在插入语句的时候必须手动把id插入进去,what??

inert操作id不是自增么?还得手动插入,这就归根到低是oracle底层实现了,也看了下官方文档也是这么写的。

SELECT "表序列".nextval FROM DUAL

INSERT INTO xx (

id,

xx,

xx,

xx,

xx,

xx

) VALUES (

#{id}

#{xx,jdbcType=INTEGER},

#{xx,jdbcType=INTEGER},

#{xx,jdbcType=TIMESTAMP},

#{xx,jdbcType=INTEGER},

#{xx,jdbcType=INTEGER}

)

这样就解决了返回id不一致的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值