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

posted @ 2018-01-22 20:32  清风已来  阅读(2570)  评论(0编辑  收藏  举报