如何在准备好的语句中设置参数列表?

我有一个名单,例如:

List names = ... names.add('charles'); ... 

并声明:

 PreparedStatement stmt = conn.prepareStatement('select * from person where name in ( ? )'); 

如何做到以下几点:

 stmt.setParameterList(1,names); 

有解决方法吗? 谁能解释为什么这种方法丢失了?

使用:java,postgresql,jdbc3

只需在我知道的PreparedStatement上设置一个列表,就没有干净的方法来做到这一点。

编写构造SQL语句的代码(或者更好地替换单个?或类似的标记),使用适当数量的问号(与列表中的数字相同),然后遍历列表,为每个标记设置参数。

这个问题很老,但是没有人建议使用setArray

这个答案可能有助于https://stackoverflow.com/a/10240302/573057

对于postgres 9,我使用了这种方法:

  jdbcTemplate.query(getEmployeeReport(), new PreparedStatementSetter() { @Override public void setValues(PreparedStatement ps) throws SQLException { ps.setTimestamp(1, new java.sql.Timestamp(from.getTime())); ps.setTimestamp(2, new java.sql.Timestamp(to.getTime())); StringBuilder ids = new StringBuilder(); for (int i = 0; i < branchIds.length; i++) { ids.append(branchIds[i]); if (i < branchIds.length - 1) { ids.append(","); } } // third param is inside IN clause // Use Types.OTHER avoid type check while executing query ps.setObject(3, ids.toString(), **Types.OTHER**); } }, new PersonalReportMapper()); 

由于类型擦除而缺少此方法,List的参数类型在运行时丢失。 因此需要添加几个方法: setIntParameterssetLongParameterssetObjectParameters

如果问题的意思是在一次通话中设置几个参数…

因为类型validation已经在更高级别定义,我认为唯一需要的是setObject(…) 。

因此,可以使用实用方法:

 public static void addParams(PreparedStatement preparedStatement, Object... params) throws SQLException { for (int i = 0; i < params.length; i++) { Object param = params[i]; preparedStatement.setObject(i+1, param); } } 

用法:

 SqlUtils.addParams(preparedStatement, 1, '2', 3d); 

随意将其转换为Java 8 lambda 🙂

我今天早上正在审查代码,我的一个同事有不同的方法,只需使用setString("name1','name2','name3")传递参数。

注意:我在开头和结尾跳过单引号,因为这些将由setString添加。

在不同的论坛中检查各种解决方案而没有找到一个好的解决方案后,我觉得我想出的下面的黑客攻击,是最容易遵循和编码的。 但请注意,这不会使用准备好的查询,但无论如何都要完成工作:

示例:假设您有一个要在“IN”子句中传递的参数列表。 只需在’IN’子句中放入一个虚拟字符串,比如说,“PARAM”do表示将在此虚拟字符串的位置出现的参数列表。

  select * from TABLE_A where ATTR IN (PARAM); 

您可以将所有参数收集到Java代码中的单个String变量中。 这可以按如下方式完成:

  String param1 = "X"; String param2 = "Y"; String param1 = param1.append(",").append(param2); 

在我们的例子中,您可以将用逗号分隔的所有参数追加到单个String变量’param1’中。

在将所有参数收集到单个String中之后,您只需在查询中替换虚拟文本,即在本例中为“PARAM”,使用参数String,即param1。 这是你需要做的:

  String query = query.replaceFirst("PARAM",param1); where we have the value of query as query = "select * from TABLE_A where ATTR IN (PARAM)"; 

您现在可以使用executeQuery()方法执行查询。 只需确保您的查询中没有“PARAM”字样。 您可以使用特殊字符和字母的组合而不是单词“PARAM”,以确保查询中不会出现这样的单词。 希望你能得到解决方案。

其他方法:

 public void setValues(PreparedStatement ps) throws SQLException { // first param inside IN clause with myList values ps.setObject(1 , myList.toArray(), 2003); // 2003=array in java.sql.Types }