【问题标题】:Where should ? be placed in a PreparedStatement? [duplicate]应该在哪里?放在 PreparedStatement 中? [复制]
【发布时间】:2015-08-22 12:28:30
【问题描述】:

我正在使用PreparedStatement 从表中选择记录:

public static String getMemberInfo(String columnName, Integer memberId) {       
    String memberInfo = "";
    String sql = "SELECT ? FROM member WHERE member_id = ?";
    DatabaseConnector.setConn();

    try(Connection conn = DatabaseConnector.getConn();
        PreparedStatement ps = conn.prepareStatement(sql)) {

        ps.setString(1, columnName);
        ps.setInt(2, memberId);

        try(ResultSet rs = ps.executeQuery()) {
            if(rs.next()) {
                memberInfo = rs.getString(columnName);
            }
        }

    } catch(SQLException se) {
        se.printStackTrace();
    }

    return memberInfo;
}

当我使用 SELECT " + columnName + " FROM member WHERE member_id = ?,有效。

但是当我使用 SELECT ? FROM member WHERE member_id = ?,没有。

? 应该放在准备好的语句中的什么位置?

【问题讨论】:

标签: java mysql sql jdbc prepared-statement


【解决方案1】:

列名必须是硬编码的,只能使用?设置列值。

但您可以通过执行以下操作来设置动态列名:

String sql = "SELECT "+ columnName +" FROM member WHERE member_id = ?";

【讨论】:

  • 限制不是来自 JDBC。它是不允许参数化列名的数据库。主要是因为它无法在不知道列名和表名的情况下准备查询计划。
  • 哦,好的,感谢@Andomar 提供的信息,我已从答案中删除了该行。
【解决方案2】:

?用于输入值(通常在WHERE 子句条件中)。

?不适用于选定的列。

【讨论】:

    猜你喜欢
    • 2013-12-16
    • 2012-02-17
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 2011-05-20
    • 2022-09-29
    相关资源
    最近更新 更多