如何将java循环与SQL条件选择混合使用

A. *_*sey 0 java mysql sql exception-handling

所以我想使用Java从SQL数据库中进行选择,受条件语句(小于或等于某些东西)的约束,受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" 
                    );
Run Code Online (Sandbox Code Playgroud)

现在Java在这里返回一个异常,因为它不希望我在这种情况下使用"i"; 但是,如果不能在这里使用它,我不知道如何改变这种状况.问题是:我希望从一个数据库中检索数据,目的是进行一些操作并将结果放入新的数据库中.这些操作取决于获取最新的数据,这就是为什么我想增加数量限制millisFromMid.那有意义吗?

有没有人对某人如何做这样的事情提出建议?这似乎是一起使用Java和SQL时的基本技能,所以我非常想知道它.

Ida*_*rye 5

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

第一个选项 - 注入 - 只是将i的值放在字符串中:

"SELECT max( millisFromMid ) FROM stockInfo1 WHERE ( millisFromMid <=  34200000 + (120000)*"+i+" ) GROUP BY stockID"
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

注意?那是替换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.
}
Run Code Online (Sandbox Code Playgroud)

  • 好答案。虽然“int”值没有风险,但我还要补充一点,出于安全原因,直接将值注入 SQL 字符串通常是一个坏主意(例如,如果这是由外部提供的字符串,这将是一个大问题用户)。所以一般来说你应该更喜欢 API 方法。 (2认同)