[英]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.