【问题标题】:Using MySQL's IN statement in Java在 Java 中使用 MySQL 的 IN 语句
【发布时间】:2011-04-03 02:05:10
【问题描述】:

我必须查明表中是否有条目,而这些条目也存在于我在 Java 中的列表中。逻辑解决方案是“SELECT column FROM table WHERE column IN (?)”然后设置?到我在 Java 中拥有的数组,但是 setArray 要求一个 java.sql.Array,我不确定如何获得一个,如果它真的是我正在寻找的。​​p>

【问题讨论】:

  • 你使用什么 API 来访问数据库? setArray 方法是什么?

标签: java mysql arrays


【解决方案1】:

假设参数都是由你的程序逻辑生成的,即没有 SQL 注入的风险,那么我认为可以求助于良好的旧字符串操作......

String status = "'Pending','Approved'";
String sql  = "SELECT * FROM table ";
       sql += "WHERE status IN (" + status + ")";
ps = conn.prepareStatement(sql);

如果参数是由用户输入以任何方式生成的,那么这会使您面临 SQL 注入。但是如果你在你的应用代码中控制参数,我看不出有什么问题。

如果从数组传递,请确保在构建参数字符串时用引号将每个参数括起来。

最简单的解决方案通常更好。

【讨论】:

    【解决方案2】:

    你不能用 JDBC 做到这一点,但如果使用 spring 或 hibernate,两者都支持重写查询以将参数列表展开为正确数量的 ?。

    Query query = session.createQuery("select x from y where z in (:params)");
    query.setParameterList("params", paramList);
    List list = query.list();
    

    在春天你需要使用 NamedParameterJdbcTemplate。

    【讨论】:

    • 不,Spring 也不会这样做。
    • 感谢您的更正 axtavt - 我还没有消化 Spring 3.x。
    • 我想知道您是否查看了 Spring 3.x 源代码,它会按照我的建议进行操作。在这种情况下,Spring 只是“语法糖”;只有在 JDBC 驱动程序支持的情况下才能轻松完成。是否对 JDBC 进行了更改以使这成为可能?
    • @duffymo:Spring 正在重写查询。 NamedParamJdbcTemplate 支持它重写为的休眠样式命名参数(:params)?内部。就像休眠一样,它可以检测到一个参数实际上是一个集合/数组并展开:params -> (?, ?, ? ... ?) JDBC 不支持这个,但它会很好。
    【解决方案3】:

    不,这是不可能的。

    很遗憾,IN 需要两个步骤:

    1. 为每个值添加一个绑定?
    2. 循环遍历这些值并将它们绑定到?

    没有简单的方法。

    【讨论】:

    • 我会请所有对我的答案投反对票的人尝试 jGuru 解决方案,看看它是否真的有效。如果失败,请回来投票给我。
    • 是的,如果 jGuru 方法失败或不适用于此处,我将删除我的答案。很遗憾,自己无法测试。
    • 这是唯一的方法。今晚我将对其进行测试以证明这一点。
    猜你喜欢
    • 2020-06-20
    • 2011-01-12
    • 2017-11-01
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    相关资源
    最近更新 更多