如何使用占位符为预准备语句绑定表名的变量

时间:2015-01-06 06:36:53

标签: java

我遇到了prepareStatement的问题。我正在尝试构建一个查询以选择计数,但表名不同,代码如下:

String sql = "SELECT COUNT(0) AS CNT FROM ? WHERE STUD_NM <> 'ABC' ";

String tableName;

for (int i = 0; i < studCode.size(); i++) {

    count = 0;

    tableName = "";  

    pstmt = con.prepareStatement(sql);

    pstmt.setString( 1 , "S_"+studCode.get(i));

   Syso(pstmt); // 

}

查询准备好了,

"SELECT COUNT(0) AS CNT FROM 'S_HUBRECORD' WHERE STUD_NM <> 'ABC'"

为什么它会在表名附加单引号?

3 个答案:

答案 0 :(得分:1)

你不能。您需要使用字符串连接构造查询。 PreparedStatement用于字段值,而不是表名。它包装引号的原因也是因为你使用了setString

答案 1 :(得分:0)

他们将表名视为您使用类型转换的字符串可能是有效的。

答案 2 :(得分:0)

你应该这样做,

for (int i = 0; i < studCode.size(); i++) {

    String sql = "SELECT COUNT(0) AS CNT FROM "+"S_"+studCode.get(i)+" WHERE STUD_NM <> 'ABC' ";
    count = 0;

    pstmt = con.prepareStatement(sql);

    Syso(pstmt); // 

}