如何使用Java中的可选子句准备SQL查询?

问题描述 投票:4回答:1

我在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中使用这个奇怪的解决方案。谁能帮我 ?有没有更简单的解决方案,还是只是我必须用困难的方式解决?

非常感谢!

java sql prepared-statement
1个回答
2
投票

仅使用所需的列构造查询语句可能是最有效的方法。但是您也可以执行以下操作:

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)
© www.soinside.com 2019 - 2024. All rights reserved.