Java在try-with-resources中准备好的语句不能正常工作

前端之家收集整理的这篇文章主要介绍了Java在try-with-resources中准备好的语句不能正常工作前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
参见英文答案 > How should I use try-with-resources with JDBC?4个
昨天Stack上的多个人推荐使用try-with-resources.我正在为我的所有数据库操作执行此操作.今天我想将Statement更改为PreparedStatement以使查询更安全.但是,当我尝试在try-with-resources中使用预准备语句时,我不断收到“标识符预期”或“;”等错误要么 ‘)’.

我究竟做错了什么?或者这不可能吗?这是我的代码

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;

    }

解决方法

try-with-resource语句用于声明(Autoclosable)资源. Connection,PreparedStatement和ResultSet是Autoclosable,所以没关系.

但是stmt.setInt(1,user)不是资源,而是一个简单的语句.在try-with-resource语句中不能有简单的语句(不是资源声明)!

解决方案:创建多个try-with-resource语句!

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
        }
    }
}

(请注意,从技术上讲,不需要像我一样将sql语句的执行放入单独的方法中.如果打开连接和创建PreparedStatement都在同一个try-with-resource语句中,它也可以工作.我只考虑将连接管理内容与其余代码分开的良好做法.

原文链接:https://www.f2er.com/java/121939.html

猜你在找的Java相关文章