JDBC原理 JDBC基礎編程


1 下列關於JDBC,說法正確的是

A. JDBC只提供了對Java程序員的API。

B. JDBC只提供了對數據庫廠商的API。

C. JDBC只提供了第三方中間件廠商的API。

D. JDBC提供了對Java程序員,數據庫廠商及第三方中間件廠商的API。

參考答案

本題正確答案為D。

JDBC提供了對Java程序員,數據庫廠商及第三方中間件廠商的API。

2 簡述JDBC的原理

參考答案

JDBC( Java DataBase Connectivity,java數據庫連接 )是一種用於執行SQL語句的Java API , 可以為多種關系數據庫提供統一訪問 , 它由一組用Java語言編寫的類和接口組成。

JDBC 通過標准(一系列接口)定義了訪問數據庫的通用API,不同的數據庫廠商根據各自數據庫的特點提供了對JDBC的實現(實現類)。

3 JDBC實現對Dept數據表的簡單查詢(Oracle)

Oracle數據庫中部門dept表的表結構如表-1所示:

表-1部門表dept 信息

部門表 dept中的示例數據,如圖-1所示:

圖-1

本案例要求使用JDBC連接Oracle數據庫,查詢dept表的所有部門的ID、部門名稱以及部門所在地。

參考答案

實現此案例需要按照如下步驟進行。

步驟一:導入連接Oracle數據庫所需的jar包

創建工程,在當前工程下導入連接Oracle數據庫對應的驅動程序jar包。

步驟二:新建類DeptDAO及方法findAll

代碼如下所示:

 
  1. publicclass DeptDAO {
  2.     publicstaticvoid main(String[] args) {
  3.         
  4.     }
  5.     publicvoid findAll() {
  6.         
  7.     }
  8. }

步驟三:構建連接數據庫所需的對象以及相應的異常處理

在findAll方法中,構建連接庫數據所需的對象以及相應的異常處理,代碼如下所示:

 
  1. import java.sql.Connection;
  2. import java.sql.DriverManager;
  3. import java.sql.ResultSet;
  4. import java.sql.SQLException;
  5. import java.sql.Statement;
  6. publicclass DeptDAO {
  7.     publicstaticvoid main(String[] args) {
  8.     }
  9.     publicvoid findAll() {
  10.         Connection con = null;
  11.         Statement stmt = null;
  12.         ResultSet rs = null;
  13.         try {
  14.             
  15.         } catch (ClassNotFoundException e) {
  16.             System.out.println("驅動類無法找到!");
  17.             thrownew RuntimeException(e);
  18.         } catch (SQLException e) {
  19.             System.out.println("數據庫訪問異常!");
  20.             thrownew RuntimeException(e);
  21.         }
  22.     }
  23. }

步驟四:裝載驅動程序

代碼如下所示:

 
  1. import java.sql.Connection;
  2. import java.sql.DriverManager;
  3. import java.sql.ResultSet;
  4. import java.sql.SQLException;
  5. import java.sql.Statement;
  6. publicclass DeptDAO {
  7.     publicstaticvoid main(String[] args) {
  8.     }
  9.     publicvoid findAll() {
  10.         Connection con = null;
  11.         Statement stmt = null;
  12.         ResultSet rs = null;
  13.         try {
  14.             Class.forName("oracle.jdbc.OracleDriver");
  15.             
  16.         } catch (ClassNotFoundException e) {
  17.             System.out.println("驅動類無法找到!");
  18.             thrownew RuntimeException(e);
  19.         } catch (SQLException e) {
  20.             System.out.println("數據庫訪問異常!");
  21.             thrownew RuntimeException(e);
  22.         }
  23.     }
  24. }

步驟五:建立連接

