gpt4 book ai didi

java - 使用 MessageFormat 生成 where 子句

转载 作者:行者123 更新时间:2023-12-01 18:08:46 25 4
gpt4 key购买 nike

我想使用 MessageFormat 生成 SQL,以便许多用户可以使用相同的字符串,并且他们只需传递 where 子句参数即可。

例如我想从用户中选择*,其中 name='John' 且age=15 且area='JStreet'

我可以使用 MessageFormat.format(select * from user where {0}={1} and {2}={3} and {4}={5} ,"name","'John'", "年龄","15","地区","'JStreet'")

但我希望它是动态的。意味着这里我的界限是 {0}-{5},如果我需要添加更多 AND 条件怎么办?我该如何做到这一点?

最佳答案

不要让用户将列名称指定为字符串。这使得您的代码很容易被破坏,并且使您面临一个非常常见且危险的安全漏洞,即 SQL 注入(inject)。我知道您说它仅供“内部使用”,但员工/学生可能是黑客,并且总是有可能有人希望造成伤害。

相反,将列表示为枚举值。我假设 user 表的列是固定的,因此您可以在枚举中对它们进行硬编码:

public enum UserField {
NAME,
AGE,
AREA
}

正如其他人所提到的,在使用来自最终用户或未知代码的值时,请始终使用PreparedStatement。您现在可以使用枚举来构建该PreparedStatement:

public PreparedStatement createStatement(Map<UserField, ?> values,
Connection conn)
throws SQLException {

Collection<String> tests = new ArrayList<>(values.size());
for (UserField field : values.keySet()) {
tests.add(field.name().toLowerCase() + "=?");
}

String sql;
if (tests.isEmpty()) {
sql = "select * from user";
} else {
sql = "select * from user where " + String.join(" and ", tests);
}

PreparedStatement statement = conn.prepareStatement(sql);

int index = 0;
for (Object value : values) {
statement.setObject(++index, value);
}

return statement;
}

关于java - 使用 MessageFormat 生成 where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60506046/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com