如何在我的 List<String> ids arraylist 中找到选定的 id?
How to find the selected id in my List<String> ids arraylist?
这是我的代码。我正在尝试使用 JUnit 来测试 deleteUsers() 方法,但每次我编写测试时,它都会删除我在数据库中拥有的所有用户。如何删除单个用户?下面是方法和测试的代码。
@Override
public boolean deleteUsers(List<String> ids) throws Exception {
StringBuilder sql = new StringBuilder();
sql.append("delete from user where ");
for (String id : ids) {
sql.append(" id = ? or");
}
String strSql = sql.toString().substring(0, sql.length() - 2) + ";";
PreparedStatement preparedStatement = this.connection.prepareStatement(strSql);
for (int i = 0; i < ids.size(); i++) {
preparedStatement.setInt(1 + i, Integer.parseInt(ids.get(i)));
}
int lines = preparedStatement.executeUpdate();
preparedStatement.close();
return lines > 0;
}
问题是由 SQL 的构建方式引起的。当 deleteUsers 传递一个空列表时,生成的 SQL 将是:
delete from user wher
这将导致所有数据被删除(table 用户被赋予别名“wher”)。我强烈建议在方法开始时检查集合是否为空并引发异常或返回。
添加以下检查
if (ids == null || ids.isEmpty()) {
throw new IllegalArgumentException("ids must not be empty");
}
您缺少对空输入的检查。在您的测试中,您将一个空列表传递给 deleteUsers
,这会导致此 SQL 语句:
delete from user wher;
我希望 DBMS 会拒绝它,因为它无效 SQL,但也许有些地方将其解释为 delete from user
,这只会删除所有用户。 (正如@SteveBosman 指出的 wher
被解释为 table 别名 - 由于缺少最后一个 e
- 没有任何保留字)
基本上你有两个选择。通过传递一个空列表来删除所有用户是一个有效的用例 - 在这种情况下,您应该通过生成正确的 SQL 来正确处理它。或者这不是预期的,如果 ids
为空,您应该调整代码以抛出异常。
@Override
public boolean deleteUsers(List<String> ids) throws Exception {
if (ids == null || ids.size() == 0) {
throw new IllegalArgumentException("List of IDs must not be empty");
}
...
}
您当然可以 return false
如果输入为空,也可以表示没有删除任何用户。
要将值传递给测试中的 deleteUsers
方法,您需要将值添加到使用的列表中:
userDAOImpl.addUser("admin3", "111222");
final List<String> idsToDelete = new ArrayList<>();
idsToDelete.add("111222");
userDAOImpl.deleteUsers(idsToDelete);
StringBuilder sql = new StringBuilder();
sql.append("delete from user where");
String orClause = "";
for (String id : ids) {
sql.append(orClause);
sql.append(" id = ?");
orClause = " or";
}
这是我的代码。我正在尝试使用 JUnit 来测试 deleteUsers() 方法,但每次我编写测试时,它都会删除我在数据库中拥有的所有用户。如何删除单个用户?下面是方法和测试的代码。
@Override
public boolean deleteUsers(List<String> ids) throws Exception {
StringBuilder sql = new StringBuilder();
sql.append("delete from user where ");
for (String id : ids) {
sql.append(" id = ? or");
}
String strSql = sql.toString().substring(0, sql.length() - 2) + ";";
PreparedStatement preparedStatement = this.connection.prepareStatement(strSql);
for (int i = 0; i < ids.size(); i++) {
preparedStatement.setInt(1 + i, Integer.parseInt(ids.get(i)));
}
int lines = preparedStatement.executeUpdate();
preparedStatement.close();
return lines > 0;
}
问题是由 SQL 的构建方式引起的。当 deleteUsers 传递一个空列表时,生成的 SQL 将是:
delete from user wher
这将导致所有数据被删除(table 用户被赋予别名“wher”)。我强烈建议在方法开始时检查集合是否为空并引发异常或返回。
添加以下检查
if (ids == null || ids.isEmpty()) {
throw new IllegalArgumentException("ids must not be empty");
}
您缺少对空输入的检查。在您的测试中,您将一个空列表传递给 deleteUsers
,这会导致此 SQL 语句:
delete from user wher;
我希望 DBMS 会拒绝它,因为它无效 SQL,但也许有些地方将其解释为 delete from user
,这只会删除所有用户。 (正如@SteveBosman 指出的 wher
被解释为 table 别名 - 由于缺少最后一个 e
- 没有任何保留字)
基本上你有两个选择。通过传递一个空列表来删除所有用户是一个有效的用例 - 在这种情况下,您应该通过生成正确的 SQL 来正确处理它。或者这不是预期的,如果 ids
为空,您应该调整代码以抛出异常。
@Override
public boolean deleteUsers(List<String> ids) throws Exception {
if (ids == null || ids.size() == 0) {
throw new IllegalArgumentException("List of IDs must not be empty");
}
...
}
您当然可以 return false
如果输入为空,也可以表示没有删除任何用户。
要将值传递给测试中的 deleteUsers
方法,您需要将值添加到使用的列表中:
userDAOImpl.addUser("admin3", "111222");
final List<String> idsToDelete = new ArrayList<>();
idsToDelete.add("111222");
userDAOImpl.deleteUsers(idsToDelete);
StringBuilder sql = new StringBuilder();
sql.append("delete from user where");
String orClause = "";
for (String id : ids) {
sql.append(orClause);
sql.append(" id = ?");
orClause = " or";
}