Źle zrozumiałeś wartość zwracaną przez PreparedStatement#execute() .
Proszę uważnie przeczytać javadoc:
Zwroty:
true jeśli pierwszym wynikiem jest ResultSet obiekt; false jeśli pierwszy wynik to liczba aktualizacji lub nie ma wyniku.
W ten sposób zwraca — jak w pełni oczekiwano — false na INSERT zapytanie. Zwraca tylko true na SELECT zapytanie (dla którego zazwyczaj chciałbyś użyć executeQuery() zamiast tego zwraca bezpośrednio ResultSet ).
Jeśli interesują Cię wiersze, których dotyczy problem, użyj PreparedStatement#executeUpdate() zamiast. Zwraca int zgodnie z javadoc:
Zwroty:
(1) liczba wierszy dla instrukcji SQL Data Manipulation Language (DML) lub (2) 0 dla instrukcji SQL, które nic nie zwracają
Zwrócona wartość 1 lub większa wskazywałaby wtedy na pomyślne wstawienie.
Niezwiązane do konkretnego problemu:Twój kod przecieka zasoby bazy danych. Przeczytaj uważnie Jak często połączenie, zestawienie i zestaw wyników powinny być zamykane w JDBC?