我需要使用jdbc
为MySQL数据库编写一个查询,该查询依赖于某些业务逻辑,可以概括为类似
if (someCondition) {
myQuery = "stuff";
} else {
if (anotherCondition) {
myQuery = "some stuff";
} else {
myQuery = "even more stuff";
}
}
我打算构建myQuery
字符串作为PreparedStatement
对象的模板,然后用实际数据填充?
。但是,?
的数量取决于与上面相同的逻辑,因此我重复了代码中的逻辑
我该如何避免呢?
由于
答案 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));
}