Java Resultset中的Resultset
我面临一个小问题。我从表中获取数据,然后 我循环结果集。在每个循环中,我使用返回的行数据 按resultset对另一个表执行另一个查询。我正在发帖 下面是代码 问题是,我感觉到代码中存在一些问题,但无法解决 识别它。代码运行良好,没有任何错误或错误 例外情况。帮我找到问题所在。也给我解释一下 我知道第一个结果集可以使用Dao。但不是吗 创建太多的对象Java Resultset中的Resultset,java,jdbc,Java,Jdbc,我面临一个小问题。我从表中获取数据,然后 我循环结果集。在每个循环中,我使用返回的行数据 按resultset对另一个表执行另一个查询。我正在发帖 下面是代码 问题是,我感觉到代码中存在一些问题,但无法解决 识别它。代码运行良好,没有任何错误或错误 例外情况。帮我找到问题所在。也给我解释一下 我知道第一个结果集可以使用Dao。但不是吗 创建太多的对象 public ResultSet search_NatSupport() throws ClassNotFoundException,
public ResultSet search_NatSupport() throws ClassNotFoundException, SQLException {
String query = "SELECT SYMBOL, Date, sup, res FROM Nat_Support WHERE SYMBOL IS NOT ?;";
PreparedStatement stmt = null;
ResultSet rs = null;
DBHelper helper = DBHelper.getInstance();
stmt = helper.getConn().prepareStatement(query);
stmt.setString(1, null);
rs = stmt.executeQuery();
return rs;
}
public void searchAgain(ResultSet rs) {
String query = "select * from bhav_NSE where symbol = ?";
PreparedStatement stmt = null;
try {
while (rs.next()) {
stmt = DBHelper.getInstance().getConn().prepareStatement(query);
stmt.setString(1, rs.getString(1));
ResultSet res = stmt.executeQuery();
while(res.next()){
System.out.println(res.getString(1));
}
res.close();
}
rs.close();
} catch (SQLException | ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
BhavMaster_NSE finals = new BhavMaster_NSE();
try {
finals.searchAgain(finals.search_NatSupport());
} catch (ClassNotFoundException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
有一次我需要使用一个结果集的返回结果作为另一个结果集的输入,我遇到了这个问题,但是我发现我不能这样做,调试后我发现当你在一个结果集中编写一个结果集时,第一个结果集变为等于Null 所以这里有一个技巧:
public void searchAgain(ResultSet rs) {
try {
while (rs.next()) {
bhavNse(rs.getString(1));
}
rs.close();
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
}
}
public void bhavNse(String var) {
try {
String query = "select * from bhav_NSE where symbol = ?";
PreparedStatement stmt = null;
stmt = DBHelper.getInstance().getConn().prepareStatement(query);
stmt.setString(1, var);
ResultSet res = stmt.executeQuery();
while(res.next()){
System.out.println(res.getString(1));
}
res.close();
}
catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
}
}
你不需要把它放进去;在查询的末尾。
使用任何可关闭的资源时,请使用try with resource
即使您想向被调用方抛出异常,也可以使用throw关键字
try with resource将负责关闭所有资源,即使出现任何故障
或者旧的方法是在失败和成功时关闭资源。在同一个查询中,连接键上的表,这里是Symbol并组合NOTNULL,而不是两个结果集
public void search()
{
PreparedStatement stmt = null;
String query = "select bnse.* from bhav_NSE bnse,Nat_Support nsup where bnse.symbol=nsup.symbol and nsup.symbol is not null";
stmt = DBHelper.getInstance().getConn().prepareStatement(query);
ResultSet res = stmt.executeQuery();
while(res.next()){
// Get data res.getString(..);
}
res.close();
}
rs.close();
}
那么这里到底出了什么问题呢?没什么问题,但我怀疑我使用结果集的方法。在另一个循环结果集中使用一个结果集可以吗?不可以,您可能只能使用一个请求,例如从bhav_NSE中选择*,其中从Nat_支持中选择不同的符号。顺便说一句,您正在泄漏资源。您是否指向未关闭的语句和连接。代码是紧密耦合的。您可能可以在通用方法中去掉查询部分,使用参数查询字符串和参数列表,使用资源是一个不错的选择,但我们使用的是Jdk 1.6,因此我们必须走很长的路。为了兼容性,我必须在以后更改代码,因为我在这里使用multi-catch。这将在Java6中产生错误。
public void search()
{
PreparedStatement stmt = null;
String query = "select bnse.* from bhav_NSE bnse,Nat_Support nsup where bnse.symbol=nsup.symbol and nsup.symbol is not null";
stmt = DBHelper.getInstance().getConn().prepareStatement(query);
ResultSet res = stmt.executeQuery();
while(res.next()){
// Get data res.getString(..);
}
res.close();
}
rs.close();
}