подготовка запроса на основе входных значений в Java - PullRequest
0 голосов
/ 03 марта 2011

Я не знаю, возможно ли это или нет, но вот мой вопрос:

Я получаю 13 полей ввода на основе ввода

 Ex:String firstname=request.getParameter("firstname"); ......

Я должен подготовить SQL гдепредложение вроде if (firstname! = null) {где firstname = 'test' и ..}

Любые рекомендации для такого рода сценариев.

С уважением,

Raj

Ответы [ 4 ]

2 голосов
/ 03 марта 2011

Если я правильно понимаю, вы хотите генерировать запросы динамически, в зависимости от значения полей ввода.Существуют фреймворки, помогающие сделать это, например MyBatis .Но вы можете подготовить собственное решение с помощью готовых операторов:

String query = "select * from foo f";
List<String> clauses = new ArrayList<String>();
List<Object> parameters = new ArrayList<Object>();

if (firstName != null) {
    clauses.add("f.name = ?");
    parameters.add(firstName);
}
// ...
if (!clauses.isEmpty()) {
    query += " where " + StringUtils.join(clauses, " and ");
}

PreparedStatement ps = connection.prepareStatement(query);
for (int i = 0; i < parameters.size(); i++) {
    ps.setObject(i + 1, paremeters.get(i));
}

Вы можете сделать его еще лучше, поддерживая типы SQL, используя шаблон компоновщика и т. Д., Но вы должны понять эту идею на этом простом примере.

1 голос
/ 03 марта 2011

Я предполагаю, что вы используете соединение JDBC с вашей базой данных. Вы должны использовать подготовленные операторы , в противном случае вы широко открыты для SQL-инъекций атак.

Второй вопрос - как предотвратить предложение WHERE, включающее поле, которое пользователь не предоставил. Существует много (2 ^ 13 == 8192) комбинаций, поэтому нецелесообразно иметь разные операторы для каждого возможного ввода пользователя. В вашем случае можно было бы динамически построить подготовленный оператор:

String statement = "SELECT * FROM " + dbName + "." + tableName;

String condition = " WHERE";
List<String> params = new ArrayList<String>();

if ( firstname  != null ){
    statement += condition + " firstname  = ?";
    condition = " AND";
    params.add(firstname);
}

if ( familyname != null ){
    statement += condition + " familyname  = ?";
    condition = " AND";
    params.add(familyname);
}

connection.prepareStatement(updateString);

Затем вам нужно будет добавить содержимое params при выполнении подготовленного оператора.

0 голосов
/ 04 марта 2011

Мне тоже было любопытно, поэтому я создал новый ответ.Это то, что я придумал.Его можно оптимизировать, но это делает то, что вы хотите, используя шаблон Builder.Как видно из моего теста, я передаю нулевое значение, и оно пропускается в строке where.

public class WhereBuilder {

private final String requestParm1;
private final String requestParm2;
private final String requestParm3;
private final String requestParm4;
private final String requestParm5;
private StringBuilder whereString = new StringBuilder();

public static class Builder {

    private String requestParm1 = null;
    private String requestParm2 = null;
    private String requestParm3 = null;
    private String requestParm4 = null;
    private String requestParm5 = null;
    private StringBuilder whereString = new StringBuilder("WHERE ");

    public Builder() {}

    public Builder requestParm1(String value) {
        if (value != null) {
            requestParm1 = value;
            whereString.append(" requestParm1 = '"  + requestParm1 + "' AND");
        }
        return this;
    }

    public Builder requestParm2(String value) {
        if (value != null) {
            requestParm2 = value;
            whereString.append(" requestParm2 = '"  + requestParm2 + "' AND");
        }
        return this;
    }

    public Builder requestParm3(String value) {
        if (value != null) {
            requestParm3 = value;
            whereString.append(" requestParm3 = '"  + requestParm3 + "' AND");
        }
        return this;
    }

    public Builder requestParm4(String value) {
        if (value != null) {
            requestParm4 = value;
            whereString.append(" requestParm4 = '"  + requestParm4 + "' AND");
        }
        return this;
    }

    public Builder requestParm5(String value) {
        if (value != null) {
            requestParm5 = value;
            whereString.append(" requestParm5 = '"  + requestParm5 + "' AND");
        }
        return this;
    }


    public WhereBuilder build() {
        return new WhereBuilder(this);
    }

}

private WhereBuilder(Builder builder) {
    requestParm1 = builder.requestParm1;
    requestParm2 = builder.requestParm2;
    requestParm3 = builder.requestParm3;
    requestParm4 = builder.requestParm4;
    requestParm5 = builder.requestParm5;
    whereString = builder.whereString;
}

public String getWhereString() {
    whereString.delete(whereString.length()-3, whereString.length());
    return whereString.toString();
}

public static void main(String[] args) {
    WhereBuilder wb = new WhereBuilder.Builder().requestParm1("hello").requestParm2("how")
                        .requestParm3("are").requestParm4(null).requestParm5("you").build();
    String whereString = wb.getWhereString();
    System.out.println(whereString);
}

}

Вывод основного метода:

WHERE  requestParm1 = 'hello' AND requestParm2 = 'how' AND requestParm3 = 'are' AND requestParm5 = 'you' 
0 голосов
/ 03 марта 2011

Вам нужно будет динамически построить запрос в Java или использовать хранимую процедуру, которая не будет фильтровать поле, если оно пустое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...