【问题标题】:SQLSyntaxError using setString JDBC on preparedStatementSQLSyntaxError 在preparedStatement 上使用setString JDBC
【发布时间】:2014-08-14 15:10:35
【问题描述】:

我想查询一个简单的“SELECT * FROM”。 我做了一个方法:

String sql = 
            "SELECT ? " +
            "FROM ?";
    try (
            PreparedStatement stmt = conn.prepareStatement(sql);
            ){

        stmt.setString(1, "*");
        stmt.setString(2, "nuclide_kinds"); 

        System.out.println(stmt.toString());
        ResultSet rs = stmt.executeQuery();
    } 

当我想执行这个时,它会给出一个 SQLSyntaxError。 toString() 打印:SELECT '*' FROM 'nuclide_kinds'。

这是怎么来的?神奇的额外'是原因吗?

【问题讨论】:

    标签: sql jdbc


    【解决方案1】:

    您根本不能使用参数来指定对象名称,例如表名或列名。

    MySQL JDBC 驱动程序似乎构建了一个几乎正确的查询,因为默认情况下它会替换驱动程序中的参数,但是由于这些参数是字符串,它会引用(并转义)它们,使它们无法用作对象名称。大多数其他数据库驱动程序将用于准备的原始查询字符串发送到服务器,并且仅在执行时发送参数值。然而,这种区别对于这个问题并不重要:您不能参数化对象名称。

    如果你想动态控制对象名称,那么你需要自己在查询字符串中连接它们,或者使用像 jOOQ 这样的解决方案,例如jOOQ as a SQL builder

    【讨论】:

      猜你喜欢
      • 2021-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-06
      • 2013-11-14
      • 2023-04-09
      相关资源
      最近更新 更多