JDBC

「英文時間」:JDBC Java Database Connectivity n. Java 數據庫連接

關于數據庫的重要性什么都不說了,如果 Java 語言連數據庫都不支持,恐怕沒有人會用它了。JDBC 是 Java 提供的一套關于數據庫操作的接口規(guī)范,并沒有提供具體的實現類,具體的實現類庫是由各個數據庫軟件廠商提供的。所以 Java 程序員通過 JDBC 這套 API 就可以直接寫出跨平臺和跨數據庫的應用程序,給人感覺很舒服,JDBC 的設計可以說是典型的面向接口編程的案例。

_JDBC.png

JDBC 常用接口和類

JDBC 中常用的就是這幾個接口和類,下面分別介紹:

  1. 每一個數據庫廠商提供的驅動必須實現java.sql.Driver接口,實現這個接口的類就作為驅動程序的入口。比如 Mysql 中就使用了com.mysql.jdbc.Driver類實現了該接口,所以 JDBC 編程的第一步,就是使用反射技術將此類的字節(jié)碼文件加載到內存中去,實現方式如下:Class.forName("com.mysql.jdbc.Driver")。此類的內部有一個靜態(tài)代碼塊,功能是將此類的對象放到java.sql.DriverManager類中去,如下所示:
static {
        try {
            java.sql.DriverManager.registerDriver(new Driver());
        } catch (SQLException E) {
            throw new RuntimeException("Can't register driver!");
        }
    }

看到這里就明白了,JDBC 編程第一步為什么要先加載這個類的字節(jié)碼文件到內存中去了,因為要執(zhí)行它的靜態(tài)代碼塊的內容,以將此 Driver 類添加到 DriverManager 類中進行管理啊。

  1. java.sql.DriverManager類是專門設計來進行管理驅動的,一般都是用它的getConnection(String url,String user,String pass)方法來得到和數據庫的 Connection 對象。

  2. java.sql.Connection接口代表 Java 程序和數據庫的一個連接對象,它有三個方法得到代表 SQL 語句的聲明對象。

  • 通過createStatement()方法得到 Statement 聲明對象
  • 通過prepareStatement(String sql)方法得到 PreparedStatement 聲明對象
  • 通過它的prepareCall(String sql)方法得到 CallableStatement 聲明對象,通過此對象來調用數據庫中的存儲過程。以前學習 Oracle 的時候,還不理解存儲過程是怎么被程序使用的,原來這么簡單。
  1. java.sql.Statement接口代表一個 SQL 語句,為什么用起名字叫做 Statement 呢?SQL 是一種聲明式的編程語言,而 Statement 英文含義就是名詞,聲明的意思,可見它命名的用意。通常使用如下兩種方式來實現執(zhí)行 SQL 語句的功能:
  • 使用excuteUpdate(String sql)方法執(zhí)行增加、刪除和修改操作
  • 使用excuteQuery(String sql)方法執(zhí)行查詢操作,返回值為 ResultSet 集合。
  1. java.sql.PreparedStatement接口,也是代表一個 SQL 語句,和 Statement 的不同點是,它會對 SQL 語句進行預編譯,所以它更加高效而且能夠阻止 SQL 注入的風險,預編譯的 SQL 語句可以使用占位符?提前進行站位,然后 PreparedStatement 對象通過setXXX(int i,String s)方法進行賦值。通常使用如下兩種方式來實現執(zhí)行 SQL 語句的功能:
  • 使用excuteUpdate()方法執(zhí)行增加、刪除和修改操作
  • 使用excuteQuery()方法執(zhí)行查詢操作,返回值為 ResultSet 集合。
  1. java.sql.ResultSet接口作為查詢結果的集合,可以直接把它的數據結構想象成是和數據庫中表結構一樣的就可以了,它的第一個游標指向

所以,有沒有發(fā)現上面講到除了 DriverManager 是類,其他都是接口,所以完全可以在它的基礎上進行封裝,提供自己的一套實現類庫,這在自己動手實現數據庫連接池和自定義 DBUtils 類的過程中可以得到完整體現。

JDBC 編程簡單示例

要實現 JDBC 編程首先需要將對應的數據庫驅動 jar 包放到項目的 lib 目錄下,然后開啟數據庫服務,等待 Java 程序去連接它。

/*通過之前的源碼分析,可知此行代碼將 Driver 類字節(jié)碼文件添加到了內存中,并執(zhí)行了它內部的靜態(tài)代碼塊,以此將 Driver 驅動對象添加到了 DriverManager 類中去*/
Class.forName("com.mysql.jdbc.Driver");
//獲得代表SQL語句的聲明對象
Statement stmt = DriverManager.createStatement();
//ResultSet rs = stmt.excuteQuery("select * from student");
//遍歷集合
  while(rs.next()){
      //輸出...
  }

對于 JDBC 編程其實就這么簡單,理解上面的幾個類和接口,實際編程中查查 API ,就不存在什么問題了。

進一步理解數據庫連接 Connection

Java 程序中和 DBMS 建立 Connection 連接的過程,本質上就是在和 DBMS 建立網絡連接,Java 程序將 SQL 語句發(fā)送給 DBMS 進行處理后,DBMS 再返回結果通過網絡發(fā)送到 Java 程序進行接收。只是為了簡化這個過程,就構建出了一個數據庫連接的概念,來抽象代表這個繁瑣的網絡通信細節(jié)。抽象有時候是好事,變得更簡單,卻也阻擋了實際細節(jié),有時候讓人摸不著頭腦。

它底層就是采用 Java 的 Socket 網絡編程技術實現的,也就是 TCP 網絡連接三次握手。由于 JDBC 定義的是接口規(guī)范,不提供具體的實現,也就是說底層復雜的網絡通信和 IO 操作都是交由對應的數據庫驅動去實現的,這就是為什么一定需要導入對應 DBMS 的驅動 jar 包的原因。JDBC 接口和驅動程序建立關聯(lián)就是靠的那個實現了 java.sql.Driver 接口的類,也就是必須利用反射計數主動將其加載到內存中的那個類,依靠它才把底層驅動程序和 JDBC 接口建立起了關聯(lián)。

所以說這個過程很消耗資源,如果用一次就關閉,再用就再去建立連接,那真的不僅消耗資源還浪費時間。正確的做法應該是建立一個連接池,實現數據庫連接的復用。點此查看數據庫連接池筆記

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容