jdbc connection是否可以建立多個statement

langgufu314發表於2012-06-12

關於Statement物件:
  前面說過,Statement物件是用來繫結要執行的操作的,在它上面有三種執行方法:
即用來執行查詢操作的executeQuery(),用來執行更新操作的executeUpdate()和用來執行
動態的未知的操作的execute().
  JDBC在編譯時並不對要執行的SQL語句檢測,只是把它看著一個String,只有在驅動
程式執行SQL語句時才知道正確與否.
  一個Statement物件同時只能有一個結果集在活動.這是寬容性的,就是說即使沒有
呼叫ResultSet的close()方法,只要開啟第二個結果集就隱含著對上一個結果集的關閉.所以
如果你想同時對多個結果集操作,就要建立多個Statement物件,如果不需要同時操作,那麼可
以在一個Statement物件上須序操作多個結果集.
 
  這裡我不得不特別說明一下,很多人會用一個Statement進行巢狀查詢,然後就來問
我說為什麼不能迴圈?道理上面已經說清楚了.我們來詳細分析一下巢狀查詢:
  Connection conn = null;
  Statement stmt = null;
  conn = .......;
  stmt = conm.createStatement(xxxxxx);
  ResultSet rs = stmt.executeQuery(sql1);
  while(rs.next()){
    str = rs.getString(xxxxx);
    ResultSet rs1 = stmt.executeQuery(\"select * from 表 where 欄位=str\");
  }
當stmt.executeQuery(\"select * from 表 where 欄位=str\");賦給rs1時,這時隱含的操作
是已經關閉了rs,你還能迴圈下去嗎?
所以如果要同時操作多個結果集一定要讓它他繫結到不同的Statement物件上.好在一個connection
物件可以建立任意多個Statement物件,而不需要你重新獲取連結.

另外PreparedStatement還支援接收引數.在預編譯後只要傳輸不同的引數就可以執行,大大
提高了效能.
   
  PreparedStatement ps = conn.prepareStatement(\"select * from 表 where 欄位=?\");
  ps.setString(1,引數);
  ResultSet rs = ps.executeQuery();
 
  CallableStatement:是PreparedStatement的子類,它只是用來執行儲存過程的.
  CallableStatement sc = conn.prepareCall(\"{call query()}\");
  ResultSet rs = cs.executeQuery();

相關文章