Java ResultSet, SetObject против SetString / SetDate / и т. Д. - PullRequest
20 голосов
/ 08 мая 2011

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

Ответы [ 2 ]

11 голосов
/ 08 мая 2011

Вы можете сделать это.

Например,

preparedStatement = connection.prepareStatement(SQL_INSERT);
SqlUtil.setValues(preparedStatement, user.getName(), user.getPassword(), user.getAge());

с

public static void setValues(PreparedStatement preparedStatement, Object... values) throws SQLException {
    for (int i = 0; i < values.length; i++) {
        preparedStatement.setObject(i + 1, values[i]);
    }
}

Драйвер JDBC выполнит проверку типа.Единственным недостатком может быть (незначительные) накладные расходы, но они незначительны по сравнению с лучшим обслуживаемым кодом, который вы в итоге получите.Кроме того, большинство платформ ORM, таких как Hibernate / JPA, также используют это глубоко под прикрытием.

1 голос
/ 08 мая 2011

В интерфейсе ResultSet нет методов setObject(..). У него есть только метод updateObject(..). Вы имели в виду PreparedStatement.setObject(..)?

В этом случае я думаю, что это не плохая практика, но даже не хорошее решение. Что касается меня, я не очень понимаю необходимость «универсального DAO». Не могли бы вы объяснить эту идею более подробно ..?

...