从在 Java 中连接 SQL 字符串移动到 PreparedStatement

Moving to PreparedStatement from concatenating SQL string in Java

假设我有一个表单,根据用户在表单中填写的字段,我在 Java 代码中使用 Java 字符串创建了 SQL 语句,并且"field1 = 'A' and field2 = 'B' and field3 = 'C'" 等子句的连接。如果该字段未填写,我将跳过这部分而不将其添加到我的 Java SQL 字符串中,从而接受数据库中该字段中的任何值table。有人告诉我连接 SQL 字符串是一种不好的做法,我宁愿使用 PreparedStatement 而不是直接执行查询。在这种情况下,如果不为表单中现有字段的每个组合创建单独的 PreparedStatement,我该怎么做?

首先,很好地摆脱了将字符串与字段值连接在一起的做法。您刚刚从讨厌的 SQL 注入攻击中拯救了自己。

您想使用与以前相同的逻辑 - 相同的一组 if 语句,并且只在存在该字段的 SQL 中添加一个子句。您可能需要一个 StringBuilder 来构建 SQL 和一个 ArrayList<String> 来存储参数值,直到您准备好使用它们。您最终可能会得到很多看起来像这样的块。

if (! field1Text.equals("")) {
    sql.append(" and field1 = ?");
    params.add(field1Text);
}

然后,最后,在您完成 PreparedStatement 之后,您将遍历参数列表,为每个参数调用 setString

考虑使用 QueryDSL 或 JOOQ 等框架。