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

时间:2013-11-24 23:41:06

标签: 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.getString("CO1Name");
    COL2Age[i] = Rs.getString("CO2Rating");
}

for循环在try catch语句中,它抱怨错误“'where子句'中的未知列'i'”

我猜测在查询中如何插入变量i有某种方法。

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

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:4)

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

PreparedStatement stmt = "Select ID, CO1Name, CO2Rating"
    + " FROM Table1"
    + " WHERE ID >= ? AND ID <= ?"
    + " ORDER BY ID";

并在占位符中绑定(除非有充分的理由否则,总是在将数据注入查询时使用占位符)。在这种情况下,这些值可能已在上面进行了硬编码,就像它们在for循环中被硬编码一样,但此处显示了绑定以供将来参考:

stmt.setInt(1, 1);
stmt.setInt(2, 8);

然后执行查询:

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条记录 - 即不存在的记录可能需要单独检测/处理。

另外(但未显示),确保在完成后清理(close)ResultSet:使用try / finally或try-with-resources构造。

答案 1 :(得分:1)

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

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