2012-02-19 6 views
5

MySQLテーブルに行を挿入しようとしましたが、そのIDが挿入されています。私は、MySQLのlast_insert_id()関数を知っている、私はそれを動作させるように見えることはできません。現在、トランザクションとして注釈を付けられた関数を使用しようとしていますが、返されるのは0だけです。私はSpring 3.1を使用しています。Spring JdbcTemplateがMySQLからInsert IDを取得できない

SELECT LAST_INSERT_ID()  

答えて

7

Springのビルトインサポートあなた自身でそれをするよりも。

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()); 
+0

'FROM'句の目的は、IDを取得するテーブルを指定することです。 'JdbcTemplate'は接続プーリングを使用するので、同じ接続であることが保証されていません。取引はこれを是正することになっていました。あなたの提案は助けにはなりませんでした。 – Nik

+0

jdbcTemplate.queryForObject( "select last_insert_id()"、Integer.class)を使用してください – singhspk

+0

私はアプローチがスレッドセーフではないと思いますか? queryForInt(..)呼び出しは、複数の挿入が行われた後に実行され、その上の挿入ステートメントに間違ったIDを返します。 –

1

The documentationが最後のインサートIDを取得するための構文であることを明らかにし、ここで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()"); 
    } 

から取ら

@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"); 
    } 
+0

私はそれを理解しています。 'JdbcTemplate'では動作しません。 MySQLクライアントで手動で実行すると動作します。 – Nik

+1

それを理解していると、なぜあなたは 'SELECT last_insert_id()FROM transaction LIMIT 1'を使用していますか? –

+0

'JdbcTemplate'は接続プールを使用しているので、正しい表からIDを取得することは保証できません。 'FROM'節を含むことは、MySQLクライアントで動作します。このプラクティスを提案するブログ記事があります。 – Nik

9

用途:あなたは何FROM

がありません気付いた場合
+2

春にはマニュアルの例もあります:http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/jdbc.html#jdbc-auto-genereted-keys – Christian

関連する問題