Подтвердить что ты не робот

Использование подготовленного оператора и переменной bind Order By в Java с драйвером JDBC

Я использую

  • jdbcTemplate для подключения JDBC к базе данных mySQL
  • подготовленные заявления, чтобы максимально защитить себя от атак SQL-инъекций.
  • нужно принимать запросы от пользователя для сортировки данных по любому из десяти разных столбцов.
  • следующее утверждение

    jdbcTemplate.query("SELECT * FROM TABLE1 ORDER BY ? ?", colName, sortOrder);
    

Конечно, это не работает, потому что привязки переменных не должны указывать имена столбцов только значения параметров для выражений в запросе.

Итак... как люди решают эту проблему? Просто выполнение сортировки в Java-коде кажется легким решением, но поскольку я получаю переменную строку для столбца для сортировки, а переменная, сообщающая мне порядок сортировки..., что уродливое число условий компаратора обложка. Это похоже на то, что это должна быть общая проблема с общим шаблоном для ее решения...

4b9b3361

Ответ 1

Заместители ? могут использоваться только для значений параметров, но не по направлениям столбцов и порядков сортировки. Таким образом, стандартный способ сделать это, как указано, например, здесь - использовать String # format() или что-то похожее на добавление колонки имя и порядок в вашем запросе.

Другим вариантом является использование Spring Data JPA, где вы можете передать вашему методу в качестве аргумента экземпляр типа Sort который может содержать всю необходимую информацию для сортировки базы данных.

Ответ 2

Я бы просто конкатенацию имени столбца и порядка SQL-запроса, но только после

  • подтверждение того, что имя и порядок столбцов действительны в этом контексте.
  • санировать их, чтобы противостоять любой попытке атаки SQL Injection.

Я считаю, что это эффективно по сравнению с получением результатов на прикладном уровне и их сортировкой здесь.