我必须编写一个java程序来从3个表中获取数据。出于某些商业原因,我无法加入他们。我必须逐个获取记录,如下所示
Fetch all records from Table1
For every record on table1 do
if some business-validation passes
retrieve corresponding records from Table2
For every record on table2 do
if some business-validation passes
retrieve corresponding records from Table3
我编写的代码如下:
Statement statement1 = dbConnection.createStatement();
ResultSet rs1 = statement1.executeQuery("QUERY TO RETRIEVE DATA FROM TABLE1");
while(rs1.next()){
// Do business validation
Statement statement2 = dbConnection.createStatement();
ResultSet rs2 = statement2.executeQuery("QUERY TO RETRIEVE CORRESPONDING DATA FROM TABLE2");
while(rs2.next()){
// Do business validation
Statement statement3 = dbConnection.createStatement();
ResultSet rs3 = statement2.executeQuery("QUERY TO RETRIEVE CORRESPONDING DATA FROM TABLE3");
while(rs3.next()){
}
rs3.close();
statement3.close()
}
rs2.close();
statement2.close()
}
rs1.close();
statement1.close()
每个表可以有数百条记录。 现在我的问题是
在每个循环中执行createStatement
并关闭它是否正确?它会贵吗?
一个。如果我在开头创建3个语句并仅使用它们来调用executeQuery()
,该怎么办?有利吗?
湾在这种情况下,我需要关闭statement2
&内部使用后statement3
?
哪种方式首选?有没有更好/更快的方式?
答案 0 :(得分:3)
您的query2和query3似乎分别接受来自查询1和查询2的结果集的参数。
为什么不为所有这些使用PreparedStatement。有关使用PreparedStatement over Statement
的好处,请参阅此链接Difference between Statement and PreparedStatement
使用PreparedStatement在循环外声明所有三个语句,然后在循环内使用它们。 @Elliott Frisch关于任何Statement类型的结束是正确的。
始终尽可能避免在循环中使用createStatement。
您还必须考虑存储过程。如果您可以编写一个具有循环逻辑的存储过程,那么这可能是您的最佳方法。但这实际上取决于情况。