trzeba będzie użyć metody executeUpdate(), aby wykonać INSERT, gdy trzeba użyć metody executeQuery(), aby wykonać SELECT. Wynika to z wymagań nałożonych przez specyfikację JDBC na ich zwyczajów:
Z dokumentacji API Java dla Statement.executeQuery():
Wykonuje daną instrukcję SQL, która zwraca jedną ResultSet obiekt.
Parametry:
SQL - instrukcja SQL do wysłania do bazy danych, zazwyczaj statyczny SQL SELECT
iz dokumentacji API Java dla Statement.executeUpdate():
Wykonuje daną instrukcję SQL, która może być instrukcją INSERT, UPDATE lub DELETE lub instrukcją SQL, która niczego nie zwraca, taka jak instrukcja SQL DDL.
Parametry:
sql - SQL Data Manipulation Language (DML) oświadczenie, takich jak INSERT, UPDATE lub DELETE; lub instrukcja SQL, która nie zwraca niczego, takiego jak instrukcja DDL.
Twój kod (pseudo-kod zamieszczone tutaj) powinien pojawić się jako:
statement.executeUpdate("INSERT INTO Sessions(id_user) VALUES(1)"); // DML operation
statement.executeQuery("SELECT LAST_INSERT_ID()"); // SELECT operation
I oczywiście MySQL documentation demonstrates how to perform the same activity for AUTO_INCREMENT columns, który jest podobno to, czego potrzebujesz.
Jeśli trzeba wykonać oba razem w tej samej transakcji, poprzez złożenie oświadczenia w jeden ciąg z średnikiem oddzielając je jak następuje:
statement.execute("INSERT INTO Sessions(id_user) VALUES(1); SELECT LAST_INSERT_ID() FROM Sessions LIMIT 1;");
wtedy musisz użyć metoda execute(). Zauważ, że zależy to od wsparcia oferowanego przez Bazę Danych i sterownik JDBC dla grupowania instrukcji w jednym wykonaniu(). Jest to obsługiwane w Sybase i MSSQL Server, ale nie sądzę, że jest obsługiwane w MySQL.
w MySQL, można zrobić transakcji wykonując 'execute ("start transakcji") 'na początku i kiedy wszystko jest zrobione' wykonaj ("zatwierdz") 'do zatwierdzenia lub' wykonaj ("wycofanie") ', aby anulować. To zastąpi wszelkie ustawienia "autocommit", które możesz mieć dla połączenia. ** Tylko dla silnika obsługującego transakcje, np. InnoDB ** – Johan
@Johan, tak to prawda. Nie byłem pewien, czy było to możliwe przy użyciu JDBC, gdzie można użyć 'Connection.setAutoCommit (false) ;, a więc pominięto to. Problem dotyczył także użycia 'executeQuery' i' executeUpdate'. –