我在 sonarqube 上运行我的 JDBC 代码。我的代码有问题。
try (final Connection connection = DatabaseConnectionProvider.createConnection(configuration)) {
PreparedStatement statement = connection.prepareStatement(
"SELECT 1 FROM `todo_items` WHERE `id` = ? LIMIT 1;");
statement.setLong(1, id);
ResultSet resultSet = statement.executeQuery();
if (!resultSet.next()) {
return false;
}
statement = connection.prepareStatement("UPDATE `todo_items` SET `checked` = ? WHERE id = ?;");
statement.setBoolean(1, checked);
statement.setLong(2, id);
statement.executeUpdate();
return true;
}
它说第 3 行和第 9 行存在拦截器问题。
“使用 try-with-resources 或在“finally”子句中关闭此“PreparedStatement”。”我不明白这个。
答案 0 :(得分:1)
你可以使用内部的 try-with-resources,因为你在里面有 2 个不同的准备语句:
try (final Connection connection = DatabaseConnectionProvider.createConnection(configuration)) {
try(PreparedStatement statement = connection.prepareStatement("SELECT 1 FROM `todo_items` WHERE `id` = ? LIMIT 1;")) {
statement.setLong(1, id);
ResultSet resultSet = statement.executeQuery();
if (!resultSet.next()) {
return false;
}
}
try(PreparedStatement statement = connection.prepareStatement("UPDATE `todo_items` SET `checked` = ? WHERE id = ?;")) {
statement.setBoolean(1, checked);
statement.setLong(2, id);
statement.executeUpdate();
return true;
}
}
小优化是可能的(注意 Autoclosable
中存在 2 个 try(.....)
:
try (final Connection connection = DatabaseConnectionProvider.createConnection(configuration);
PreparedStatement statement = connection.prepareStatement("UPDATE `todo_items` SET `checked` = ? WHERE id = ?;")) {
statement.setBoolean(1, checked);
statement.setLong(2, id);
return statement.executeUpdate() > 0;
}
您不必查询 DB 中的行是否存在,因为更新的行数通常由 executeUpdate()
返回。实际返回值可能取决于 JDBC 驱动程序实现(尽管 JDBC 规范对此非常清楚)。