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
代碼如下所示:
- 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格式為:
- jdbc:mysql://<主機名>:<端口號(默認3306)>/<數據庫名>
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***方法使用不當。
