簡體   English   中英

如何使用 java 中的可選子句准備 SQL 查詢?

[英]How to prepare an SQL query with optional clauses in java?

我在 java 中的preparedStatement object 遇到了一個小問題。 我有一個帶有幾個 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 語句測試每個字段的內容,並相應地修改“查詢”變量。

2) 使用另一個復雜的 if/else 結構來確定要過濾哪些變量,以及應該使用哪個“prepared.set....”。 這很棘手,因為有時它是一個字符串,但有時是一個 int 或其他任何東西。 當然,確定索引也是一個小問題,因為它不會是相同的eveytime。

我覺得我錯過了一些東西,我不應該將這個奇怪的解決方案與多個 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM