【问题标题】:closing of the PrepareStatemen in the constructor of a class在类的构造函数中关闭 PrepareStatemen
【发布时间】:2016-10-03 20:17:13
【问题描述】:
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,如何关闭 ps 会遇到困难。

【问题讨论】:

    标签: java prepared-statement dao


    【解决方案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
    }
    

    .... 等等

    更新

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

    PreparedStatement ps = connection.prepare("SQL_DELETE_STUDENT_BY_ID");
    
    for (Student student : students) {
      ps.setInt(1, student.getId());
      ps.executeUpdate();
    }
    
    ps.close();
    

    你仍然在完成后立即关闭它,并且不要保持资源打开。

    【讨论】:

    • 但是在这种情况下,如果重复调用 PS 方法,它将再次创建,这与文档和“一次创建多次使用”的原则相矛盾
    • 如果你使用连接池,应该没问题。 db不必再次编译语句的主要目标思想。例如,如果您查看 apache ds commons.apache.org/proper/commons-dbcp/configuration.html 查找“poolPreparedStatements”
    猜你喜欢
    • 2013-08-26
    • 2021-11-11
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 2014-11-20
    相关资源
    最近更新 更多