gpt4 book ai didi

java - Java中PrepareStatement的问题

转载 作者:行者123 更新时间:2023-12-01 07:14:59 24 4
gpt4 key购买 nike

我创建了包含 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();
}

我在这里得到的输出是语言:语言但我期望的输出是语言:英语就像这样。如果我替换“?”,我会得到稍后的输出在准备声明中使用语言。但是如果我给出相同的内容?我得到了我为 ps2.setString 付出的一切。

为什么会发生这种情况。有什么解决办法吗?

最佳答案

准备好的语句中的

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

因此,在这种情况下,实际执行的查询相当于select 'language' from ...

如果您需要替换除数据之外的查询部分,则必须使用串联(小心 SQL 注入(inject)!):

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

关于java - Java中PrepareStatement的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5133933/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com