關於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();
來自:http://blog.csdn.net/snowwhitewolf/article/details/39609629