0

所以我想从 SQL 数据库中进行选择,使用 Java,受条件语句(小于或等于某些东西)的影响,受 Java 中的某个循环的影响。换句话说,类似于以下内容:

for (int i=0; i< 195; i++) {
            // Get the results of the SQL query
            resultSet = statement.executeQuery( 
                    "SELECT max( millisFromMid ) FROM stockInfo1 WHERE ( millisFromMid <=  34200000 + (120000)*i ) GROUP BY stockID" 
                    );

现在Java在这里返回一个异常,因为它不希望我在这种情况下使用“i”;但是,由于无法在此处使用它,我不确定如何更改此条件。问题是这样的:我希望从一个数据库中检索数据,目的是进行一些操作并将结果放入一个新数据库中。这些操作取决于获取最新的可用数据,这就是为什么我想增加millisFromMid 的边界数。那有意义吗?

有人对某人如何做这样的事情有建议吗?这似乎是一起使用 Java 和 SQL 时必须具备的一项基本技能,所以我非常想知道它。

4

3 回答 3

5

SQL 语句在与 Java 代码不同的环境中解析和运行——不同的语言、不同的范围,除非你使用 SQLite,否则它们在不同的进程甚至不同的机器中运行。因此,您不能只i从 SQL 代码中引用 Java 变量——您必须注入它或使用特殊的 API。

第一个选项 - 注入 - 是简单地将 i 的值放入字符串中:

"SELECT max( millisFromMid ) FROM stockInfo1 WHERE ( millisFromMid <=  34200000 + (120000)*"+i+" ) GROUP BY stockID"

就个人而言,我更喜欢使用String.format- 但这只是我。

String.format("SELECT max( millisFromMid ) FROM stockInfo1 WHERE ( millisFromMid <=  34200000 + (120000)*%d ) GROUP BY stockID",i)

第二个选项 - 通过 API - 更复杂但也更快(特别是如果你将它与事务结合使用) - 使用 SQL 参数。您需要创建一个准备好的语句:

PreparedStatement preparedStatement = connection.prepareStatement("SELECT max( millisFromMid ) FROM stockInfo1 WHERE ( millisFromMid <=  34200000 + (120000)*? ) GROUP BY stockID")

请注意?正在替换的i- 这是您的参数。您创建prepareStatement 一次- 在循环之前,在循环内您每次设置参数并执行它:

for (int i=0; i< 195; i++) {
    preparedStatement.setInt(1,i); //Set the paramater to the current value of i.
    resultSet = preparedStatement.executeQuery(); //Execute the statement - each time with different value of the parameter.
}
于 2012-12-28T00:40:23.123 回答
1

问题 os 数据库没有被告知 i 的值。而是让 Java 将值放入字符串中,然后将其提交到数据库。

string sql = "select * from foo where bar=" + i;

您需要始终记住,数据库只知道您明确告诉它的内容,并且您实际上是在运行时编写将在另一台主机上执行的代码。

于 2012-12-28T00:33:39.937 回答
0

您可以生成一个 sql 字符串并通过 jdbc 调用它,使用绑定变量从性能、安全性来看更正确。它还可以避免您转义任何特殊字符。

由于您正在学习将 sql 与 jdbc 一起使用,请阅读有关绑定变量的内容。一个例子是here

于 2012-12-28T00:41:39.193 回答