我在Java中遇到了prepareStatement对象的小问题。我有一个带有几个JTextField(和其他东西),一个JTable和一个按钮的GUI。 JTable是使用数据库上的SQL请求构造的,如下所示:
SELECT date, item, vendor FROM Sells;
[我想在用户单击按钮时使用JTextFields筛选结果。假设我们有一个JTextField用于日期,另一个用于项目,另一个用于供应商。
如果所有字段都已填写,我可以使用准备好的查询,如下所示:
String query = "SELECT date, item, vendor FROM Sells WHERE date > ? AND item = ? AND vendor = ?";
PreparedStatement prepared = this.connect.prepareStatement(query);
prepared.setString(1, (String)dateField.getText());
prepared.setString(2, (String)itemField.getText());
prepared.setString(3, (String)vendorField.getText());
这(进行一些调整,如尝试/捕获,变量声明等)效果很好。 我的问题是管理用户仅使用几个字段(例如,仅日期,或日期和项目,但不包括供应商)进行过滤的可能性。目前,我找不到其他字段比:
1)使用if语句测试每个字段的内容,然后修改“ query”变量。
2)使用另一个复杂的if / else结构,以确定要使用哪些变量进行过滤,以及应使用哪个“ prepared.set ....”。这很棘手,因为有时它将是String,但有时是int或其他任何东西。当然,确定索引也是一个小问题,因为它不会是相同的传送时间。
我感觉好像缺少了一些东西,我不应该在多个if / else中使用这个奇怪的解决方案。谁能帮我 ?有没有更简单的解决方案,还是只是我必须用困难的方式解决?
非常感谢!
仅使用所需的列构造查询语句可能是最有效的方法。但是您也可以执行以下操作:
WHERE (date > ? OR ? IS NULL) AND
(item = ? OR ? IS NULL) AND
(vendor = ? OR ? IS NULL)
这需要为每个参数提供两次,并假定“空”值为SQL NULL
。
这种情况下,命名参数简化了事情:
WHERE (date > :date OR :date IS NULL) AND
(item = :item OR :item IS NULL) AND
(vendor = :vendor OR :vendor IS NULL)