2012-02-19 63 views
5

我試圖向MySQL表中插入一行並獲取其插入ID。我意識到MySQL last_insert_id()函數,我似乎無法讓它工作。目前,我正在嘗試使用註釋爲事務的函數,並且只返回0。我正在使用Spring 3.1。Spring JdbcTemplate無法從MySQL獲取插入ID

@Transactional (propagation = Propagation.REQUIRED, rollbackFor = Exception.class) 
    private long insertTransactionRecord 
    (
     int custID, 
     int porID, 
     String date, 
     short crvID 
    ) { 
     m_template.update ("INSERT INTO " + 
          " transaction " + 
          "(" + 
          " por_id, " + 
          " cust_id, " + 
          " trans_date, " + 
          " crv_id " + 
          ") " + 
          "VALUES " + 
          "(" + 
          " ?, " + 
          " ?, " + 
          " ?, " + 
          " ? " + 
          ")", 
          new Object[] { 
           porID, 
           custID, 
           date, 
           crvID 
          }); 
     return m_template.queryForLong ("SELECT " + 
             " last_insert_id() " + 
             "FROM " + 
             " transaction " + 
             "LIMIT 1"); 
    } 

回答

7

從這裏http://www.codefutures.com/spring-dao/

public int createCompany(Company company) throws SQLException { 
     jdbcTemplate.update(
       "INSERT INTO company (name) VALUES (?)", 
       company.getName() 
     ); 
     return jdbcTemplate.queryForInt("select last_insert_id()"); 
    } 

拍攝,如果你注意到沒有FROM

+0

「FROM」子句的用途是指定我想要的ID表。 'JdbcTemplate'使用連接池,所以我不能保證在同一個連接上。這筆交易本應彌補這一點。謝謝你的建議,但沒有幫助。 – Nik 2012-02-19 16:35:08

+0

使用jdbcTemplate.queryForObject(「select last_insert_id()」,Integer.class) – singhspk 2013-12-04 14:00:33

+0

我不認爲這種方法是線程安全的,是嗎? queryForInt(..)調用可能在發生多次插入後發生,並在其上面插入語句時返回錯誤的ID。 – 2015-01-03 17:53:55

1

The documentation顯示,爲獲得最後一個插入ID的語法是:

SELECT LAST_INSERT_ID()  
+0

我明白這一點。它在'JdbcTemplate'中不起作用。它工作,如果我在MySQL客戶端手動運行它。 – Nik 2012-02-19 16:37:56

+1

如果你明白,爲什麼你使用'SELECT last_insert_id()FROM transaction LIMIT 1'? – 2012-02-19 16:39:34

+0

因爲'JdbcTemplate'使用連接池,所以我不能保證我會從右表獲得ID。包括'FROM'子句在MySQL客戶端中工作。有博客文章暗示了這種做法。 – Nik 2012-02-19 16:41:44

9

使用Spring對這個rathe的內置支持而不是自己做。

SqlUpdate insert = new SqlUpdate(ds, "INSERT INTO company (name) VALUES (?)"); 
insert.declareParameter(new SqlParameter(Types.VARCHAR)); 
insert.setReturnGeneratedKeys(true); 
// assuming auto-generated col is named 'id' 
insert.setGeneratedKeysColumnNames(new String[] {"id"}); 
insert.compile(); 
.... 
GeneratedKeyHolder keyHolder = new GeneratedKeyHolder(); 
insert.update(new Object[]{"test"}, keyHolder); 
System.out.println(keyHolder.getKey().longValue()); 
+2

Spring也在手冊中有一個例子:http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/jdbc.html#jdbc-auto-genereted-keys – Christian 2012-08-12 07:35:15