先說說selectkey的用法吧:
使用背景:本次的使用db對象針對oracle,它不像pgSql和mysql可以直接通過useGeneratedKeys="true"就能直接獲取。在insert語句中,在Oracle經常使用序列、在MySQL中使用函數來自動生成插入表的主鍵,而且需要方法能返回這個生成主鍵。使用myBatis的selectKey標簽可以實現這個效果。
使用方法:如下圖。
然后這是博主mapper.xml的寫法:
<selectKey resultType="long" order="BEFORE" keyProperty="id">
SELECT "表序列".nextval FROM DUAL
</selectKey>
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底層實現了,也看了下官方文檔也是這么寫的。
<selectKey resultType="long" order="BEFORE" keyProperty="id">
SELECT "表序列".nextval FROM DUAL
</selectKey>
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不一致的問題。