Statements prepared by Java in try with resources do not work properly

See English answers > how should I use try with resources with JDBC? 4

What on earth did I do wrong? Or is it impossible? This is my code:

try (Connection conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);
        PreparedStatement stmt = conn.prepareStatement("SELECT id FROM users WHERE id = ? LIMIT 1");
        stmt.setInt(1,user);
        ResultSet rs = stmt.executeQuery()) {

        // if no record found
        if(!rs.isBeforeFirst()) {
           return false;
        }
        // if record found
        else {
            return true;
        }

    } catch (sqlException e) {
        // log error but dont do anything,maybe later
        String error = "sqlException: " + e.getMessage() + "\nsqlState: " + e.getsqlState() + "\nVendorError: " + e.getErrorCode();
        return false;

    }

Solution

The try with resource statement is used to declare (autoclosable) resources Connection, Preparedstatement and resultset are autoclosable, so it doesn't matter

But stmt Setint (1, user) is not a resource, but a simple statement You cannot have a simple statement (not a resource declaration) in a try with resource statement!

Solution: create multiple try with resource statements!

try (Connection conn = DriverManager.getConnection(DBURL,DBPASS)) {
    executeStatement(conn);
} catch (sqlException e) {
    // log error but dont do anything,maybe later
    String error = "sqlException: " + e.getMessage() + "\nsqlState: " + e.getsqlState() + "\nVendorError: " + e.getErrorCode();
    return false;
}

private void executeStatement(Connection con) throws sqlException {
    try (PreparedStatement stmt = conn.prepareStatement("SELECT id FROM users WHERE id=? LIMIT 1")) {
        stmt.setInt(1,user);
        try (ResultSet rs = stmt.executeQuery()) {
            // process result
        }
    }
}

(please note that technically, you don't need to put the execution of SQL statements into a separate method like me. If opening a connection and creating a Preparedstatement are in the same try with resource statement, it can also work. I only consider the good practice of separating the connection management content from the rest of the code

The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>