#java #spring #spring-jdbc #jdbctemplate
#java #spring #spring-jdbc #jdbctemplate
Вопрос:
У меня есть следующий код
public class Foo{
private final NamedParameterJdbcTemplate nJdbcTemplate;
public void bar(....){
String query = "INSERT INTO ....
....
nJdbcTemplate.batchUpdate(query, mapSqlParameterSourcesArray);
}
}
Я хочу получить полный, действительный SQL-скрипт insert, чтобы вставить его в другую базу данных.
Есть ли способ добиться этого в шаблоне spring jdbc?
Ответ №1:
Не в шаблоне jdbc.
Замену заполнителя выполняет не шаблон jdbc. Это драйвер JDBC (или это может быть даже сервер базы данных!). Взгляните на интерфейс PreparedStatement — параметры фактически передаются другими методами, чем оператор.
(Хотя этот интерфейс не допускает именованных параметров, в документации указано, что Spring преобразует именованные параметры в ?
, что делает его подходящим для ввода для этого интерфейса.)
Комментарии:
1. Спасибо за ваш ответ, но не могли бы вы предложить какой-либо обходной путь?
2. К сожалению, я не могу предоставить хорошее решение. Эта замена выполнена в драйвере JDBC, потому что это нетривиально (мы говорим об инъекции SQL и тому подобном здесь). Простым способом было бы просмотреть инструкции и заменить каждую
?
следующим аргументом, но 1) как насчет stirngs, содержащих?
, и 2) вы бы не боялись SQL-инъекции?3. Если в вашем случае использования вы хотите получить полный SQL после его выполнения в базе данных (не до / вместо), вы могли бы попробовать использовать «журнал запросов» базы данных, если база данных поддерживает такую функциональность (обычно это таблица, которая содержит все выполненные инструкции SQL, но чаще всего это отключено по умолчанию по понятным причинам.)
4. Для меня это звучит правильно. Я изучу это в моем postgresql