Java 带条件查询的PreparedStatement

Java 带条件查询的PreparedStatement,java,jdbc,conditional-statements,prepared-statement,Java,Jdbc,Conditional Statements,Prepared Statement,我的代码目前正在使用字符串构建查询,将值串联起来,并直接使用executeQuery获得结果(我知道,这是一种糟糕的做法)。除此之外,结果查询取决于许多条件,因此,代码类似于: String query = "select * from my_table where field1 = " + value1; if (somecondition) { query += " and field2 = " + value2; } else if (ot

我的代码目前正在使用
字符串
构建查询,将值串联起来,并直接使用
executeQuery
获得结果(我知道,这是一种糟糕的做法)。除此之外,结果查询取决于许多条件,因此,代码类似于:

String query = "select * from my_table where field1 = " + value1;

if (somecondition) {
    query += " and field2 = " + value2;
} else if (othercondition) {
    query += " or field3 = " + value3;
} else {
    query += " and field4 = " + value + " and field5 = " + value5;
}

ResultSet result = connection.executeQuery(query);

这是一个非常简单的示例,但是正如您所看到的,查询的值、字段数等取决于许多条件,并且所有内容都是串联的

我需要将其转换为
PreparedStatements
查询,但据我所知,在创建prepared语句之前,我需要构建整个查询,然后使用以下参数设置参数:

preparedStatement.setInt(1,值)


等等。但是,在我的场景中,我需要在知道查询的其余部分之前设置一些值,然后根据条件为查询的其余部分设置一个或另一个参数。准备好的声明是否可能?或者我需要完全更改代码的逻辑,为每个条件构建整个查询,然后使用preparestatement设置值吗?

我会这样做:

String query=“从my_表中选择*,其中field1=?”;
编制报表编制报表;
如果(某些条件)
{
查询+=“和字段2=?”;
preparedStatement=conn.prepareStatement(查询);
编制报表。设置字符串(2,值2);
}else if(其他条件)
{
查询+=“或字段3=?”;
preparedStatement=conn.prepareStatement(查询);
编制报表。设置字符串(2,值3);
}否则
{
查询+=“和字段4=?和字段5=?”;
preparedStatement=conn.prepareStatement(查询);
编制报表。设置字符串(2,值4);
编制报表。设置字符串(3,值5);
}
编制报表。设置字符串(1,值1);
结果集结果=preparedStatement.executeQuery(查询);

您可以像以前一样动态构建查询,只需使用占位符
作为值,并使用
setXXX()
方法设置它们(根据您的条件)。您可以在构建查询时收集带有值的
列表,然后在准备好查询后,使用
setObject
设置所有值,或者需要重复两次,一次用于构造查询,一次用于设置值。