动态查询语句

时间:2016-01-18 12:58:44

标签: java mysql jdbc

我需要使用jdbc为MySQL数据库编写一个查询,该查询依赖于某些业务逻辑,可以概括为类似

    if (someCondition) {
        myQuery = "stuff";
    } else {
        if (anotherCondition) { 
            myQuery = "some stuff";
        } else {
            myQuery = "even more stuff";
        }
    }

我打算构建myQuery字符串作为PreparedStatement对象的模板,然后用实际数据填充?。但是,?的数量取决于与上面相同的逻辑,因此我重复了代码中的逻辑

我该如何避免呢?

由于

3 个答案:

答案 0 :(得分:2)

您可以创建预准备语句并在if块中设置其参数:

if (someCondition) {
    stmt = connection.prepareStatement("stuff");
    stmt.set... // set attributes
} else if (anotherCondition) {
    stmt = connection.prepareStatement("some stuff");
    // set attributes
} else {
    stmt = connection.prepareStatement("even more stuff");
    //set attributes
}

答案 1 :(得分:1)

你应该使用这样的东西:

String myQuery = ...;
List<Object> parameters = ... ;
if (someCondition) {
    myQuery = "stuff";
    parameters = ... ;
} else {
    if (anotherCondition) { 
        myQuery = "some stuff";
        parameters = ... ;
    } else {
        myQuery = "even more stuff";
        parameters = ... ;
    }
}

答案 2 :(得分:1)

您可以通过准备要与查询字符串一起绑定到语句的对象来避免重复:

List<Object> paramValues = new ArrayList<>();
String myQuery;
if (someCondition) {
    myQuery = "stuff ?";
    paramValues.add("single");
} else {
    if (anotherCondition) { 
        myQuery = "some stuff ? ?";
        paramValues.add("one");
        paramValues.add(2);
    } else {
        myQuery = "even more stuff ? ? ? ?";
        paramValues.add("one");
        paramValues.add(2);
        paramValues.add(3.0);
        paramValues.add("four");
    }
}
// Make prepared statement
PreparedStatement ps = ...
// Bind parameters
for (int i = 0 ; i != paramValues.size() ; i++) {
    ps.setObject(i+1, paramValues.get(i));
}