關于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對象,而不需要你重新獲取連結.
????關于獲取和設置Statement的選項:只要看看它的getXXX方法和setXXX方法就明白了,這兒
作為基礎知識只提一下以下幾個:
????setQueryTimeout,設置一個SQL執行的超時限制.
????setMaxRows,設置結果集能容納的行數.
????setEscapeProcessing,如果參數為true,則驅動程序在把SQL語句發給數據庫前進行轉義替
換,否則讓數據庫自己處理,當然這些默認值都可以通過get方法查詢.
????Statement的兩個子類:
????PreparedStatement:對于同一條語句的多次執行,Statement每次都要把SQL語句發送給數據
庫,這樣做效率明顯不高,而如果數據庫支持預編譯,PreparedStatement可以先把要執行的語句一次發
給它,然后每次執行而不必發送相同的語句,效率當然提高,當然如果數據庫不支持預編譯,
PreparedStatement會象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();
????
????關于更高級的知識我們在JDBC高級應用中介紹.?