【发布时间】:2021-05-11 17:34:47
【问题描述】:
我的代码当前正在使用String 构建查询,连接值并直接使用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 查询,但据我所知,在创建准备好的语句之前,我需要构建整个查询,然后设置参数:
preparedStatement.setInt(1, value);
等等。但是,在我的场景中,我需要在知道查询的其余部分之前设置一些值,然后根据条件为查询的其余部分设置一个或另一个参数。准备好的陈述可能吗?还是我需要完全更改代码的逻辑并为每个条件构建整个查询,然后使用 preparestatement 设置值?
【问题讨论】:
-
您可以像以前一样动态构建查询,只需使用占位符
?来表示值并使用setXXX()方法设置它们(根据您的条件)。 -
您可以在构建查询时收集带有值的
List<Object>,然后在准备查询后使用setObject设置所有值,或者您需要重复两次,一次用于构造查询,一次用于设置值。
标签: java jdbc conditional-statements prepared-statement