通過調用DriverManager的getConnection方法,獲取Connection類的對象,建立連接。代碼如下所示:

 
  1. import java.sql.Connection;
  2. import java.sql.DriverManager;
  3. import java.sql.ResultSet;
  4. import java.sql.SQLException;
  5. import java.sql.Statement;
  6. publicclass DeptDAO {
  7.     publicstaticvoid main(String[] args) {
  8.     }
  9.     publicvoid findAll() {
  10.         Connection con = null;
  11.         Statement stmt = null;
  12.         ResultSet rs = null;
  13.         try {
  14.             Class.forName("oracle.jdbc.OracleDriver");
  15.             con = DriverManager.getConnection(
  16.                     "jdbc:oracle:thin:@localhost:1521:ORCL", "scott", "tiger");
  17.             
  18.         } catch (ClassNotFoundException e) {
  19.             System.out.println("驅動類無法找到!");
  20.             thrownew RuntimeException(e);
  21.         } catch (SQLException e) {
  22.             System.out.println("數據庫訪問異常!");
  23.             thrownew RuntimeException(e);
  24.         }
  25.     }
  26. }

步驟六:發送和執行SQL語句

首先,通過Connection的createStatement()方法獲取數據庫操作對象Statement。通過調用Statement對象的executeQuery方法來執行SQL語句。代碼如下所示:

 
  1. import java.sql.Connection;
  2. import java.sql.DriverManager;
  3. import java.sql.ResultSet;
  4. import java.sql.SQLException;
  5. import java.sql.Statement;
  6. publicclass DeptDAO {
  7.     publicstaticvoid main(String[] args) {
  8.     }
  9.     publicvoid findAll() {
  10.         Connection con = null;
  11.         Statement stmt = null;
  12.         ResultSet rs = null;
  13.         try {
  14.             Class.forName("oracle.jdbc.OracleDriver");
  15.             con = DriverManager.getConnection(
  16.                     "jdbc:oracle:thin:@localhost:1521:ORCL", "scott", "tiger");
  17.             stmt = con.createStatement();
  18.             rs = stmt
  19.                     .executeQuery("select deptno,dname,loc from dept");
  20.         } catch (ClassNotFoundException e) {
  21.             System.out.println("驅動類無法找到!");
  22.             thrownew RuntimeException(e);
  23.         } catch (SQLException e) {
  24.             System.out.println("數據庫訪問異常!");
  25.             thrownew RuntimeException(e);
  26.         }
  27.     }
  28. }

步驟七:處理查詢結果

Statement的executeQuery方法的返回值為ResultSet對象。ResultSet表示數據庫查詢操作的結果集。它具有指向其當前數據行的光標。最初,光標被置於第一行之前,調用其next 方法將光標移動到下一行,該方法在 ResultSet 對象沒有下一行時返回 false,因此可以在 while 循環中使用它來迭代結果集。代碼如下所示:

 
  1. import java.sql.Connection;
  2. import java.sql.DriverManager;
  3. import java.sql.ResultSet;
  4. import java.sql.SQLException;
  5. import java.sql.Statement;
  6. publicclass DeptDAO {
  7.     publicstaticvoid main(String[] args) {
  8.     }
  9.     publicvoid findAll() {
  10.         Connection con = null;
  11.         Statement stmt = null;
  12.         ResultSet rs = null;
  13.         try {
  14.             Class.forName("oracle.jdbc.OracleDriver");
  15.             con = DriverManager.getConnection(
  16.                     "jdbc:oracle:thin:@localhost:1521:ORCL", "scott", "tiger");
  17.             stmt = con.createStatement();
  18.             rs = stmt
  19.                     .executeQuery("select deptno,dname,loc from dept");
  20.             while (rs.next()) {
  21.                 System.out.println(rs.getInt("deptno") + ","
  22.                         + rs.getString("dname") + ","
  23.                         + rs.getString("loc"));
  24.             }
  25.         } catch (ClassNotFoundException e) {
  26.             System.out.println("驅動類無法找到!");
  27.             thrownew RuntimeException(e);
  28.         } catch (SQLException e) {
  29.             System.out.println("數據庫訪問異常!");
  30.             thrownew RuntimeException(e);
  31.         }
  32.     }
  33. }

從上述代碼中看出ResultSet提供了getXXX(String column)方法,例如:getInt(String column)等,獲取當前ResultSet對象的當前行中指定列名的值,其中參數column表示數據庫表中的列名字。

步驟八:釋放資源

