簡體   English   中英

基於 Java 中的用戶輸入構建動態 SQL 查詢

[英]Building a dynamic SQL query based on user input in Java

如果我有一個包含以下內容的搜索模塊:搜索框、下拉菜單 1、下拉菜單 2。

我有這樣的查詢:

SELECT * FROM MY_TABLE where q1 = 'searchBox' AND q2 = 'dropdown1' AND q3 = 'dropdown2'

我怎樣才能根據用戶過濾器使查詢動態化,所以如果用戶只填寫搜索框,查詢將是:

SELECT * FROM MY_TABLE where q1 = 'searchBox'

如果用戶填寫搜索框和下拉列表 1,查詢將是:

SELECT * FROM MY_TABLE where q1 = 'searchBox' AND q2 = 'dropdown1'

如果用戶沒有填寫任何內容,查詢將是:

SELECT * FROM MY_TABLE

我正在使用 Java。

有一些框架可以幫助您:

如果您想創建一個快速簡單的解決方案,則可以執行以下操作:

List<String> params = new ArrayList<>();
StringBuilder sb = new StringBuilder();
sb.append("SELECT * FROM MY_TABLE WHERE 1 = 1");

if (searchBox != null) {
    sb.append(" AND q1 = ?");
    params.add(searchBox);
}

if (dropdown1 != null) {
    sb.append(" AND q2 = ?");
    params.add(dropdown1);
}

if (dropdown2 != null) {
    sb.append(" AND q3 = ?");
    params.add(dropdown2);
}

PreparedStatement preparedStatement = connection.prepareStatement(sb.toString());
for (int i = 1; i <= params.size(); i++) {
    preparedStatement.setString(i, params.get(i));
}

ResultSet resultSet = preparedStatement.executeQuery();

改進@blacktide提供的代碼

PreparedStatement preparedStatement = connection.prepareStatement(sb.toString());
for (int i = 1; i <= params.size(); i++) {
    preparedStatement.setString(i, params.get(i));
}

相反,您希望 for 循環中的行是

preparedStatement.setString(i, params.get(i-1));

由於 arrays 從 0 開始,我們想要獲取第零個索引以將添加到列表中的第一個值設置為 SQL 字符串中要更新的第一個值。 否則你會獲取 params 中的第二個值,這不是預期的值。

暫無
暫無

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

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