Лучший способ указать отсутствие изменений при обновлении строки с помощью Java PreparedStatement - PullRequest
2 голосов
/ 29 августа 2011

Я создаю метод для обновления строки в базе данных SQL Server 2008.SQL String выглядит примерно так:

private static final String UPDATE_ROW = 
    "UPDATE MyTable SET FieldOne = ?, FieldTwo = ? " +
    "WHERE IDField = ?";

Это, конечно, упрощено.Но суть в том, что не все поля обязательно изменятся.Я знаю, что с прямым SQL вы можете просто ввести имя поля для значения, и ничего не изменится;тем не менее, я не знаю, как это сделать с Java PreparedStatement.

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

Ответы [ 3 ]

1 голос
/ 10 сентября 2011

Я не смог найти способ сделать то, что описал, поэтому я прочитал значения обновляемых вещей и передал эти значения.

0 голосов
/ 30 августа 2011

Будет намного эффективнее, если вы создадите специализированные операторы UPDATE, которые только указывают измененные столбцы.

Если вы всегда обновляете все столбцы, вы, к примеру, создаете много накладных расходов. обновление индексированных столбцов, что также приведет к обновлению соответствующего индекса (и без фактической необходимости в этом).

Это произойдет, даже если вы укажете UPDATE foo SET bar = bar, если я не ошибаюсь. Я не думаю, что SQL Server оптимизирует такие обновления.

0 голосов
/ 29 августа 2011

Хорошо, что вы пытаетесь избежать создания специального оператора для каждого обновления.

Не связаны ли поля между собой?Потому что, если они взаимосвязаны, обновление лучше поддерживать согласованность между полями.Поэтому вам нужно сначала прочитать значения, а затем записать все их обратно - как измененные, так и неизмененные.

Если они действительно совершенно не связаны друг с другом, необходимо выполнить серию обновлений вв одно и то же время.

Обычно каждый оказывается где-то посередине - есть кластеры полей, которые взаимосвязаны.Например, запись Person, которая содержит несколько полей, связанных с BillingAddress.В таких случаях подготовьте оператор для каждой группы связанных полей.

Если вы пытаетесь избежать затрат на чтение (чтобы получить текущие значения), тогда рассмотрите хранимую процедуру, в которой неизменны значения полейкодируются значениями NULL.

Если вы не используете ORM, вы также можете рассмотреть возможность использования курсорного ResultSet и обновить поля одно за другим, а затем зафиксировать изменения, используя updateRow().См. java.sql.ResultSet .Чтобы сделать то же самое, что и Javadoc, используя PreparedStatement, вам нужно будет использовать вариант Connection.prepareStatement(...).

...