在finally塊中,依次關閉ResultSet對象、Statement對象以及Connection對象。代碼如下:

 
  1. import java.sql.Connection;
  2. import java.sql.DriverManager;
  3. import java.sql.ResultSet;
  4. import java.sql.SQLException;
  5. import java.sql.Statement;
  6. publicclass DeptDAO {
  7.     publicstaticvoid main(String[] args) {
  8.     }
  9.     publicvoid findAll() {
  10.         Connection con = null;
  11.         Statement stmt = null;
  12.         ResultSet rs = null;
  13.         try {
  14.             Class.forName("oracle.jdbc.OracleDriver");
  15.             con = DriverManager.getConnection(
  16.                     "jdbc:oracle:thin:@localhost:1521:ORCL", "scott", "tiger");
  17.             stmt = con.createStatement();
  18.             rs = stmt
  19.                     .executeQuery("select deptno,dname,loc from dept");
  20.             while (rs.next()) {
  21.                 System.out.println(rs.getInt("deptno") + ","
  22.                         + rs.getString("dname") + ","
  23.                         + rs.getString("loc"));
  24.             }
  25.         } catch (ClassNotFoundException e) {
  26.             System.out.println("驅動類無法找到!");
  27.             thrownew RuntimeException(e);
  28.         } catch (SQLException e) {
  29.             System.out.println("數據庫訪問異常!");
  30.             thrownew RuntimeException(e);
  31.         } finally {
  32.             try {
  33.                 if (rs != null) {
  34.                     rs.close();
  35.                 }
  36.                 if (stmt != null) {
  37.                     stmt.close();
  38.                 }
  39.                 if (con != null) {
  40.                     con.close();
  41.                 }
  42.             } catch (SQLException e) {
  43.                 System.out.println("關閉連接時發生異常");
  44.             }
  45.         }
  46.     }
  47. }

步驟九:測試

在main方法中,調用findAll方法,代碼如下所示:

 
  1. import java.sql.Connection;
  2. import java.sql.DriverManager;
  3. import java.sql.ResultSet;
  4. import java.sql.SQLException;
  5. import java.sql.Statement;
  6. publicclass DeptDAO {
  7.     publicstaticvoid main(String[] args) {
  8.         DeptDAO dao = new DeptDAO();
  9.         dao.findAll();
  10.     }
  11.     publicvoid findAll() {
  12.         Connection con = null;
  13.         Statement stmt = null;
  14.         ResultSet rs = null;
  15.         try {
  16.             Class.forName("oracle.jdbc.OracleDriver");
  17.             con = DriverManager.getConnection(
  18.                     "jdbc:oracle:thin:@localhost:1521:ORCL", "scott", "tiger");
  19.             stmt = con.createStatement();
  20.             rs = stmt
  21.                     .executeQuery("select deptno,dname,loc from dept");
  22.             while (rs.next()) {
  23.                 System.out.println(rs.getInt("deptno") + ","
  24.                         + rs.getString("dname") + ","
  25.                         + rs.getString("loc"));
  26.             }
  27.         } catch (ClassNotFoundException e) {
  28.             System.out.println("驅動類無法找到!");
  29.             thrownew RuntimeException(e);
  30.         } catch (SQLException e) {
  31.             System.out.println("數據庫訪問異常!");
  32.             thrownew RuntimeException(e);
  33.         } finally {
  34.             try {
  35.                 if (rs != null) {
  36.                     rs.close();
  37.                 }
  38.                 if (stmt != null) {
  39.                     stmt.close();
  40.                 }
  41.                 if (con != null) {
  42.                     con.close();
  43.                 }
  44.             } catch (SQLException e) {
  45.                 System.out.println("關閉連接時發生異常");
  46.             }
  47.         }
  48.     }
  49. }

運行DeptDAO類,控制台輸出結果如下所示:

 
  1. 10,ACCOUNTING,NEW YORK
  2. 20,RESEARCH,DALLAS
  3. 30,SALES,CHICAGO
  4. 40,OPERATIONS,BOSTON

從輸出結果可以看出,已經查詢到dept表中的所有部門的ID、名稱、所在地。

