【问题标题】:JDBC with MySQL - SELECT ... IN带有 MySQL 的 JDBC - SELECT ... IN
【发布时间】:2013-07-31 17:49:36
【问题描述】:

使用 PreparedStatement 构建如下所示的查询...

SELECT * FROM table1 WHERE column1 IN ('foo', 'bar')

...不知道 IN 语句中的字符串数

构造一个类似...的字符串

"'foo', 'bar'"

...并使用 ps.setString() 传递它会导致:

"\'foo\', \'bar\'"

这可能是一件好事,但它使这种解决我的问题的方法毫无用处。

关于如何将未知数量的值传递到 JDBC PreparedStatement 而不动态创建查询字符串的任何想法(此查询位于一个文件中以便于重用,我想保留那样)?

【问题讨论】:

  • 您可以使用Array 对象。 SELECT * FROM table1 WHERE column1 IN ?PreparedStatement#setArray(1, anArrayObject);
  • @SotiriosDelimanolis 取决于 JDBC 驱动程序是否支持 setArray

标签: java mysql jdbc prepared-statement


【解决方案1】:

我倾向于使用一种会修改查询的方法来相应地修改查询。这是一个为简单起见省略了错误处理的基本示例:

public String addDynamicParameters(String query, List<Object> parameters) {
    StringBuilder queryBuilder = new StringBuilder(query);
    queryBuilder.append("?");
    for (int i = 1; i < parameters.size(); i++) {
        queryBuilder.append(", ?");
    }
    queryBuilder.append(") ");
    return queryBuilder.toString();
}

public void addParameters(PreparedStatement pstmt, List<Object> parameters) {
    int i = 1;
    for(Object param : parameters) {
        pstmt.setObject(i++, param);
    }
}

public void testDynamicParameters() {
    String query = "SELECT col3 FROM tableX WHERE col1 = ? AND col2 IN (";
    List<Object> parametersForIn = ...;
    query = addDynamicParameters(query, parametersForIn);
    List<Object> parameters = ...;
    PreparedStatement pstmt = ...; //using your Connection object...
    parameters.addAll(parametersForIn);
    addParameters(pstmt, parameters);
    //execute prepared statement...
    //clean resources...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    • 2013-05-27
    • 2011-04-13
    • 1970-01-01
    • 2013-02-04
    相关资源
    最近更新 更多