先说说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不一致的问题。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