2016-12-10 4 views
1

Я изучаю, как создать слой данных с помощью JDBC с этим DAO tutorial. Тем не менее, я застрял на этом этапе: PreparedStatement statement = prepareStatement(connection, SQL_UPDATE, false, values); Почему именно pureStatement используется таким образом?Что означают эти значения/параметры в PreparedStatement?

Буду благодарен за любые объяснения и предложения.

Я просмотрел documentation и искал соответствующие примеры, но не нашел никакого объяснения такой конструкции. Я знаком с выражениями, как это, когда prepareStatement метод вызывается связи объект:

Connection connection = daoFactory.getConnection(); 
PreparedStatement statement = connection.prepareStatement(SQL); 

Но я не понимаю, почему PreparedStatement реализуется как в примере ниже:

public void update(User user) throws DAOException { 
    if (user.getId() == null) { 
     throw new IllegalArgumentException("User is not created yet, the user ID is null."); 
    } 

    Object[] values = { 
     user.getEmail(), 
     user.getFirstname(), 
     user.getLastname(), 
     toSqlDate(user.getBirthdate()), 
     user.getId() 
    }; 

    try (
     Connection connection = daoFactory.getConnection(); 
     PreparedStatement statement = prepareStatement(connection, SQL_UPDATE, false, values); 
    ) { 
     int affectedRows = statement.executeUpdate(); 
     if (affectedRows == 0) { 
      throw new DAOException("Updating user failed, no rows affected."); 
     } 
    } catch (SQLException e) { 
     throw new DAOException(e); 
    } 
} 
+1

'prepareStatement' - это определенный пользователем метод? Отправьте код этого метода. –

+0

@JitinKodian Я также подумал, что это может быть какой-то определенный пользователем метод. Но не нашли его здесь в [Учебном пособии BalusC:] (http://balusc.omnifaces.org/2008/07/dao-tutorial-data-layer.html) –

ответ

0

Этот метод дается в учебнике, это часть DAOUtil class:

public static PreparedStatement prepareStatement 
    (Connection connection, String sql, boolean returnGeneratedKeys, Object... values) 
     throws SQLException 
{ 
    PreparedStatement statement = connection.prepareStatement(sql, 
     returnGeneratedKeys ? Statement.RETURN_GENERATED_KEYS : Statement.NO_GENERATED_KEYS); 
    setValues(statement, values); 
    return statement; 
} 

Метод DaoUtil prepareStatement используется DaoImpl в конструкции try-with-resources. То, как работает инициализация, не допускает нескольких операторов, каждый ресурс должен быть инициализирован одним выражением. Этот метод объединяет связанный с этим код инициализации, поэтому код инициализации ресурсов может вызывать его.

Также таким образом параметры в PreparedStatement приведены более декларативно, а код для их установки скрыт в утилите. Параметрирование очень слабоподобно и подвержено ошибкам (нет проверки типов, среди других проблем), то, что показано, полезно для краткого руководства, но не для лучшего копирования на реальные проекты.

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

Важно то, что соединение и подготовленное состояние закрываются. В противном случае вы можете поэкспериментировать с разными способами написания и сравнить полученный код.