尝试使用资源 - 参数化的 PreparedStatements
try with resources - parameterized PreparedStatements
编辑 建议的答案是不可接受的,不能为我的每个方法声明额外的方法,想象一下?必须有一个嵌套的 try with resources 解决方案。
如何将 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 resource,在外部try with resource 之后,初始化语句,然后对resultSet 使用内部try with resource。
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;
}
编辑 建议的答案是不可接受的,不能为我的每个方法声明额外的方法,想象一下?必须有一个嵌套的 try with resources 解决方案。
如何将 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 resource,在外部try with resource 之后,初始化语句,然后对resultSet 使用内部try with resource。
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;
}