本案例的完整代碼如下所示:

 
  1. import java.sql.Connection;
  2. import java.sql.DriverManager;
  3. import java.sql.ResultSet;
  4. import java.sql.SQLException;
  5. import java.sql.Statement;
  6. publicclass DeptDAO {
  7.     publicstaticvoid main(String[] args) {
  8.         DeptDAO dao = new DeptDAO();
  9.         dao.findAll();
  10.     }
  11.     publicvoid findAll() {
  12.         Connection con = null;
  13.         Statement stmt = null;
  14.         ResultSet rs = null;
  15.         try {
  16.             Class.forName("oracle.jdbc.OracleDriver");
  17.             con = DriverManager.getConnection(
  18.                     "jdbc:oracle:thin:@localhost:1521:ORCL", "scott", "tiger");
  19.             stmt = con.createStatement();
  20.             rs = stmt
  21.                     .executeQuery("select deptno,dname,loc from dept");
  22.             while (rs.next()) {
  23.                 System.out.println(rs.getInt("deptno") + ","
  24.                         + rs.getString("dname") + ","
  25.                         + rs.getString("loc"));
  26.             }
  27.         } catch (ClassNotFoundException e) {
  28.             System.out.println("驅動類無法找到!");
  29.             thrownew RuntimeException(e);
  30.         } catch (SQLException e) {
  31.             System.out.println("數據庫訪問異常!");
  32.             thrownew RuntimeException(e);
  33.         } finally {
  34.             try {
  35.                 if (rs != null) {
  36.                     rs.close();
  37.                 }
  38.                 if (stmt != null) {
  39.                     stmt.close();
  40.                 }
  41.                 if (con != null) {
  42.                     con.close();
  43.                 }
  44.             } catch (SQLException e) {
  45.                 System.out.println("關閉連接時發生異常");
  46.             }
  47.         }
  48.     }
  49. }

4 下列JDBCURL書寫正確的是

A.JDBC連接Oracle數據庫的URL為jdbc:oracle:thin:@<主機名>:<端口號(默認1521)>:<實例名>

B.JDBC連接Oracle數據庫的URL為oracle:jdbc:thin:@<主機名>:<端口號(默認1521)>:<實例名>

C.JDBC連接MySql數據庫的URL為mysql:jdbc://<主機名>:<端口號(默認3306)>/<數據庫名>

D.JDBC連接MySql數據庫的URL為jdbc:mysql://<主機名>:<端口號(默認3306)>/<數據庫名>

參考答案

本題正確答案為AD。

JDBC連接數據庫時,連接字符串URL包含了數據庫的連接信息,不同的數據庫廠商在實現JDBC時提供了不同的URL格式。其中,連接Oracle數據庫的URL格式為:

 
  1. jdbc:oracle:thin:@<主機名>:<端口號(默認1521)>:<實例名>

連接MySQL數據庫的URL格式為:

  1. jdbc:mysql://<主機名>:<端口號(默認3306)>/<數據庫名>

5 JDBC實現對Dept數據表的簡單查詢(MySQL)

Oracle數據庫中部門dept表的表結構如表-2所示:

表-2部門表dept 信息

部門表 dept中的示例數據,如圖-2所示:

圖-2

本案例要求使用JDBC連接MySQL數據庫,查詢dept表的所有部門的ID、部門名稱以及部門所在地。

參考答案

實現此案例需要按照如下步驟進行。

步驟一:在MySql數據庫中,創建dept表並插入測試數據

SQL語句如下所示:

 
  1. CREATE TABLE dept (
  2. deptno int(2) ,
  3. dname varchar(14) ,
  4. loc varchar(13)
  5. ) ;
  6. INSERT INTO dept VALUES (10,'ACCOUNTING','NEW YORK');
  7. INSERT INTO dept VALUES (20,'RESEARCH','DALLAS');
  8. INSERT INTO dept VALUES (30,'SALES','CHICAGO');
  9. INSERT INTO dept VALUES (40,'OPERATIONS','BOSTON');

步驟二:導入連接MySql數據庫所需的jar包

在當前工程下導入連接MySql數據庫對應的驅動程序jar包。

步驟三:重構DeptDAO類

