在Java中基于用户输入构建动态SQL查询

在Java中基于用户输入构建动态SQL查询,java,mysql,sql,Java,Mysql,Sql,如果我有一个具有以下内容的搜索模块: 搜索框,下拉列表1,下拉列表2 我有这样一个问题: SELECT * FROM MY_TABLE where q1 = 'searchBox' AND q2 = 'dropdown1' AND q3 = 'dropdown2' 如何根据用户筛选器使该查询成为动态查询,因此,如果用户仅填写搜索框,则查询将为: SELECT * FROM MY_TABLE where q1 = 'searchBox' SELECT * FROM MY_TABLE where

如果我有一个具有以下内容的搜索模块: 搜索框,下拉列表1,下拉列表2

我有这样一个问题:

SELECT * FROM MY_TABLE where q1 = 'searchBox' AND q2 = 'dropdown1' AND q3 = 'dropdown2'
如何根据用户筛选器使该查询成为动态查询,因此,如果用户仅填写搜索框,则查询将为:

SELECT * FROM MY_TABLE where q1 = 'searchBox'
SELECT * FROM MY_TABLE where q1 = 'searchBox' AND q2 = 'dropdown1'
SELECT * FROM MY_TABLE
如果用户填写搜索框和下拉列表1,则查询将为:

SELECT * FROM MY_TABLE where q1 = 'searchBox'
SELECT * FROM MY_TABLE where q1 = 'searchBox' AND q2 = 'dropdown1'
SELECT * FROM MY_TABLE
如果用户没有填写任何内容,则查询将为:

SELECT * FROM MY_TABLE where q1 = 'searchBox'
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();
List params=new ArrayList();
StringBuilder sb=新的StringBuilder();
sb.追加(“从MY_表中选择*,其中1=1”);
if(searchBox!=null){
sb.追加(“和q1=?”);
参数添加(搜索框);
}
if(dropdown1!=null){
sb.追加(“和q2=?”);
参数添加(下拉列表1);
}
if(dropdown2!=null){
sb.追加(“和q3=?”);
参数添加(下拉列表2);
}
PreparedStatement PreparedStatement=connection.prepareStatement(sb.toString());

对于(inti=1;i)您使用的是什么RDBMS?我使用mysql和java作为编程语言