Java中的PrepareStatement问题

Cra*_*der 0 java jdbc

我创建了3个字段语言,国家,安装类型的表.当我写一个查询来打印每个字段中的最大出现值时,我遇到了一个奇怪的问题.任何人都可以说出原因.这是我的代码.

PreparedStatement ps1= null;
ps1 = conn.prepareStatement("desc Configuration");

ResultSet rs1=ps1.executeQuery();
while(rs1.next()) {

    System.out.print(rs1.getString(1)+":");

    PreparedStatement ps2= null;

    ps2 = conn.prepareStatement("select ? from Configuration c1 "+
                                "  group by language "+
                                "  having count(*) >= all " +
                                "     ( select count(*) from Configuration c2 "+
                                "         group by language )");

    ps2.setString(1,rs1.getString(1));

    ResultSet rs2=ps2.executeQuery();

    while(rs2.next())
        System.out.print(rs2.getString(1));

    System.out.println();
}
Run Code Online (Sandbox Code Playgroud)

我得到的输出是语言:语言但是我期待的输出是 语言:英语就是这样.如果我替换'?',我会得到以后的输出 在准备声明中使用语言.但是如果我给出相同的语言?我得到了我为ps2.setString提供的东西.

为什么会这样呢?有解决方案吗

axt*_*avt 5

? 在预准备语句中,它不是文本替换的占位符,它是一个参数,因此它的值始终被解释为数据,而不是查询语法的任意部分.

因此,在这种情况下,正在执行的实际查询是等效的select 'language' from ....

如果您需要替换除数据之外的部分查询,则必须使用连接(谨防SQL注入!):

ps2 = conn.prepareStatement("select " 
    + rs1.getString(1)
    + " from Configuration c1 group by language having count(*) >= all( select count(*)from Configuration c2 group by language )");  
Run Code Online (Sandbox Code Playgroud)