java - 尝试使用资源 - 参数化的PreparedStatements

标签 java prepared-statement

编辑建议的答案是 Not Acceptable ,想象一下,不能为我的每个方法声明附加方法吗?必须有一个嵌套的资源尝试解决方案。

如何将 try 语句与带有参数的准备语句一起使用?

以下两行出现错误。

preparedStatement.setString(1, uuid);
preparedStatement.setString(2, emailAddress);

Error Declaration final or effectively final variable exepcted

public UserBean getUserDevices(final String emailAddress, final String uuid) throws SQLException {
    UserBean userBean = null;

    String query = "SELECT user.id, user.emailAddress, device.uuid, device.active, device.user_id FROM user " +
            "LEFT JOIN device ON user.id = device.user_id AND device.uuid = ? " +
            "WHERE user.emailAddress = ?";

    try (Connection connection = dataSource.getConnection();
         PreparedStatement preparedStatement = connection.prepareStatement(query);
         preparedStatement.setString(1, uuid);
         preparedStatement.setString(2, emailAddress);
         ResultSet resultSet = preparedStatement.executeQuery();

    ) {
        while(resultSet.next()) {
            if(userBean == null) { // initialize user once while iterating for devices
                userBean = new UserBean(resultSet.getInt("user.id"), resultSet.getString("user.emailAddress"), null);
            }
            if(resultSet.getString("device.uuid") != null) { // if device exists (it's a LEFT JOIN) then add
                userBean.getDevices().add(new DeviceBean(0, resultSet.getString("device.uuid"), resultSet.getBoolean("device.active"), resultSet.getInt("device.user_id")));
            }
        }
    }
    return userBean;
}

最佳答案

使用内部try with resources,在外部try with resource之后,初始化语句,然后使用内部try with resources作为resultSet。

public UserBean getUserDevices(final String emailAddress, final String uuid) throws SQLException {
    UserBean userBean = null;

    String query = "SELECT user.id, user.emailAddress, device.uuid, device.active, device.user_id FROM user " +
            "LEFT JOIN device ON user.id = device.user_id AND device.uuid = ? " +
            "WHERE user.emailAddress = ?";

    try (Connection connection = dataSource.getConnection();
         PreparedStatement preparedStatement = connection.prepareStatement(query);
    ) {
        preparedStatement.setString(1, uuid);
        preparedStatement.setString(2, emailAddress);

        try(ResultSet resultSet = preparedStatement.executeQuery();) {
            while(resultSet.next()) {
                if(userBean == null) { // initialize user once while iterating for devices
                    userBean = new UserBean(resultSet.getInt("user.id"), resultSet.getString("user.emailAddress"), null);
                }
                if(resultSet.getString("device.uuid") != null) { // if device exists (it's a LEFT JOIN) then add
                    userBean.getDevices().add(new DeviceBean(0, resultSet.getString("device.uuid"), resultSet.getBoolean("device.active"), resultSet.getInt("device.user_id")));
                }
            }
        }
    }
    return userBean;
}

关于java - 尝试使用资源 - 参数化的PreparedStatements,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49527991/

相关文章:

java - 即使列表不为空,emptyView 也始终显示

java - 如何使 C++ 代码在 Java 组件上绘制

java - 如何将后续字符串发送到数据库?

PHP 准备更新语句 - 尝试获取非对象的属性

PHP PDO 准备语句语法问题

php - Mysqli 准备语句在第二次迭代时失败

java - 在java中如何使用属性将多个值从一个类传递到另一个类?

java - int to short 两个最高有效字节

java - 在开始编码之前如何确定对象的状态?

php:如何使用准备好的语句从sql数据库获取最新的日期时间?