在 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 的设计器中使用。
- 避免在构造函数中初始化资源的良好做法。
- 语句等资源,按需创建,不作为成员(字段)。
所以我假设您将拥有使用语句的方法。喜欢 :
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();
而且你还是在完成后立即关闭它,并且不保持资源打开。
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 的设计器中使用。
- 避免在构造函数中初始化资源的良好做法。
- 语句等资源,按需创建,不作为成员(字段)。
所以我假设您将拥有使用语句的方法。喜欢 :
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();
而且你还是在完成后立即关闭它,并且不保持资源打开。