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时的基本技能,所以我非常想知道它.
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)