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
设置所有值,或者需要重复两次,一次用于构造查询,一次用于设置值。