如何在java中准备带有可选子句的sql查询?

uqcuzwp8  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(282)

我在java中遇到了preparedstatement对象的一个小问题。我有一个带有几个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());

这(通过一些调整,如try/catch、变量声明等)工作得很好。我的问题是管理用户只使用几个字段进行过滤的可能性(例如,仅使用日期,或日期和项目,但不使用供应商)。现在,我除了:
1) 用if语句测试每个字段的内容,然后修改“query”变量。
2) 使用另一个复杂的if/else结构来确定要使用哪些变量进行过滤,以及应该使用哪个“prepared.set…”。这很棘手,因为有时它是一个字符串,但有时是一个int或其他任何东西。当然,确定索引也是一个小问题,因为它不会每次都一样。
我觉得我遗漏了什么,我不应该用这个奇怪的解决方案来处理多个if/else。有人能帮我吗?有没有一个更简单的解决办法,或者只是一种我必须用艰难的方式去做的情况?
非常感谢!

jljoyd4f

jljoyd4f1#

仅用所需的列构造查询语句可能是最有效的方法。但你也可以这样做:

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)

相关问题