重構DeptDAO類,在該類中使用MySql數據庫的驅動程序和連接MySql數據庫的連接字符串格式,代碼如下所示:

 
  1. import java.sql.Connection;
  2. import java.sql.DriverManager;
  3. import java.sql.ResultSet;
  4. import java.sql.SQLException;
  5. import java.sql.Statement;
  6. publicclass DeptDAO {
  7.     publicstaticvoid main(String[] args) {
  8.         DeptDAO dao = new DeptDAO();
  9.         dao.findAll();
  10.     }
  11.     publicvoid findAll() {
  12.         Connection con = null;
  13.         Statement stmt = null;
  14.         ResultSet rs = null;
  15.         try {
  16.             Class.forName("com.mysql.jdbc.Driver");
  17.             con = DriverManager.getConnection(
  18.                     "jdbc:mysql://localhost:3306/tts7", "root", "root");
  19.             stmt = con.createStatement();
  20.             rs = stmt.executeQuery("select deptno,dname,loc from dept");
  21.             while (rs.next()) {
  22.                 System.out.println(rs.getInt("deptno") + ","
  23.                         + rs.getString("dname") + "," + rs.getString("loc"));
  24.             }
  25.         } catch (ClassNotFoundException e) {
  26.             System.out.println("驅動類無法找到!");
  27.             thrownew RuntimeException(e);
  28.         } catch (SQLException e) {
  29.             System.out.println("數據庫訪問異常!");
  30.             thrownew RuntimeException(e);
  31.         } finally {
  32.             try {
  33.                 if (rs != null) {
  34.                     rs.close();
  35.                 }
  36.                 if (stmt != null) {
  37.                     stmt.close();
  38.                 }
  39.                 if (con != null) {
  40.                     con.close();
  41.                 }
  42.             } catch (SQLException e) {
  43.                 System.out.println("關閉連接時發生異常");
  44.             }
  45.         }
  46.     }
  47. }

運行DeptDAO類,控制台輸出結果如下所示:

 
  1. 10,ACCOUNTING,NEW YORK
  2. 20,RESEARCH,DALLAS
  3. 30,SALES,CHICAGO
  4. 40,OPERATIONS,BOSTON

從輸出結果可以看出,已經查詢到dept表中的所有部門的ID、名稱、所在地。

本案例中,類DeptDAO的完整代碼如下所示:

 
  1. import java.sql.Connection;
  2. import java.sql.DriverManager;
  3. import java.sql.ResultSet;
  4. import java.sql.SQLException;
  5. import java.sql.Statement;
  6. publicclass DeptDAO {
  7.     publicstaticvoid main(String[] args) {
  8.         DeptDAO dao = new DeptDAO();
  9.         dao.findAll();
  10.     }
  11.     publicvoid findAll() {
  12.         Connection con = null;
  13.         Statement stmt = null;
  14.         ResultSet rs = null;
  15.         try {
  16.             Class.forName("com.mysql.jdbc.Driver");
  17.             con = DriverManager.getConnection(
  18.                     "jdbc:mysql://localhost:3306/tts7", "root", "root");
  19.             stmt = con.createStatement();
  20.             rs = stmt.executeQuery("select deptno,dname,loc from dept");
  21.             while (rs.next()) {
  22.                 System.out.println(rs.getInt("deptno") + ","
  23.                         + rs.getString("dname") + "," + rs.getString("loc"));
  24.             }
  25.         } catch (ClassNotFoundException e) {
  26.             System.out.println("驅動類無法找到!");
  27.             thrownew RuntimeException(e);
  28.         } catch (SQLException e) {
  29.             System.out.println("數據庫訪問異常!");
  30.             thrownew RuntimeException(e);
  31.         } finally {
  32.             try {
  33.                 if (rs != null) {
  34.                     rs.close();
  35.                 }
  36.                 if (stmt != null) {
  37.                     stmt.close();
  38.                 }
  39.                 if (con != null) {
  40.                     con.close();
  41.                 }
  42.             } catch (SQLException e) {
  43.                 System.out.println("關閉連接時發生異常");
  44.             }
  45.         }
  46.     }
  47. }

6 根據下列SQLException信息判斷可能出現的錯誤

請看下列異常:

1.java.sql.SQLException:列名無效

2.java.sql.SQLException:ORA-00911:無效字符

3.java.sql.SQLException:無法轉換為內部表示

發生上述異常的原因是什么?

參考答案

發生上述各異常的原因為:

1.查找的表中不存在要查找的列。

2. sql語句的語法書寫有錯誤。

3.取結果集數據時,get***方法使用不當。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM