如何在准备好的语句中设置参数列表?
我有一个名单,例如:
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的参数类型在运行时丢失。 因此需要添加几个方法: setIntParameters
, setLongParameters
, setObjectParameters
等
如果问题的意思是在一次通话中设置几个参数…
因为类型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 }