C’è un modo per recuperare l’ID autoincrement da una dichiarazione preparata

C’è un modo per recuperare la chiave generata automaticamente da una query DB quando si utilizza una query java con istruzioni preparate.

Ad esempio, so che AutoGeneratedKeys può funzionare come segue.

stmt = conn.createStatement(); stmt.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS); if(returnLastInsertId) { ResultSet rs = stmt.getGeneratedKeys(); rs.next(); auto_id = rs.getInt(1); } 

Però. Cosa succede se voglio fare un inserto con una dichiarazione preparata.

 String sql = "INSERT INTO table (column1, column2) values(?, ?)"; stmt = conn.prepareStatement(sql); //this is an error stmt.executeUpdate(Statement.RETURN_GENERATED_KEYS); if(returnLastInsertId) { //this is an error since the above is an error ResultSet rs = stmt.getGeneratedKeys(); rs.next(); auto_id = rs.getInt(1); } 

C’è un modo per farlo che non conosco. Sembra dalla javadoc che PreparedStatements non può restituire l’ID generato automaticamente.

Sì. Vedi qui Sezione 7.1.9. Cambia il tuo codice in:

 String sql = "INSERT INTO table (column1, column2) values(?, ?)"; stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); stmt.executeUpdate(); if(returnLastInsertId) { ResultSet rs = stmt.getGeneratedKeys(); rs.next(); auto_id = rs.getInt(1); } 

Ci sono un paio di modi, e sembra che diversi driver jdbc gestiscano le cose in modo un po ‘diverso, o per niente in alcuni casi (alcuni ti daranno solo chiavi primarie autogenerate, non altre colonne) ma i moduli di base sono

 stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); 

O utilizzare questo modulo:

 String autogenColumns[] = {"column1","column2"}; stmt = conn.prepareStatement(sql, autogenColumns) 

Sì, c’è un modo. Ho appena trovato questo nascondiglio nel documento java.

Il modo è passare l’id AutoGeneratedKeys come segue

 String sql = "INSERT INTO table (column1, column2) values(?, ?)"; stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); 

Sono uno di quelli che ha navigato attraverso alcuni thread cercando una soluzione a questo problema … e finalmente lo ha fatto funzionare. PER QUELLI CHE UTILIZZANO jdbc: oracle: thin: con ojdbc6.jar SI PREGA DI PRENDERE NOTA: È ansible utilizzare entrambi i metodi: (Metodo 1)

 Try{ String yourSQL="insert into Table1(Id,Col2,Col3) values(SEQ.nextval,?,?)"; myPrepStatement = .prepareStatement(yourSQL, Statement.RETURN_GENERATED_KEYS); myPrepStatement.setInt(1, 123); myPrepStatement.setInt(2, 123); myPrepStatement.executeUpdate(); ResultSet rs = getGeneratedKeys; if(rs.next()) { java.sql.RowId rid=rs.getRowId(1); //what you get is only a RowId ref, try make use of it anyway U could think of System.out.println(rid); } } catch (SQLException e) { // } 

(Metodo 2)

 Try{ String yourSQL="insert into Table1(Id,Col2,Col3) values(SEQ.nextval,?,?)"; //IMPORTANT: here's where other threads don tell U, you need to list ALL cols //mentioned in your query in the array myPrepStatement = .prepareStatement(yourSQL, new String[]{"Id","Col2","Col3"}); myPrepStatement.setInt(1, 123); myPrepStatement.setInt(2, 123); myPrepStatement.executeUpdate(); ResultSet rs = getGeneratedKeys; if(rs.next()) { //In this exp, the autoKey val is in 1st col int id=rs.getLong(1); //now this's a real value of col Id System.out.println(id); } } catch (SQLException e) { // } 

Fondamentalmente, prova a non usare Method1 se vuoi solo il valore di SEQ.Nextval, b’cse restituisce semplicemente il RowID ref che potresti incrinare la tua testa trovando il modo di farne uso, che non si adatta a tutti i tipi di dati che hai provato a lanciare a! Questo può funzionare bene (restituire val effettivo) in MySQL, DB2 ma non in Oracle.

E, spegni lo sviluppatore SQL, il rospo o qualsiasi client che usa la stessa sessione di accesso per eseguire INSERT quando esegui il debug. Potrebbe non influire su di te ogni volta (chiamata di debug) … fino a quando non trovi le tue app bloccate senza eccezioni per un po ‘di tempo. Sì … fermati senza eccezioni!

  Connection connection=null; int generatedkey=0; PreparedStatement pstmt=connection.prepareStatement("Your insert query"); ResultSet rs=pstmt.getGeneratedKeys(); if (rs.next()) { generatedkey=rs.getInt(1); System.out.println("Auto Generated Primary Key " + generatedkey); }