我正在开发一个简单的数据库程序,可以轻松选择查询。
本程序使用GUI,您可以 输入搜索参数。如果您没有输入所有参数,则查询结果将完成这些参数。所以我试图检查文本框中的参数是否为空/ null并将占位符设置为" *"。
但是当我试图跑步的时候。即使使用编程的占位符,它也会给我一个SQLException语法错误。
我将发布整个代码的短版本,巫术技术是相同的。
PreparedStatement Statement = connection.prepareStatement("select * From t_person where user_a = ? "+ "AND where dasatz_a = ? " + "AND where user_g = ? ");
if (Parameter.get(0) == null) {
Parameter.set(0, "*") };
Statement.setString(1, Parameter.get(0));
等等。
参数是一个带有文本框参数的ArrayList。
答案 0 :(得分:2)
如果没有为“filtered”列指定参数,则不要以任何方式过滤列。 动态准备查询以仅包含指定的参数。
Map<Integer, String> statementParams = new HashMap<>();
String query = "select * From t_person";
boolean firstCondition = true;
if (Parameter.get(0) != null) {
if (firstCondition) {
query += " where ";
firstCondition = false;
} else {
query += " and ";
}
query += "user_a = ?";
statementParams.put(1, Parameter.get(0));
}
// other params
PreparedStatement Statement = connection.prepareStatement(query);
for (MapEntry<Integer, String> entry : statementParams.entrySet()) {
Statement.setString(entry.getKey(), entry.getValue());
}
答案 1 :(得分:0)
正如@juergen指出的那样,你的sql语句无效,因为它中有多个where子句:
选择*来自t_person,其中user_a =? &#34; +&#34; AND其中dasatz_a =? &#34; + &#34; AND user_g =?
应该是:
选择*来自t_person,其中user_a =? AND dasatz_a =? AND user_g = ?
此外,使用'*'
会产生user_a字面为*
的值。如果您想要使其成为通配符搜索,则语法必须更改为LIKE(而不是等于)并使用'%'
而不是'*'
。