<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                https://zh.wikipedia.org/wiki/Java%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5 **Java數據庫連接**,(**Java Database Connectivity**,簡稱**JDBC**)是[Java語言](https://zh.wikipedia.org/wiki/Java%E8%AF%AD%E8%A8%80 "Java語言")中用來規范[客戶端](https://zh.wikipedia.org/wiki/%E5%AE%A2%E6%88%B7%E7%AB%AF "客戶端")程序如何來訪問[數據庫](https://zh.wikipedia.org/wiki/%E6%95%B0%E6%8D%AE%E5%BA%93 "數據庫")的[應用程序接口](https://zh.wikipedia.org/wiki/%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%8E%A5%E5%8F%A3 "應用程序接口"),提供了諸如查詢和更新數據庫中數據的方法。JDBC也是[Sun Microsystems](https://zh.wikipedia.org/wiki/Sun_Microsystems "Sun Microsystems")的[商標](https://zh.wikipedia.org/wiki/%E5%95%86%E6%A0%87 "商標")[\[1\]](https://zh.wikipedia.org/wiki/Java%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5#cite_note-1)。JDBC是面向[關系型數據庫](https://zh.wikipedia.org/wiki/%E5%85%B3%E7%B3%BB%E5%9E%8B%E6%95%B0%E6%8D%AE%E5%BA%93 "關系型數據庫")的。 在[J2SE](https://zh.wikipedia.org/wiki/J2SE "J2SE")中,提供了一個稱之為JDBC-ODBC橋(JDBC-ODBC Bridge[\[2\]](https://zh.wikipedia.org/wiki/Java%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5#cite_note-2))的API。通過[ODBC](https://zh.wikipedia.org/wiki/ODBC "ODBC"),JDBC-ODBC橋[驅動程序](https://zh.wikipedia.org/wiki/%E9%A9%B1%E5%8A%A8%E7%A8%8B%E5%BA%8F "驅動程序")可以訪問所有支持ODBC的關系型數據庫。與JDBC API不同的是,這個驅動程序并不是由Java代碼而是由[機器代碼](https://zh.wikipedia.org/wiki/%E6%9C%BA%E5%99%A8%E8%AF%AD%E8%A8%80 "機器語言")(native code)編寫,并且不是[開放源代碼](https://zh.wikipedia.org/wiki/%E5%BC%80%E6%94%BE%E6%BA%90%E4%BB%A3%E7%A0%81 "開放源代碼")的[\[3\]](https://zh.wikipedia.org/wiki/Java%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5#cite_note-3)。 ## 目錄 * [1驅動程序類型](https://zh.wikipedia.org/wiki/Java%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5#%E9%A9%B1%E5%8A%A8%E7%A8%8B%E5%BA%8F%E7%B1%BB%E5%9E%8B) * [1.1類型1:JDBC-ODBC橋](https://zh.wikipedia.org/wiki/Java%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5#%E7%B1%BB%E5%9E%8B1%EF%BC%9AJDBC-ODBC%E6%A1%A5) * [1.2類型2:本地API驅動](https://zh.wikipedia.org/wiki/Java%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5#%E7%B1%BB%E5%9E%8B2%EF%BC%9A%E6%9C%AC%E5%9C%B0API%E9%A9%B1%E5%8A%A8) * [1.3類型3:網絡協議驅動](https://zh.wikipedia.org/wiki/Java%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5#%E7%B1%BB%E5%9E%8B3%EF%BC%9A%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE%E9%A9%B1%E5%8A%A8) * [1.4類型4:本地協議驅動](https://zh.wikipedia.org/wiki/Java%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5#%E7%B1%BB%E5%9E%8B4%EF%BC%9A%E6%9C%AC%E5%9C%B0%E5%8D%8F%E8%AE%AE%E9%A9%B1%E5%8A%A8) * [2API概述](https://zh.wikipedia.org/wiki/Java%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5#API%E6%A6%82%E8%BF%B0) * [2.1數據類型的映射](https://zh.wikipedia.org/wiki/Java%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5#%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E7%9A%84%E6%98%A0%E5%B0%84) * [3例子](https://zh.wikipedia.org/wiki/Java%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5#%E4%BE%8B%E5%AD%90) * [4參考文獻](https://zh.wikipedia.org/wiki/Java%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5#%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE) * [5外部鏈接](https://zh.wikipedia.org/wiki/Java%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5#%E5%A4%96%E9%83%A8%E9%93%BE%E6%8E%A5) * [6參見](https://zh.wikipedia.org/wiki/Java%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5#%E5%8F%82%E8%A7%81) ## 驅動程序類型\[[編輯](https://zh.wikipedia.org/w/index.php?title=Java%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5&action=edit&section=1 "編輯章節:驅動程序類型")\] JDBC驅動程序共分四種類型: ### 類型1:JDBC-ODBC橋\[[編輯](https://zh.wikipedia.org/w/index.php?title=Java%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5&action=edit&section=2 "編輯章節:類型1:JDBC-ODBC橋")\] 這種類型的驅動把所有JDBC的調用傳遞給ODBC,再讓后者調用數據庫本地驅動代碼(也就是數據庫廠商提供的數據庫操作二進制代碼庫,例如[Oracle](https://zh.wikipedia.org/wiki/Oracle "Oracle")中的oci.dll)。 優點: * 只要有對應的ODBC驅動(大部分數據庫廠商都會提供),幾乎可以訪問所有的數據庫。 缺點: * 執行效率比較低,不適合大數據量訪問的應用; * 由于需要客戶端預裝對應的ODBC驅動,不適合Internet/Intranet應用。 ### 類型2:本地API驅動\[[編輯](https://zh.wikipedia.org/w/index.php?title=Java%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5&action=edit&section=3 "編輯章節:類型2:本地API驅動")\] 這種類型的驅動通過客戶端加載數據庫廠商提供的本地代碼庫([C](https://zh.wikipedia.org/wiki/C%E8%AF%AD%E8%A8%80 "C語言")/[C++](https://zh.wikipedia.org/wiki/C%2B%2B "C++")等)來訪問數據庫,而在驅動程序中則包含了Java代碼。 優點: * 速度快于第一類驅動(但仍比不上第3、第4類驅動)。 缺點 * 由于需要客戶端預裝對應的數據庫廠商代碼庫,仍不適合Internet/Intranet應用。 ### 類型3:網絡協議驅動\[[編輯](https://zh.wikipedia.org/w/index.php?title=Java%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5&action=edit&section=4 "編輯章節:類型3:網絡協議驅動")\] 這種類型的驅動給客戶端提供了一個網絡API,客戶端上的JDBC驅動程序使用[套接字](https://zh.wikipedia.org/wiki/%E5%A5%97%E6%8E%A5%E5%AD%97 "套接字")(Socket)來調用服務器上的中間件程序,后者在將其請求轉化為所需的具體API調用。 優點: * 不需要在客戶端加載數據庫廠商提供的代碼庫,單個驅動程序可以對多個數據庫進行訪問,可擴展性較好。 缺點: * 在中間件層仍需對最終數據進行配置; * 由于多出一個中間件層,速度不如第四類驅動程序。 ### 類型4:本地協議驅動\[[編輯](https://zh.wikipedia.org/w/index.php?title=Java%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5&action=edit&section=5 "編輯章節:類型4:本地協議驅動")\] 這種類型的驅動使用Socket,直接在客戶端和數據庫間通信。 優點: * 訪問速度最快; * 這是最直接、最純粹的[Java](https://zh.wikipedia.org/wiki/Java "Java")實現。 缺點: * 幾乎只有數據庫廠商自己才能提供這種類型的JDBC驅動。 * 需要針對不同的數據庫使用不同的驅動程序。 ## API概述\[[編輯](https://zh.wikipedia.org/w/index.php?title=Java%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5&action=edit&section=6 "編輯章節:API概述")\] *參看[JavaSE](https://zh.wikipedia.org/w/index.php?title=JavaSE&action=edit&redlink=1 "JavaSE(頁面不存在)")以及[java.sql API](https://web.archive.org/web/20050709074831/http://java.sun.com/j2se/1.4.2/docs/api/java/sql/package-summary.html)* JDBC API主要位于JDK中的java.sql包中(之后擴展的內容位于javax.sql包中),主要包括(斜體代表接口,需驅動程序提供者來具體實現): * DriverManager:負責加載各種不同驅動程序(Driver),并根據不同的請求,向調用者返回相應的數據庫連接(Connection)。 * *Driver*:驅動程序,會將自身加載到DriverManager中去,并處理相應的請求并返回相應的數據庫連接(Connection)。 * *Connection*:數據庫連接,負責進行與數據庫間的通訊,[SQL](https://zh.wikipedia.org/wiki/SQL "SQL")執行以及事務處理都是在某個特定Connection環境中進行的。可以產生用以執行SQL的Statement。 * *Statement*:用以執行SQL查詢和更新(針對靜態SQL語句和單次執行)。 * *PreparedStatement*:用以執行包含動態參數的SQL查詢和更新(在服務器端編譯,允許重復執行以提高效率)。 * *CallableStatement*:用以調用數據庫中的[存儲過程](https://zh.wikipedia.org/wiki/%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B "存儲過程")。 * SQLException:代表在數據庫連接的創建和關閉和SQL語句的執行過程中發生了例外情況(即錯誤)。 ### 數據類型的映射\[[編輯](https://zh.wikipedia.org/w/index.php?title=Java%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5&action=edit&section=7 "編輯章節:數據類型的映射")\] 從SQL到Java數據類型映射的JDBC規范SQL類型Java類型CHARjava.lang.StringVARCHARjava.lang.StringLONGVARCHARjava.lang.StringNUMERICjava.math.BigDecimalDECIMALjava.math.BigDecimalBITbooleanTINYINTbyteSMALLINTshortINTEGERintBIGINTlongREALfloatFLOATdoubleDOUBLEdoubleBINARYbyte[]VARBINARYbyte[]LONGVARBINARYbyte[]DATEjava.sql.DateTIMEjava.sql.TimeTIMESTAMPjava.sql.TimestampBLOBjava.sql.BlobCLOBjava.sql.ClobArrayjava.sql.ArrayREFjava.sql.RefStructjava.sql.Struct 注:這種類型匹配不是強制性標準,特定的JDBC廠商可能會改變這種類型匹配。例如Oracle中的DATE類型是包含時分秒,而java.sql.Date僅僅支持年月日。 ## 例子\[[編輯](https://zh.wikipedia.org/w/index.php?title=Java%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5&action=edit&section=8 "編輯章節:例子")\] 利用Class.forName()方法來加載JDBC驅動程序(*Driver*)至DriverManager: ~~~ Class.forName( "com.somejdbcvendor.TheirJdbcDriver" ); ~~~ 然后,從DriverManager中,通過JDBC[URL](https://zh.wikipedia.org/wiki/URL "URL"),用戶名,密碼來獲取相應的數據庫連接(*Connection*): ~~~ Connection conn = DriverManager.getConnection( "jdbc:somejdbcvendor:other data needed by some jdbc vendor", // URL "myLogin", // 用戶名 "myPassword" ); // 密碼 ~~~ 不同的JDBC驅動程序的URL是不同的,它永遠以“jdbc:”開始,但后面的內容依照驅動程序類型不同而各異。在獲取*Connection*之后,便可以創建*Statement*用以執行SQL語句。下面是一個插入(INSERT)的例子: ~~~ Statement stmt = conn.createStatement(); stmt.executeUpdate( "INSERT INTO MyTable( name ) VALUES ( 'my name' ) " ); ~~~ 查詢(SELECT)的結果存放于結果集(*ResultSet*)中,可以按照順序依次訪問: ~~~ Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery( "SELECT * FROM MyTable" ); while ( rs.next() ) { int numColumns = rs.getMetaData().getColumnCount(); for ( int i = 1 ; i <= numColumns ; i++ ) { // 與大部分Java API中下標的使用方法不同,字段的下標從1開始 // 當然,還有其他很多的方式(ResultSet.getXXX())獲取數據 System.out.println( "COLUMN " + i + " = " + rs.getObject(i) ); } } rs.close(); stmt.close(); ~~~ 但是,通常,Java[程序員](https://zh.wikipedia.org/wiki/%E7%A8%8B%E5%BA%8F%E5%91%98 "程序員")們更傾向于使用*PreparedStatement*。下面的例子使用上例中的conn對象: ~~~ PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement( "SELECT i.*, j.* FROM Omega i, Zappa j WHERE i = ? AND j = ?" ); // 使用問號作為參數的標示 // 進行參數設置 // 與大部分Java API中下標的使用方法不同,字段的下標從1開始,1代表第一個問號 // 當然,還有其他很多針對不同類型的類似的PreparedStatement.setXXX()方法 ps.setString(1, "Poor Yorick"); ps.setInt(2, 8008); // 結果集 rs = ps.executeQuery(); while ( rs.next() ) { int numColumns = rs.getMetaData().getColumnCount(); for ( int i = 1 ; i <= numColumns ; i++ ) { // 與大部分Java API中下標的使用方法不同,字段的下標從1開始 // 當然,還有其他很多的方式(ResultSet.getXXX())獲取數據 System.out.println( "COLUMN " + i + " = " + rs.getObject(i) ); } } catch (SQLException e) { // 異常處理 } finally { // 使用finally進行資源釋放 try { rs.close(); ps.close(); } catch( SQLException e){} // 異常處理:忽略close()時的錯誤 } ~~~ 如果數據庫操作失敗,JDBC將拋出一個[SQLException](https://zh.wikipedia.org/w/index.php?title=SQLException&action=edit&redlink=1 "SQLException(頁面不存在)")。一般來說,此類異常很少能夠恢復,唯一能做的就是盡可能詳細的打印異常日記。推薦的做法是將SQLException翻譯成應用程序領域相關的異常(非強制處理異常)并最終回滾數據庫和通知用戶。 一個[數據庫事務](https://zh.wikipedia.org/wiki/%E6%95%B0%E6%8D%AE%E5%BA%93%E4%BA%8B%E5%8A%A1 "數據庫事務")代碼如下: ~~~ boolean autoCommitDefault = conn.getAutoCommit(); try { conn.setAutoCommit(false); /* 在此基于有事務控制的conn執行你的代碼 */ conn.commit(); } catch (Throwable e) { try { conn.rollback(); } catch (Throwable ignore) {} throw e; } finally { try { conn.setAutoCommit(autoCommitDefault); } catch (Throwable ignore) {} } ~~~ ## 參考文獻\[[編輯](https://zh.wikipedia.org/w/index.php?title=Java%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5&action=edit&section=9 "編輯章節:參考文獻")\] 1. [↑](https://zh.wikipedia.org/wiki/Java%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5#cite_ref-1 "跳轉")[\[1\]](http://java.sun.com/j2se/1.5.0/docs/guide/jdbc/getstart/intro.html#1018466) 2. [↑](https://zh.wikipedia.org/wiki/Java%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5#cite_ref-2 "跳轉")[存檔副本](https://web.archive.org/web/20050714002258/http://java.sun.com/j2se/1.3/docs/guide/jdbc/getstart/bridge.doc.html).\[2005-07-11\]. ([原始內容](http://java.sun.com/j2se/1.3/docs/guide/jdbc/getstart/bridge.doc.html)存檔于2005-07-14). 3. [↑](https://zh.wikipedia.org/wiki/Java%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5#cite_ref-3 "跳轉")[\[2\]](http://java.sun.com/products/jdbc/jdbc-3_0-fr-spec-license.html) ## 外部鏈接\[[編輯](https://zh.wikipedia.org/w/index.php?title=Java%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5&action=edit&section=10 "編輯章節:外部鏈接")\] * [Sun提供的JDBC驅動程序及其供應商列表](https://archive.is/20030803212350/http://servlet.java.sun.com/products/jdbc/drivers) * [Sun提供的教程](https://web.archive.org/web/20041209205155/http://java.sun.com/docs/books/tutorial/post1.0/whatsnew/jdbc.html) * [Sun Java 2 1.4.2 API](http://java.sun.com/j2se/1.4.2/docs/api/) * [一個訂單系統的原形](http://java.sun.com/developer/technicalArticles/Database/dukesbakery/) * [DBAccessor: JDBC數據庫訪問封裝類](http://java.sun.com/developer/technicalArticles/Database/dbaccessor/) * [開源的JDBC驅動程序列表](http://java-source.net/open-source/database-engines) * [http://blog.csdn.net/cho3en1/article/details/52695808](http://blog.csdn.net/cho3en1/article/details/52695808) ## 參見\[[編輯](https://zh.wikipedia.org/w/index.php?title=Java%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5&action=edit&section=11 "編輯章節:參見")\] * [![icon](https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Crystal_Clear_device_cdrom_unmount.png/28px-Crystal_Clear_device_cdrom_unmount.png)](https://zh.wikipedia.org/wiki/File:Crystal_Clear_device_cdrom_unmount.png)[軟件主題](https://zh.wikipedia.org/wiki/Portal:%E8%BD%AF%E4%BB%B6 "Portal:軟件") * [![icon](https://upload.wikimedia.org/wikipedia/commons/thumb/c/cc/8bit-dynamiclist_%28reversed%29.gif/28px-8bit-dynamiclist_%28reversed%29.gif)](https://zh.wikipedia.org/wiki/File:8bit-dynamiclist_(reversed).gif)[計算機程序設計主題](https://zh.wikipedia.org/wiki/Portal:%E9%9B%BB%E8%85%A6%E7%A8%8B%E5%BC%8F%E8%A8%AD%E8%A8%88 "Portal:計算機程序設計") * [數據庫](https://zh.wikipedia.org/wiki/%E6%95%B0%E6%8D%AE%E5%BA%93 "數據庫") * [Java](https://zh.wikipedia.org/wiki/Java "Java") * [J2SE](https://zh.wikipedia.org/wiki/J2SE "J2SE") * [J2EE](https://zh.wikipedia.org/wiki/J2EE "J2EE") * [ODBC](https://zh.wikipedia.org/wiki/ODBC "ODBC") * [ADO](https://zh.wikipedia.org/wiki/ADO "ADO") * [ADO.NET](https://zh.wikipedia.org/wiki/ADO.NET "ADO.NET")
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看