記mybatis 標簽 獲取oracle數據庫自增主鍵ID坑!


先說說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不一致的問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM