Установка значения по умолчанию через PreparedStatement

Доброго времени суток.

Вопрос: по какой причине в класс PreparedStatement разработчики не стали добавлять стандартный способ установить значение по умолчанию для определенного поля? (Под стандартным способом имеется ввиду что-то вроде метода setDefault().)

Зачем мне это понадобилось: Иногда при однотипных update или insert запросах необходимо вставить/обновить значение для некоторой колонки значением по умолчанию. Что-то вроде insert into MyTable (column1, column2) values (someValue, DEFAULT); Причем колонок, для которых предусмотрено значение по умолчанию может быть много. И при этом хочется использовать преимущество PreparedStatement - оптимизация однотипных запросов и профилактика от SQL-инъекций. Пояснение в коде:

//Все колонки могут принимать значение по умолчанию
String query = "INERT INTO MyTable (col1,col2,col3) VALUES (?,?,?)";
PreparedStatement ps = new PreparedStatement(query);

//Задаем значение для всех колонок
ps.setString(1, "some value");
ps.setString(2, "some value 2");
ps.setString(3, "some value 3");
ps.executeUpdate();

//А теперь хотелось бы используя ЭТОТ ЖЕ ОБЪЕКТ задать для col3 значение по
//умолчанию.
ps.setString(1, "new value");
ps.setNull(2, Types.VARCHAR);
ps.setDefault(3); //Такого метода в PreparedStatement почему-то нет

Создавать по объекту PreparedStatement для каждого DEFAULT случая крайне неоптимально. Обращаясь к комбинаторике - в этом примере с 3 колонками придется создать шесть различных объектов PreparedStatement. Явно многовато. А если таких колонок в одном запросе больше? Надеюсь мне удалось объяснить проблему.


Ответы (1 шт):

Автор решения: Alexey R.

Просто создайте объект стейтмента с установленными "значениями по умолчанию" в нужных позициях. Затем переиспользуйте объект, изменяя только те позиции, которые требуется менять.

Так, у Вас будет набор позиций в запросе, которые будут сохранять значения от запроса к запросу ("по умолчанию") и набор позиций, значения для которых будет переустанавливаться заново перед новым запуском.

Переиспользование объекта стейтмента является нормальной практикой. Подробности тут.

→ Ссылка