2010-11-26 28 views
9
  • See this related question for Postgres。出於某種原因,該解決方案對我無效 - 插入語句的返回值始終爲「1」。
  • 請參閱XML based solution的其他問題。我想在不使用XML的情況下做同樣的事情 - 插入一條記錄並找到剛剛添加的記錄的新自動生成的ID。

我沒有找到匹配的註釋<selectkey>(見本open issue) 如何進行?如何返回ids插入mybatis在mysql中帶註釋

檢查mybatis代碼揭示INSERT是通過UPDATE實現的,並且總是返回插入行的數量!所以......除非我完全錯過了一些東西,否則無法使用當前的(3.0.3)實現來實現這一點。

回答

12

<insert>,<update><delete>語句返回受影響行的數量,這與數據庫API常見的相同。

如果爲插入的行生成新ID,它將反映在作爲參數傳遞的對象中。例如,如果您在註釋的插入方法中調用mapper.insert(someObject),那麼在插入之後,可以調用someObject.getId(或類似的)來檢索它。

使用<insert>的選項,可以調整(通過提供SQL語句)和何時(在實際插入之前或之後)生成或檢索標識以及放置對象的位置。

使用MyBatis generator從數據庫模式生成類並查看如何處理插入和更新可能是有益的。具體來說,生成器生成「示例」類,用作臨時容器來傳遞數據。

1

你可以從節約的方法讓你生成的ID, 可以說與ID和名稱屬性的bean,

bean.setName("xxx"); 
mapper.save(bean); 
// here is your id 
logger.debug(bean.getID); 
+0

假設您使用註釋選擇並使用@Options(useGeneratedKeys = true) – Lucky 2016-03-03 09:16:53

20

其實,這是有可能做到這一點,與@Options註解(前提是你使用AUTO_INCREMENT或數據庫中的類似的東西):

@Insert("insert into table3 (id, name) values(null, #{name})") 
@Options(useGeneratedKeys=true, keyProperty="idName") 
int insertTable3(SomeBean myBean); 

注意,如果在SomeBean關鍵屬性名爲「ID」的部分是沒有必要的。還有一個keyColumn屬性可用,對於MyBatis無法自己找到主鍵列的罕見情況。還請注意,通過使用@Options,您正在將您的方法提交給一些默認參數;查閱文檔非常重要(鏈接如下 - 當前版本的第60頁)!

(舊的回答)(相當近)@SelectKey註釋可用於更復雜的密鑰檢索(序列,identity()函數...)。下面介紹一下MyBatis 3 User Guide(PDF)提供的例子:

這個例子顯示使用@SelectKey註釋檢索序列值的 插入前:

@Insert("insert into table3 (id, name) values(#{nameId}, #{name})") 
@SelectKey(statement="call next value for TestSequence", keyProperty="nameId", before=true, resultType=int.class) 
int insertTable3(Name name); 

這個例子顯示使用@SelectKey註釋在插入後檢索標識值:

@Insert("insert into table2 (name) values(#{name})") 
@SelectKey(statement="call identity()", keyProperty="nameId", before=false, resultType=int.class) 
int insertTable2(Name name);