如何设置在准备好的声明中的参数列表?(How to set list of parameters o

2019-07-02 12:39发布

我有名字如列表:

List<String> names = ...
names.add('charles');
...

并声明:

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

如何做到以下几点:

stmt.setParameterList(1,names);

有没有解决办法? 有人可以解释为什么这种方法缺什么?

使用:JAVA和PostgreSQL,JDBC3

Answer 1:

有没有干净的方式简单地通过设置在一个列表来做到这一点PreparedStatement ,我知道的。

编写构造SQL语句(或更好的取代了单一的?或者类似的标记)与问号适当数量的(同一号码在你的列表)代码,然后遍历列表设定各参数。



Answer 2:

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

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



Answer 3:

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());


Answer 4:

这种方法由于缺少输入删除列表中的参数类型在运行时将丢失。 因此,需要补充多种方法arires: setIntParameterssetLongParameterssetObjectParameters



Answer 5:

如果问题的意思是在一个单一的呼叫设置几个参数...

由于该类型的验证是在较高的水平已经定义,我认为唯一需要的是方法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拉姆达:)



Answer 6:

我今天上午审查代码和我的一个同事有不同的方法,只是通过使用参数setString("name1','name2','name3")

注意:我跳过了单引号开头和结尾,因为这些将要被添加setString



Answer 7:

在不同的论坛研究各种解决方案,并没有找到一个很好的解决方案后,我觉得下面砍我想出了,是最简单的跟踪和代码。 但是请注意,这不使用准备好的查询,但得到的工作做无论如何:

例如:假设你有一个参数列表的“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()方法执行查询。 只要确保你没有这个词“参数”,在您的查询的任何地方。 您可以使用特殊字符和字母来代替单词“参数”的组合,以确保不存在这样的查询来一个字的可能性。 希望你得到了解决。



Answer 8:

其他方法:

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
}


文章来源: How to set list of parameters on prepared statement?