带有 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 的 tomcat 6.0 抛出 ClassNotFoundException com.mysql.jdbc.Connection
获取 PSQLException:错误:在带有 Postgres 的 spark jdbc 中使用查询而不是表名时在“SELECT”处或附近出现语法错误