尝试将Java变量传递到sql字符串中

尝试将Java变量传递到sql字符串中,java,sql,database,Java,Sql,Database,我在网上浏览了一下,但似乎找不到我问题的确切答案 基本上,我有一个成功运行的数据库和表。现在我想一行一行地读取表中的每一行,并将结果存储到一个数组中,我尝试使用for循环,以使其更专业,而不是使用重复 我有这个密码 for (int i=1; i<=8; i++) { String query = "Select * FROM Table1 WHERE ID = i"; Rs = St.executeQuery(query); COL1Title[i] = Rs.g

我在网上浏览了一下,但似乎找不到我问题的确切答案

基本上,我有一个成功运行的数据库和表。现在我想一行一行地读取表中的每一行,并将结果存储到一个数组中,我尝试使用for循环,以使其更专业,而不是使用重复

我有这个密码

for (int i=1; i<=8; i++)
{
    String query = "Select * FROM Table1 WHERE ID = i";
    Rs = St.executeQuery(query);
    COL1Title[i] = Rs.getString("CO1Name");
    COL2Age[i] = Rs.getString("CO2Rating");
}
for循环位于try-catch语句中,它在“where子句”中抱怨错误未知列“i”

我猜在查询中如何插入变量i是有一定方法的

我应该指出,ID是一个添加了自动递增功能的列,如果有帮助的话,它是主键


有人能帮我吗?

您需要将字符串中的i作为整数传递,将行替换为:

String query = String.format("Select * FROM Table1 WHERE ID = %d",i);

您需要以整数形式传递字符串中的i,将行替换为:

String query = String.format("Select * FROM Table1 WHERE ID = %d",i);

首先,我们可以将任务简化为执行单个查询。请注意,添加了范围限制和ORDER BY-如果没有ORDER BY,则结果的顺序未指定

PreparedStatement stmt = "Select ID, CO1Name, CO2Rating"
    + " FROM Table1"
    + " WHERE ID >= ? AND ID <= ?"
    + " ORDER BY ID";
然后执行查询:

ResultSet rs = stmt.executeQuery();
并迭代结果。请注意,在读取任何列之前必须调用rs.next一次光标在任何记录之前启动,在这种情况下,它可以轻松处理一系列结果

while (rs.next()) {
   int id = rs.getInt("ID");
   String title = rs.getString("CO1Name");
   String name = rs.getString("CO2Rating");
   // do stuff with this record
}
请注意,即使ORDER BY保证结果按ID的顺序进行迭代,但假设数据库基数规则确保每个结果都有唯一的ID,则可能会返回0到8条记录—也就是说,可能需要单独检测/处理不存在的记录


同样但未显示,请确保清理完成后关闭结果集:使用try/finally或try with resources构造。

首先,我们可以通过执行单个查询来简化任务。请注意,添加了范围限制和ORDER BY-如果没有ORDER BY,则结果的顺序未指定

PreparedStatement stmt = "Select ID, CO1Name, CO2Rating"
    + " FROM Table1"
    + " WHERE ID >= ? AND ID <= ?"
    + " ORDER BY ID";
然后执行查询:

ResultSet rs = stmt.executeQuery();
并迭代结果。请注意,在读取任何列之前必须调用rs.next一次光标在任何记录之前启动,在这种情况下,它可以轻松处理一系列结果

while (rs.next()) {
   int id = rs.getInt("ID");
   String title = rs.getString("CO1Name");
   String name = rs.getString("CO2Rating");
   // do stuff with this record
}
请注意,即使ORDER BY保证结果按ID的顺序进行迭代,但假设数据库基数规则确保每个结果都有唯一的ID,则可能会返回0到8条记录—也就是说,可能需要单独检测/处理不存在的记录


同样,但未显示,请确保清理完成后关闭结果集:使用try/finally或try with resources构造。

您可以简单地连接i。正如在字符串query=Select*表1中,其中ID=+i.@user2864740 i是一个int。不必担心sql注入。也许您应该一次读取多行?其中ID>=1,ID添加了改进,现在有一个新的错误:java.sql.SQLException:Before-start-of-resultset@Bobski在尝试访问第一条记录的任何列之前,必须先调用rs.next一次。结果集指针在第一条记录之前开始。就是这样,它可以像这样使用:whilers.next{/*进程记录*/}。正如在字符串query=Select*表1中,其中ID=+i.@user2864740 i是一个int。不必担心sql注入。也许您应该一次读取多行?其中ID>=1,ID添加了改进,现在有一个新的错误:java.sql.SQLException:Before-start-of-resultset@Bobski在尝试访问第一条记录的任何列之前,必须先调用rs.next一次。结果集指针在第一条记录之前开始。就是这样,它可以像这样使用:whilers.next{/*process record*/}。我反对提倡使用手动SQL字符串构建。没有很好的理由不要这样做。当然,如果不解释为什么只有很好的理由才能使用它,就不要建议它!这个手动SQL构建绝对没有问题。如果您正在考虑SQL注入,我希望看到您尝试使用循环在本地定义的整数。但是这个答案解决了op的问题,因此非常有用。我建议您在进行向下投票之前留下评论,原因不适用于给定情况。我同意应该解释SQL注入,但您可以用更温和的语气来表达它。@EdwinDalorzo不,我不是。我是说这是错误的,我为它获得了积极的选票而感到羞愧。我会在一次代码审查中拒绝这个代码/建议,并且我相信应该存在类似的标准。我反对提倡使用手动SQL字符串构建。没有很好的理由不要这样做。当然,如果不解释为什么只有很好的理由才能使用它,就不要建议它!这个手动SQL构建绝对没有问题。如果您正在考虑SQL注入,我希望看到您尝试使用循环在本地定义整数。但是这个答案解决了op的问题,因此很有用。我建议您在down v之前留下评论
由于在给定情况下不适用的原因而通知。我同意应该解释SQL注入,但您可以用更温和的语气来表达它。@EdwinDalorzo不,我不是。我是说这是错误的,我为它获得了积极的选票而感到羞愧。我会在代码审查中拒绝这个代码/建议,我相信类似的标准也应该存在。很抱歉这个愚蠢的问题,但是整数在里面是什么意思getString@Bobski它们指的是列索引1是第一列。或者,也许更好,可以使用列名。看-事实上,我会把它改回来:\n很抱歉这个愚蠢的问题,但是整数在里面是什么意思getString@Bobski它们指的是列索引1是第一列。或者,也许更好,可以使用列名。看-实际上,我会把它改回来:\