PreparedStatement? Да, конечно. Но я думаю, что есть еще один шаг: проверка ввода от пользовательского интерфейса и привязка к объектам перед приближением к базе данных.
Я вижу, где связывание строки в PreparedStatement может по-прежнему делать вас уязвимыми для атаки SQL-инъекцией:
String userInput = "Bob; DELETE FROM FOO";
String query = "SELECT * FROM FOO WHERE NAME = ?";
PreparedStatement ps = connection.prepareStatement(query);
ps.setString(1, userInput);
ps.executeQuery();
Я должен признать, что сам не пробовал, но если это возможно удаленно, я бы сказал, что PreparedStatement необходим, но не достаточен. Проверка и привязка на стороне сервера является ключевым.
Я бы порекомендовал сделать это с помощью API привязки Spring.