我有名字如列表:
List<String> 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());
这种方法由于缺少输入删除列表中的参数类型在运行时将丢失。 因此,需要补充多种方法arires: setIntParameters
, setLongParameters
, setObjectParameters
等
如果问题的意思是在一个单一的呼叫设置几个参数...
由于该类型的验证是在较高的水平已经定义,我认为唯一需要的是方法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拉姆达:)
我今天上午审查代码和我的一个同事有不同的方法,只是通过使用参数setString("name1','name2','name3")
。
注意:我跳过了单引号开头和结尾,因为这些将要被添加setString
。
在不同的论坛研究各种解决方案,并没有找到一个很好的解决方案后,我觉得下面砍我想出了,是最简单的跟踪和代码。 但是请注意,这不使用准备好的查询,但得到的工作做无论如何:
例如:假设你有一个参数列表的“IN”子句中传递。 只要把虚拟字符串的“IN”子句中,说“参数”做表示的将在这个虚拟的字符串的地方产生的参数列表。
select * from TABLE_A where ATTR IN (PARAM);
您可以收集在Java代码中所有的参数到一个单一的字符串变量。 这是可以做到如下:
String param1 = "X";
String param2 = "Y";
String param1 = param1.append(",").append(param2);
您可以附加由逗号分隔成一个字符串变量,“参数1”,在我们的情况下,所有的参数。
收集所有参数成一个字符串后,只需更换您的查询的虚拟文本,即在这种情况下,“参数”,在参数字符串,即参数1。 以下是你需要做的:
String query = query.replaceFirst("PARAM",param1); where we have the value of query as
query = "select * from TABLE_A where ATTR IN (PARAM)";
您现在可以使用的executeQuery()方法执行查询。 只要确保你没有这个词“参数”,在您的查询的任何地方。 您可以使用特殊字符和字母来代替单词“参数”的组合,以确保不存在这样的查询来一个字的可能性。 希望你得到了解决。
其他方法:
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
}