Возможно, вы прочитали общий совет «используйте подготовленные заявления для защиты от SQL инъекции». Но этот совет - только половина правды.
Полная истина заключается в том, что вы должны использовать параметры запроса , чтобы отделить ненадежный контент от вашего запроса. Просто случается, что использование параметров запроса требует использования подготовленных операторов, поэтому вы можете отделить шаг подготовки от шага выполнения и связать параметры с подготовленным запросом между этими двумя шагами.
Это помогает защитить от SQL инъекция, потому что подготовка - это когда ваш запрос анализируется. Если вы храните ненадежное содержимое отдельно от запроса до тех пор, пока оно не будет проанализировано, то ненадежное содержимое не может ввести SQL инъекцию.
В вашем запросе нет параметров-заполнителей. Вы конкатенируете свой ненадежный контент в утверждение, как и раньше, что означает, что оно все еще имеет уязвимость SQL.
String queryStatement = "SELECT * FROM jobs WHERE description like '%" + query + "%'";
Должно быть:
String queryStatement = "SELECT * FROM jobs WHERE description like ?";
Поскольку ваш запрос не имеет параметров-заполнителей, при попытке привязки к нему должна быть ошибка:
stmt.setString(1, query);
Выдает ли это исключение? Кажется, вы регистрируете его, поэтому проверьте ваш журнал.