usegeneratedkeys oracle,记mybatis 标签<selectkey>获取oracle数据库自增主键ID坑!
先说说selectkey的用法吧:使用背景:本次的使用db对象针对oracle,它不像pgSql和mysql可以直接通过useGeneratedKeys="true"就能直接获取。在insert语句中,在Oracle经常使用序列、在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键。使用myBatis的selectKey标签可以实现这个效果。使用方法:如下图。然后这是博主m
先说说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)