Bạn đã hiểu sai giá trị trả về của PreparedStatement#execute() .
Vui lòng đọc kỹ javadoc:
Trả về:
truenếu kết quả đầu tiên làResultSetvật;falsenếu kết quả đầu tiên là số lượng cập nhật hoặc không có kết quả.
Do đó, nó trả về - như hoàn toàn mong đợi - false trên một INSERT truy vấn. Nó chỉ trả về true trên SELECT truy vấn (tuy nhiên bạn thường muốn sử dụng executeQuery() thay vào đó trả về trực tiếp một ResultSet ).
Nếu bạn quan tâm đến các hàng bị ảnh hưởng, hãy sử dụng PreparedStatement#executeUpdate() thay thế. Nó trả về một int theo javadoc:
Trả về:
hoặc (1) số hàng cho câu lệnh Ngôn ngữ thao tác dữ liệu SQL (DML) hoặc (2) 0 cho câu lệnh SQL không trả về gì
Khi đó giá trị trả về bằng 1 hoặc lớn hơn sẽ cho biết việc chèn thành công.
Không liên quan vấn đề cụ thể:mã của bạn đang làm rò rỉ tài nguyên DB. Vui lòng đọc kỹ Tần suất kết nối, Câu lệnh và Bộ kết quả được đóng trong JDBC?