2016-10-03 8 views
-2
class StudentDAO extends AbstractDAO <Integer, Student> { 

private static final String SQL_SELECT_ALL_STUDENT = "SELECT ID, FIRST_NAME, SECOND_NAME, BIRTH_DATE,ENTER_YEAR FROM STUDENT"; 
private static final String SQL_SELECT_STUDENT_BY_ID = "SELECT FIRST_NAME, SECOND_NAME, BIRTH_DATE,ENTER_YEAR FROM STUDENT WHERE ID=?"; 
private static final String SQL_SELECT_STUDENT_BY_LASTNAME ="SELECT id,FIRST_NAME,BIRTH_DATE,ENTER_YEAR FROM. STUDENT WHERE SECOND_NAME=?"; 
private static final String SQL_DELETE_STUDENT_BY_ID = "DELETE FROM STUDENT WHERE ID =?"; 
private static final String SQL_INSERT_STUDENT = "INSERT INTO STUDENT"+"(FIRST_NAME, SECOND_NAME, BIRTH_DATE, ENTER_YEAR)"+"VALUES (?,?,?,?)"; 
private PreparedStatement preparedStatement1; 
private PreparedStatement preparedStatementSelectById; 
private PreparedStatement preparedStatementfindAll; 
private PreparedStatement preparedStatementDeleteStudentById; 
private PreparedStatement preparedStatementInsertStudent; 

public StudentDAO(Connection connection) throws DAOException, SQLException { 
    super(connection); 
    try { 
     preparedStatementInsertStudent =connection.prepareStatement(SQL_INSERT_STUDENT); 
     preparedStatement1 = connection.prepareStatement(SQL_SELECT_STUDENT_BY_LASTNAME); 
     preparedStatementfindAll = connection.prepareStatement(SQL_SELECT_ALL_STUDENT); 
     preparedStatementDeleteStudentById = connection.prepareStatement(SQL_DELETE_STUDENT_BY_ID); 
     preparedStatementSelectById = connection.prepareStatement(SQL_SELECT_STUDENT_BY_ID); 
    } catch (Exception e) { 
     throw new DAOException(e); 
    } 

} 

コードサンプルが高くなると、クラスのデザイナで使用する場合にpsを閉じる方法が難しくなりました。クラスのコンストラクタでPrepareStatemenを閉じる

答えて

1
  1. コンストラクタでのリソースの初期化を避けることをお勧めします。
  2. のようなリソースは、要求に応じて作成し、メンバー(フィールド)として持っていないことが条件です。

したがって、私はあなたがステートメントを使用するメソッドを持っていると仮定します。やるような:

public void executepreparedStatementInsertStudent (Connection connection){ 
     PreparedStatement preparedStatementInsertStudent =connection.prepareStatement(SQL_INSERT_STUDENT); 
    // create statement 
    // execute query 
    // close statement 

} 
public void executePreparedStatementDeleteStudentById (Connection connection){ 
PreparedStatement preparedStatementDeleteStudentById = connection.prepareStatement(SQL_DELETE_STUDENT_BY_ID); 
    // create statement 
    // execute query 
    // close statement 
} 

.... としそう

仕様は、使用を複数回再について言う、私は彼らが意味すると考えてい

Updateでの場合のように:

PreparedStatement ps = connection.prepare("SQL_DELETE_STUDENT_BY_ID"); 

for (Student student : students) { 
    ps.setInt(1, student.getId()); 
    ps.executeUpdate(); 
} 

ps.close(); 

あなたが完了したらすぐに閉じて、リソースを開いたままにしないでください。

+0

しかし、この場合は、PSの繰り返しメソッドコールの場合、接続プールを使用する場合は、ドキュメントと矛盾する「作成して何回も使用する」という原則に反して作成されます。 – Evgeni

+0

は問題ありません。 dbがステートメントを再度コンパイルする必要はないという主な目標。 たとえば、apache dsの場合 http://commons.apache.org/proper/commons-dbcp/configuration.html 「poolPreparedStatements」を探します。 – magulla

関連する問題