#java #postgresql #jdbc #prepared-statement
#java #PostgreSQL #jdbc #подготовленный оператор
Вопрос:
Согласно разделу документации PostgreSQL: 5.9.6. Предостережения
Исключение ограничений работает только тогда, когда
WHERE
предложение запроса содержит константы. Параметризованный запрос не будет оптимизирован, поскольку планировщик не может знать, какие разделы значение параметра может выбрать во время выполнения.
Существует ли какая-либо библиотека, которая предоставляет какие PreparedStatement
-либо (я имею в виду только средство SQL-инъекции, поскольку мы не могли извлечь выгоду из оптимизированной производительности PreparedStatement
), а также генерирует статическую строку SQL, чтобы мы могли воспользоваться функцией исключения ограничений?
Ответ №1:
Вы можете настроить драйвер PostgreSQL JDBC для переключения на подготовленные операторы после определенного количества вызовов. См. раздел Подключение к базе данных переменной prepareThreshold
, а также перейдите по ссылке в этом разделе.
В вашем случае вы можете либо попробовать значение 0
, либо очень большое число. Я не уверен 0
, означает ли это «использовать подготовленные инструкции немедленно» или «никогда не использовать подготовленные инструкции». Большое количество должно точно предотвращать подготовленные операторы.
Используя этот метод, ваш Java-код все еще используется PreparedStatement
, и драйвер отвечает за правильное цитирование. Протокол между драйвером и сервером будет использовать «неподготовленные» инструкции.
Ответ №2:
Apache commons-lang имеет базовый метод экранирования … Javadoc:
Например,
statement.executeQuery("SELECT * FROM MOVIES WHERE TITLE='"
StringEscapeUtils.escapeSql("McHale's Navy")
"'");
В настоящее время этот метод превращает одинарные кавычки только в двойные одинарные кавычки («Военно-морской флот Макхейла» => «Военно-морской флот Макхейла»). Он не обрабатывает случаи процентов (%) или подчеркивания (_) для использования в ПОДОБНЫХ предложениях.
HTH