在preparedStatement上使用setString JDBC的SQLSyntaxError

时间:2014-08-14 15:10:36

标签: sql jdbc

我想查询一个简单的'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'nucleide_kinds'。

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

1 个答案:

答案 0 :(得分:1)

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

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

如果要动态控制对象名称,则需要自己在查询字符串中连接它们,或者使用类似jOOQ的解决方案,例如参见jOOQ as a SQL builder