有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JDBC PreparedStatement似乎忽略了占位符

给定PreparedStatement的以下代码,我使用占位符(?)用String填充:

String sql = "SELECT SUM(Premium), SUM(AgentComm)\n" +
                "FROM \"?_KLCommissions\" \n" +
                "WHERE AgentCode = \"?\";";

    PreparedStatement preparedStatement = conn.prepareStatement(sql);
    preparedStatement.setString(1, year);
    preparedStatement.setString(2, agent.getAgentNumber());

    ResultSet resultSet = preparedStatement.executeQuery();

但是,在执行查询时,我得到一个SQL错误:no such table: ?_KLCommissions

为什么在处理查询时?占位符没有被替换


共 (1) 个答案

  1. # 1 楼答案

    它包含在双引号内,这意味着它不是占位符-它只是值的一部分

    除此之外,大多数SQL数据库不允许将参数用于表名和列名之类的内容-只有可以参数化。因此,您可能需要直接构建表名部分,然后使用

    WHERE AgentCode = ?
    

    对于代理代码-因此您只需设置一个参数。比如:

    String tableName = year + "_KLCommissions";
    // TODO: Put validation here unless you already have *complete confidence*
    // that the value of "year" can't be messed around with.
    String sql = "SELECT SUM(Premium), SUM(AgentComm) " +
                 "FROM " + tableName + " " +
                 "WHERE AgentCode = ?";
    
    PreparedStatement preparedStatement = conn.prepareStatement(sql);
    preparedStatement.setString(1, agent.getAgentNumber());
    ResultSet resultSet = preparedStatement.executeQuery();
    

    注意这里的TODO—您确实不希望用户能够为year提供任意值,因为这样他们就可以在您的查询中放入任意SQL