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
代碼以下所示:
- publicclass DeptDAO {
- publicstaticvoid main(String[] args) {
-
- }
- publicvoid findAll() {
-
- }
- }
步驟三:構建鏈接數據庫所需的對象以及相應的異常處理
在findAll方法中,構建鏈接庫數據所需的對象以及相應的異常處理,代碼以下所示:
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.sql.Statement;
- publicclass DeptDAO {
- publicstaticvoid main(String[] args) {
- }
- publicvoid findAll() {
- Connection con = null;
- Statement stmt = null;
- ResultSet rs = null;
- try {
-
- } catch (ClassNotFoundException e) {
- System.out.println("驅動類沒法找到!");
- thrownew RuntimeException(e);
- } catch (SQLException e) {
- System.out.println("數據庫訪問異常!");
- thrownew RuntimeException(e);
- }
- }
- }
步驟四:裝載驅動程序
代碼以下所示:
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.sql.Statement;
- publicclass DeptDAO {
- publicstaticvoid main(String[] args) {
- }
- publicvoid findAll() {
- Connection con = null;
- Statement stmt = null;
- ResultSet rs = null;
- try {
- Class.forName("oracle.jdbc.OracleDriver");
-
- } catch (ClassNotFoundException e) {
- System.out.println("驅動類沒法找到!");
- thrownew RuntimeException(e);
- } catch (SQLException e) {
- System.out.println("數據庫訪問異常!");
- thrownew RuntimeException(e);
- }
- }
- }
步驟五:創建鏈接
經過調用DriverManager的getConnection方法,獲取Connection類的對象,創建鏈接。代碼以下所示:
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.sql.Statement;
- publicclass DeptDAO {
- publicstaticvoid main(String[] args) {
- }
- publicvoid findAll() {
- Connection con = null;
- Statement stmt = null;
- ResultSet rs = null;
- try {
- Class.forName("oracle.jdbc.OracleDriver");
- con = DriverManager.getConnection(
- "jdbc:oracle:thin:@localhost:1521:ORCL", "scott", "tiger");
-
- } catch (ClassNotFoundException e) {
- System.out.println("驅動類沒法找到!");
- thrownew RuntimeException(e);
- } catch (SQLException e) {
- System.out.println("數據庫訪問異常!");
- thrownew RuntimeException(e);
- }
- }
- }
步驟六:發送和執行SQL語句
首先,經過Connection的createStatement()方法獲取數據庫操做對象Statement。經過調用Statement對象的executeQuery方法來執行SQL語句。代碼以下所示:
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.sql.Statement;
- publicclass DeptDAO {
- publicstaticvoid main(String[] args) {
- }
- publicvoid findAll() {
- Connection con = null;
- Statement stmt = null;
- ResultSet rs = null;
- try {
- Class.forName("oracle.jdbc.OracleDriver");
- con = DriverManager.getConnection(
- "jdbc:oracle:thin:@localhost:1521:ORCL", "scott", "tiger");
- stmt = con.createStatement();
- rs = stmt
- .executeQuery("select deptno,dname,loc from dept");
- } catch (ClassNotFoundException e) {
- System.out.println("驅動類沒法找到!");
- thrownew RuntimeException(e);
- } catch (SQLException e) {
- System.out.println("數據庫訪問異常!");
- thrownew RuntimeException(e);
- }
- }
- }
步驟七:處理查詢結果
Statement的executeQuery方法的返回值爲ResultSet對象。ResultSet表示數據庫查詢操做的結果集。它具備指向其當前數據行的光標。最初,光標被置於第一行以前,調用其next 方法將光標移動到下一行,該方法在 ResultSet 對象沒有下一行時返回 false,所以能夠在 while 循環中使用它來迭代結果集。代碼以下所示:
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.sql.Statement;
- publicclass DeptDAO {
- publicstaticvoid main(String[] args) {
- }
- publicvoid findAll() {
- Connection con = null;
- Statement stmt = null;
- ResultSet rs = null;
- try {
- Class.forName("oracle.jdbc.OracleDriver");
- con = DriverManager.getConnection(
- "jdbc:oracle:thin:@localhost:1521:ORCL", "scott", "tiger");
- stmt = con.createStatement();
- rs = stmt
- .executeQuery("select deptno,dname,loc from dept");
- while (rs.next()) {
- System.out.println(rs.getInt("deptno") + ","
- + rs.getString("dname") + ","
- + rs.getString("loc"));
- }
- } catch (ClassNotFoundException e) {
- System.out.println("驅動類沒法找到!");
- thrownew RuntimeException(e);
- } catch (SQLException e) {
- System.out.println("數據庫訪問異常!");
- thrownew RuntimeException(e);
- }
- }
- }
從上述代碼中看出ResultSet提供了getXXX(String column)方法,例如:getInt(String column)等,獲取當前ResultSet對象的當前行中指定列名的值,其中參數column表示數據庫表中的列名字。
步驟八:釋放資源
在finally塊中,依次關閉ResultSet對象、Statement對象以及Connection對象。代碼以下:
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.sql.Statement;
- publicclass DeptDAO {
- publicstaticvoid main(String[] args) {
- }
- publicvoid findAll() {
- Connection con = null;
- Statement stmt = null;
- ResultSet rs = null;
- try {
- Class.forName("oracle.jdbc.OracleDriver");
- con = DriverManager.getConnection(
- "jdbc:oracle:thin:@localhost:1521:ORCL", "scott", "tiger");
- stmt = con.createStatement();
- rs = stmt
- .executeQuery("select deptno,dname,loc from dept");
- while (rs.next()) {
- System.out.println(rs.getInt("deptno") + ","
- + rs.getString("dname") + ","
- + rs.getString("loc"));
- }
- } catch (ClassNotFoundException e) {
- System.out.println("驅動類沒法找到!");
- thrownew RuntimeException(e);
- } catch (SQLException e) {
- System.out.println("數據庫訪問異常!");
- thrownew RuntimeException(e);
- } finally {
- try {
- if (rs != null) {
- rs.close();
- }
- if (stmt != null) {
- stmt.close();
- }
- if (con != null) {
- con.close();
- }
- } catch (SQLException e) {
- System.out.println("關閉鏈接時發生異常");
- }
- }
- }
- }
步驟九:測試
在main方法中,調用findAll方法,代碼以下所示:
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.sql.Statement;
- publicclass DeptDAO {
- publicstaticvoid main(String[] args) {
- DeptDAO dao = new DeptDAO();
- dao.findAll();
- }
- publicvoid findAll() {
- Connection con = null;
- Statement stmt = null;
- ResultSet rs = null;
- try {
- Class.forName("oracle.jdbc.OracleDriver");
- con = DriverManager.getConnection(
- "jdbc:oracle:thin:@localhost:1521:ORCL", "scott", "tiger");
- stmt = con.createStatement();
- rs = stmt
- .executeQuery("select deptno,dname,loc from dept");
- while (rs.next()) {
- System.out.println(rs.getInt("deptno") + ","
- + rs.getString("dname") + ","
- + rs.getString("loc"));
- }
- } catch (ClassNotFoundException e) {
- System.out.println("驅動類沒法找到!");
- thrownew RuntimeException(e);
- } catch (SQLException e) {
- System.out.println("數據庫訪問異常!");
- thrownew RuntimeException(e);
- } finally {
- try {
- if (rs != null) {
- rs.close();
- }
- if (stmt != null) {
- stmt.close();
- }
- if (con != null) {
- con.close();
- }
- } catch (SQLException e) {
- System.out.println("關閉鏈接時發生異常");
- }
- }
- }
- }
運行DeptDAO類,控制檯輸出結果以下所示:
- 10,ACCOUNTING,NEW YORK
- 20,RESEARCH,DALLAS
- 30,SALES,CHICAGO
- 40,OPERATIONS,BOSTON
從輸出結果能夠看出,已經查詢到dept表中的全部部門的ID、名稱、所在地。
本案例的完整代碼以下所示:
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.sql.Statement;
- publicclass DeptDAO {
- publicstaticvoid main(String[] args) {
- DeptDAO dao = new DeptDAO();
- dao.findAll();
- }
- publicvoid findAll() {
- Connection con = null;
- Statement stmt = null;
- ResultSet rs = null;
- try {
- Class.forName("oracle.jdbc.OracleDriver");
- con = DriverManager.getConnection(
- "jdbc:oracle:thin:@localhost:1521:ORCL", "scott", "tiger");
- stmt = con.createStatement();
- rs = stmt
- .executeQuery("select deptno,dname,loc from dept");
- while (rs.next()) {
- System.out.println(rs.getInt("deptno") + ","
- + rs.getString("dname") + ","
- + rs.getString("loc"));
- }
- } catch (ClassNotFoundException e) {
- System.out.println("驅動類沒法找到!");
- thrownew RuntimeException(e);
- } catch (SQLException e) {
- System.out.println("數據庫訪問異常!");
- thrownew RuntimeException(e);
- } finally {
- try {
- if (rs != null) {
- rs.close();
- }
- if (stmt != null) {
- stmt.close();
- }
- if (con != null) {
- con.close();
- }
- } catch (SQLException e) {
- System.out.println("關閉鏈接時發生異常");
- }
- }
- }
- }
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格式爲:
- jdbc:oracle:thin:@<主機名>:<端口號(默認1521)>:<實例名>
鏈接MySQL數據庫的URL格式爲:
5 JDBC實現對Dept數據表的簡單查詢(MySQL)
Oracle數據庫中部門dept表的表結構如表-2所示:
表-2部門表dept 信息
部門表 dept中的示例數據,如圖-2所示:
圖-2
本案例要求使用JDBC鏈接MySQL數據庫,查詢dept表的全部部門的ID、部門名稱以及部門所在地。
參考答案
實現此案例須要按照以下步驟進行。
步驟一:在MySql數據庫中,建立dept表並插入測試數據
SQL語句以下所示:
- CREATE TABLE dept (
- deptno int(2) ,
- dname varchar(14) ,
- loc varchar(13)
- ) ;
- INSERT INTO dept VALUES (10,'ACCOUNTING','NEW YORK');
- INSERT INTO dept VALUES (20,'RESEARCH','DALLAS');
- INSERT INTO dept VALUES (30,'SALES','CHICAGO');
- INSERT INTO dept VALUES (40,'OPERATIONS','BOSTON');
步驟二:導入鏈接MySql數據庫所需的jar包
在當前工程下導入鏈接MySql數據庫對應的驅動程序jar包。
步驟三:重構DeptDAO類
重構DeptDAO類,在該類中使用MySql數據庫的驅動程序和鏈接MySql數據庫的鏈接字符串格式,代碼以下所示:
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.sql.Statement;
- publicclass DeptDAO {
- publicstaticvoid main(String[] args) {
- DeptDAO dao = new DeptDAO();
- dao.findAll();
- }
- publicvoid findAll() {
- Connection con = null;
- Statement stmt = null;
- ResultSet rs = null;
- try {
- Class.forName("com.mysql.jdbc.Driver");
- con = DriverManager.getConnection(
- "jdbc:mysql://localhost:3306/tts7", "root", "root");
- stmt = con.createStatement();
- rs = stmt.executeQuery("select deptno,dname,loc from dept");
- while (rs.next()) {
- System.out.println(rs.getInt("deptno") + ","
- + rs.getString("dname") + "," + rs.getString("loc"));
- }
- } catch (ClassNotFoundException e) {
- System.out.println("驅動類沒法找到!");
- thrownew RuntimeException(e);
- } catch (SQLException e) {
- System.out.println("數據庫訪問異常!");
- thrownew RuntimeException(e);
- } finally {
- try {
- if (rs != null) {
- rs.close();
- }
- if (stmt != null) {
- stmt.close();
- }
- if (con != null) {
- con.close();
- }
- } catch (SQLException e) {
- System.out.println("關閉鏈接時發生異常");
- }
- }
- }
- }
運行DeptDAO類,控制檯輸出結果以下所示:
- 10,ACCOUNTING,NEW YORK
- 20,RESEARCH,DALLAS
- 30,SALES,CHICAGO
- 40,OPERATIONS,BOSTON
從輸出結果能夠看出,已經查詢到dept表中的全部部門的ID、名稱、所在地。
本案例中,類DeptDAO的完整代碼以下所示:
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.sql.Statement;
- publicclass DeptDAO {
- publicstaticvoid main(String[] args) {
- DeptDAO dao = new DeptDAO();
- dao.findAll();
- }
- publicvoid findAll() {
- Connection con = null;
- Statement stmt = null;
- ResultSet rs = null;
- try {
- Class.forName("com.mysql.jdbc.Driver");
- con = DriverManager.getConnection(
- "jdbc:mysql://localhost:3306/tts7", "root", "root");
- stmt = con.createStatement();
- rs = stmt.executeQuery("select deptno,dname,loc from dept");
- while (rs.next()) {
- System.out.println(rs.getInt("deptno") + ","
- + rs.getString("dname") + "," + rs.getString("loc"));
- }
- } catch (ClassNotFoundException e) {
- System.out.println("驅動類沒法找到!");
- thrownew RuntimeException(e);
- } catch (SQLException e) {
- System.out.println("數據庫訪問異常!");
- thrownew RuntimeException(e);
- } finally {
- try {
- if (rs != null) {
- rs.close();
- }
- if (stmt != null) {
- stmt.close();
- }
- if (con != null) {
- con.close();
- }
- } catch (SQLException e) {
- System.out.println("關閉鏈接時發生異常");
- }
- }
- }
- }
6 根據下列SQLException信息判斷可能出現的錯誤
請看下列異常:
1.java.sql.SQLException:列名無效
2.java.sql.SQLException:ORA-00911:無效字符
3.java.sql.SQLException:沒法轉換爲內部表示
發生上述異常的緣由是什麼?
參考答案
發生上述各異常的緣由爲:
1.查找的表中不存在要查找的列。
2. sql語句的語法書寫有錯誤。
3.取結果集數據時,get***方法使用不當。