1. 程式人生 > 實用技巧 >記mybatis 標籤<selectkey>獲取oracle資料庫自增主鍵ID坑!

記mybatis 標籤<selectkey>獲取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不一致的問題。