即使正在关闭PreparedStatement,也要使用clear Parameter()

时间:2014-11-11 17:01:27

标签: sql jdbc connection resultset

private PreparedStatement InsertPS = null;
public boolean InsertInDB(String username, String password, double balance, String secret) {
    boolean ans = false;
    try {
        InsertPS = con.prepareStatement("Insert into BankDB values(?,?,?,?)");
        String data[] = AMC.SendtoDB(password, secret);
        InsertPS.setString(1, data[0]);
        InsertPS.setString(2, username);
        InsertPS.setString(3, data[1]);
        InsertPS.setDouble(4, balance);
        int rows = InsertPS.executeUpdate();
        if (rows != 0) {
            ans = true;
        }
        InsertPS.clearParameters();
    } catch (SQLException sqlInite) {
        System.out.println("SQL Error in InsertInDB method: " + sqlInite);
    } finally {
        try {
            InsertPS.close();
        } catch (SQLException sqle) {
            System.out.println("SQL Exception in InsertInDB method finally clause : " + sqle);
        }
    }
    return ans;
}

上面是给出的InsertInDB()方法, 它有一个InsertPS PreparedStatement对象。 这里有必要使用clearParameters()方法,即使我在方法结束时关闭InsertPS对象。 (我提供了一个单独的方法来关闭连接对象)

另一个问题:在类中的任何方法之外创建PreparedStatement对象是一个好主意,使用Constructor和Say初始化一旦使用了所有Object(每个使用不同的方法),使用单独的方法关闭所有PreparedStatement对象。

    public class JavatoDB {

    Driver DM = null;
    Connection con = null;
    PreparedStatement InsertPS = null;
    PreparedStatement BalancePS = null;
    PreparedStatement DeletePS = null;
    PreparedStatement UpdatePS = null;
    PreparedStatement SearchDB = null;
    ResultSet RS = null;
    ResultSetMetaData RSMD = null;
    AdminControl AMC = null;


    public JavatoDB() {
        AMC = new AdminControl();
        try {
            DM = new com.mysql.jdbc.Driver();
            con = DriverManager.getConnection("jdbc:mysql://localhost/javadb", "java", "javaaccess");
            InsertPS = con.prepareStatement("Insert into BankDB values(?,?,?,?)");
            BalancePS = con.prepareStatement("Select BALANCE from BankDB where ACCNAME=? AND ACCPIN = ?");
            DeletePS = con.prepareStatement("Delete from BankDB where ACCNAME = ? AND ACCPIN = ? ");
            UpdatePS = con.prepareStatement("Update  BankDB set BALANCE = (BALANCE + ?) where ACCNAME = ? AND ACCPIN = ?");
            SearchDB = con.prepareStatement("Select ID AND ACCPIN from BankDB where ACCNAME = ? ");
        } catch (SQLException JavatoDBContrsuctor) {
            System.out.println("SQL Error in JavatoDBConstructor: " + JavatoDBContrsuctor);
        }
    }


    public boolean InsertInDB(String username, String password, double balance, String secret) {
        boolean ans = false;
        try {
            String data[] = AMC.SendtoDB(password, secret);
            InsertPS.setString(1, data[0]);
            InsertPS.setString(2, username);
            InsertPS.setString(3, data[1]);
            InsertPS.setDouble(4, balance);

            int rows = InsertPS.executeUpdate();
            if (rows != 0) {
                ans = true;
            }
            InsertPS.clearParameters();
        } catch (SQLException sqlInite) {
            System.out.println("SQL Error in InsertInDB method: " + sqlInite);
        }
        return ans;
    }

欢迎对代码的其他方面提出建议或批评。

1 个答案:

答案 0 :(得分:0)

对于第一个问题,请致电:

con.prepareStatement()

创建一个新的preparedStatement,然后参数不存活,我的意思是你不需要清除。

关于第二个问题,在您的实现中,我无法看到您关闭prepareStatement的位置,如果只添加close,下次方法将失败。然后,通常创建preparedStatement并以相同的方法关闭它。