標籤:des style blog io color ar 使用 sp java
今天複習了下jdbc操作資料庫,其實通過複習,感覺對類的熟悉和方法的運用都是小事,畢竟有API都可以查得到。
關鍵是一些設計,
1、 比如:
Class.forName("");這個是用來載入驅動,擷取driver執行個體,並在載入的過程中註冊到了DriverManager中,由後者去管理。
所以:在DriverManager.getConnection()時,發生的操作有:Drivermanager尋找已經註冊的列表,然後根據url去對應,最後通過driver擷取資料庫連接,假如有註冊的重複的驅動,預設最先匹配的那個驅動為正確結果。在DriverManager中提供了關於一些driver的管理機制,包括重複的一些處理。
2、 PreparedStatement,Statement
兩者的區別:前者相當於sql先行編譯,在程式執行的時候已經把sql編譯好,儘管它可以動態傳參,這也提高了執行效率。
前者還可以防止sql注入
如果基本資料庫和驅動程式在語句提交之後仍保持這些語句的開啟狀態,則同一個 PreparedStatement 可執行多次。如果這一點不成立,那麼試圖通過使用 PreparedStatement對象代替 Statement 對象來提高效能是沒有意義的。
樣本:
1 pstmt.setString(1, "Hi"); 2 for (int i = 0; i < 10; i++) { 3 pstmt.setInt(2, i); 4 int rowCount = pstmt.executeUpdate(); 5 }
3、ResultSet提供了很好的結果集管理機制,主要實現了java.sql.ResultSet介面,
比如查看結果集有幾行幾列,查看結果集的列名,查看結果集最後一行是否為空白等等。
4、關於一些長欄位的輸入和輸出問題,見代碼。
for(;;);mt = con.createStatement(); ResultSet r = stmt.executeQuery("SELECT x FROM Table2"); // 現在以 4K 塊大小擷取列 1 結果: byte buff = new byte[4096]; while (r.next()) { Java.io.InputStream fin = r.getAsciiStream(1); for (;;) { int size = fin.read(buff); if (size == -1) { // 到達流末尾 break; } // 將新填充的緩衝區發送到 ASCII 輸出資料流: output.write(buff, 0, size); } }
java.io.File file = new java.io.File("/tmp/data"); int fileLength = file.length(); java.io.InputStream fin = new java.io.FileInputStream(file); java.sql.PreparedStatement pstmt = con.prepareStatement( "UPDATE Table5 SET stuff = ? WHERE index = 4"); pstmt.setBinaryStream (1, fin, fileLength); pstmt.executeUpdate();
資料庫針對長欄位提供了三種流機制:
getBinaryStream
getAsciiStream
getUnicodeStream
其中for(;;)是無限迴圈的意思..
mysql JDBC總結