今天復習了下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(;;)是無限循環的意思..
?關于為什么preparedStatement比statement,同一個sql假如執行N遍,preparedStatement只進行一次編譯,而statement需要編譯N次
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
