【问题标题】:Java PreparedStatement set IN parameter as int array [duplicate]Java PreparedStatement将IN参数设置为int数组[重复]
【发布时间】:2012-11-21 15:13:40
【问题描述】:

可能重复:
PreparedStatement IN clause alternatives?

SELECT * FROM tableName WHERE id IN ?

我希望将 PreparedStatement 的 IN 参数设置为 int[]。例如,一个整数 {1, 2, 3, 4} 的数组将在查询中变为 IN (1,2,3,4)

有没有一种简单的方法可以使用 PreparedStatement 的方法来实现此功能,或者我必须通过循环遍历数组来动态地将 IN 参数创建为字符串?

我想像 #setString(int parameterIndex, String x) 类似的东西,但当然是一个 int 数组。

【问题讨论】:

  • 我不认为它是这样工作的。我认为您需要找到一种不同的语法,其中有多个?并设置每个的值。不过,这个想法很酷。
  • 您将不得不编写自己的方法。例如stackoverflow.com/a/1916391/738746,您可以重复使用。请注意,arguments 不是ints 的数组,而是Objects 的数组。
  • 我正要建议做你刚才提到的:通过循环遍历数组来动态构建查询。如果您想要更方便的东西,请使用 JPA 2(您可以在其中将集合分配给查询参数)。
  • 很高兴找到@BheshGurung。由于我的问题与此重复,我投票关闭它。 (不过,我并没有删除它,因为我觉得我的问题的标题对于有同样问题的未来程序员来说更易于搜索)。
  • 把另一道题的题目改一下,然后把这道题删掉怎么样?

标签: java mysql arrays jdbc prepared-statement


【解决方案1】:

我推荐 Spring JDBC。看看使用它有多么容易:

    NamedParameterJdbcTemplate t = new NamedParameterJdbcTemplate(dataSource);
    Map<String, Object> params = new HashMap<String, Object>();
    params.put("ids", Arrays.asList(1, 2));
    List<Map<String, Object>> list = t.queryForList("select * from t1 where id in (:ids)", params);

您会发现 Spring JDBC 的优点不仅仅在于它。命名参数,无需创建/关闭Connection,PreparedStatement,ResultSet,无检查异常,声明式事务支持等很多东西。

【讨论】:

  • +1,非常有趣的方法。但是,这需要我重写我的大部分应用程序以适应(而且我不知道这种方法是否将连接池化以供异步使用),所以我不会采用这条路线。
【解决方案2】:

我知道的唯一方法是在创建准备好的语句以添加新的 ?s 之前更改查询字符串。然后像往常一样执行绑定。

【讨论】:

  • 我将此标记为已接受,因为这确实是我选择采用的方法,但我不赞成它,因为它是在通过 cmets 回答问题之后出现的。不过还是谢谢。
猜你喜欢
  • 2016-05-23
  • 1970-01-01
  • 1970-01-01
  • 2011-03-07
  • 2013-04-23
  • 1970-01-01
  • 2015-10-05
  • 2014-03-03
相关资源
最近更新 更多