如何在我的 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";
}