2016-12-10 5 views
1

私は、このDAO tutorialでJDBCを使ってデータレイヤーを作成する方法を学んでいます。 しかし、私はこの時点で立ち往生しています:PreparedStatement statement = prepareStatement(connection, SQL_UPDATE, false, values);なぜprepareStatementはこの方法で使用されますか?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メソッドは、try-with-resources構造内でDaoImplによって使用されます。初期化の方法は複数のステートメントを許可しないため、各リソースは1つの式で初期化する必要があります。このメソッドは関連する初期化コードをまとめてグループ化し、リソース初期化コードがそれを呼び出すことができます。

このようにしても、PreparedStatementのパラメータはより宣言的な方法で与えられ、パラメータを設定するコードはユーティリティメソッド内に隠されます。パラメータ設定は非常に緩やかでエラーが起こりやすい(他の問題のなかでもタイプチェックはありません)、簡潔なチュートリアルには適していますが、実際のプロジェクトではコピーするのに最適ではありません。

パラメータ設定コードがSQLExceptionをスローすると、PreparedStatementはメソッド呼び出しによって返されず、閉じられません。実際には、これは通常、恐ろしいことではありません SQLでプレースホルダとパラメータを一致させるエラーがある場合(悪化しているという意味です)。

重要なことは、接続と準備文が閉じられることです。それ以外の場合は、これを書いて結果のコードを比較するさまざまな方法で試すことができます。

関連する問題