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

时间:2016-04-17 15:37:01

标签: 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'

如果用户填写搜索框和dropdown1,则查询将为:

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

如果用户没有填写任何内容,则查询将为:

SELECT * FROM MY_TABLE

我正在使用Java。

1 个答案:

答案 0 :(得分:2)

有一些框架可以帮助解决这个问题:

如果您想创建快速简单的解决方案,可以执行以下操作:

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();