JDBC原理 JDBC基礎編程

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

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

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

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

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

參考答案sql

本題正確答案爲D。數據庫

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

2 簡述JDBC的原理

參考答案ide

JDBC( Java DataBase Connectivity,java數據庫鏈接 )是一種用於執行SQL語句的Java API , 能夠爲多種關係數據庫提供統一訪問 , 它由一組用Java語言編寫的類和接口組成。測試

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

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***方法使用不當。

相關文章
相關標籤/搜索