簡體   English   中英

MyBatis 3 + PostgreSQL-插入時獲取主鍵值

[英]MyBatis 3 + PostgreSQL - get primary key value on insertion

我有一個Maven項目,該項目使用Java Spring,MyBatis和MyBatis-Spring將對象映射到PostgreSQL數據庫。 我希望能夠在插入新記錄的同時查詢主鍵的值,但尚未找到一種有效的方法。 我當前的實現未返回正確的值; 它似乎總是返回1。

這是查詢的映射器的XML配置:

<insert id="registerNewUser" parameterType="com.hunter.databasejar.User">
    <selectKey keyProperty="ID" resultType="int">
      SELECT currval('"Users_ID_seq"')
    </selectKey>    
    insert into "Users" ("Username", "FirstName", "LastName") values (#{username}, #{firstName}, #{lastName})
</insert>

在Java中,我編寫以下代碼,並且i的值始終為1。

int i = sqlSession.insert("UserMapper.registerNewUser", user);

我還嘗試過更改XML配置,以嘗試從SQL“返回”語法,但始終將i值設為-1。

<insert id="registerNewUser" parameterType="com.hunter.databasejar.User">
    insert into "Users" ("Username", "FirstName", "LastName") values (#{username}, #{firstName}, #{lastName}) returning "ID"
</insert>

我的項目正在使用MyBatis 3.2.4。

我認為您需要將keyProperty的大小寫更改為具有合適設置程序的id

setId(int value);

AFAIK,無法為大寫字段創建與Javabeans兼容的setter。

但是,您看到的返回值是插入的行數,而不是分配的主鍵值。 MyBatis似乎沒有辦法利用有用的(但非標准的)返回子句。

要獲取鍵值,您需要在selectKey聲明中使用order=選項。 這個問題對於PostgreSQL有幾個選項。 從MyBatis“ <插入>”映射的方法返回值 。所描述的技術將更新提供給該方法的對象中的id字段。

我使用的是Oracle數據庫,因此沒有資格推薦PostgreSQL的答案。 但要注意的是,如果order="BEFORE"選項適用於PostgreSQL,則它與Oracle兼容。

我發現我的問題是我有兩列帶有“ id”的列。 MyBatis試圖將我的名為“ CognitoID”的列映射到普通的舊“ ID”列,並且在無法將Cognito ID轉換為int時崩潰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM