【问题标题】:PreparedStatement with conditional query带条件查询的 PreparedStatement
【发布时间】: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


【解决方案1】:

我会这样做:

        String query = "select * from my_table where field1 = ?";
        PreparedStatement preparedStatement;
        if (somecondition)
        {
            query += " and field2 = ?";
            preparedStatement = conn.prepareStatement(query);
            preparedStatement.setString(2, value2);
        } else if (othercondition)
        {
            query += " or field3 = ?";
            preparedStatement = conn.prepareStatement(query);
            preparedStatement.setString(2, value3);
        } else
            {
                query += " and field4 = ? and field5 = ?";
                preparedStatement = conn.prepareStatement(query);
                preparedStatement.setString(2, value4);
                preparedStatement.setString(3, value5);
            }

        preparedStatement.setString(1, value1);
        ResultSet result = preparedStatement.executeQuery(query);

【讨论】:

    猜你喜欢
    • 2011-12-05
    • 2011-04-21
    • 2020-12-18
    • 1970-01-01
    • 2014-05-16
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多