在 class 的构造函数中关闭 PrepareStatemen

closing of the PrepareStatemen in the constructor of a class

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 以防它们在 class 的设计器中使用。

  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
}

..... 等等

更新

当规范多次提到重新使用时,我相信他们指的是这样的情况:

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

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

ps.close();

而且你还是在完成后立即关闭它,并且不保持资源打开。