Você não entendeu o valor de retorno de
PreparedStatement#execute() . Leia atentamente o javadoc:
Devoluções:
truese o primeiro resultado for umResultSetobjeto;falsese o primeiro resultado for uma contagem de atualização ou se não houver resultado.
Assim, ele retorna — como esperado —
false em um INSERT inquerir. Ele retorna apenas true em um SELECT query (para a qual você normalmente gostaria de usar executeQuery() em vez disso, que retorna diretamente um ResultSet ). Se você estiver interessado nas linhas afetadas, use
PreparedStatement#executeUpdate() em vez de. Ele retorna um int conforme o javadoc:Devoluções:
ou (1) a contagem de linhas para instruções SQL Data Manipulation Language (DML) ou (2) 0 para instruções SQL que não retornam nada
Um valor de retorno de 1 ou maior indicaria uma inserção bem-sucedida.
Não relacionado para o problema concreto:seu código está vazando recursos do banco de dados. Por favor, leia com atenção Com que frequência Connection, Statement e ResultSet devem ser fechados no JDBC?