带有 MySQL 的 JDBC - SELECT ... IN

Posted

技术标签:

【中文标题】带有 MySQL 的 JDBC - SELECT ... IN【英文标题】:JDBC with MySQL - 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 见PreparedStatement IN clause alternatives 【参考方案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...

【讨论】:

以上是关于带有 MySQL 的 JDBC - SELECT ... IN的主要内容,如果未能解决你的问题,请参考以下文章

JSP/MySQL(JDBC) - Select 语句给出空结果[关闭]

MySQL 和 JDBC PreparedStatement 使用 Select [重复]

使用带有 JDBC 的 MySQL 运行 .sql 脚本

使用 JDBC 在 MySQL 中插入 select

带有 JDBC 的 tomcat 6.0 抛出 ClassNotFoundException com.mysql.jdbc.Connection

获取 PSQLException:错误:在带有 Postgres 的 spark jdbc 中使用查询而不是表名时在“SELECT”处或附近出现语法错误