zoukankan      html  css  js  c++  java
  • JDBC核心API

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

  • 相关阅读:
    css设置兄弟节点的样式(相邻的前一个节点)
    css文本强制两行超出就显示省略号,不显示省略号
    Adobe Photoshop CC2014 for MAC 详细破解步骤
    CSS实现背景图片透明和文字不透明效果
    jquery实现搜索框从中间向两边扩展(左右放大)
    微信小程序拒绝授权后提示信息以及重新授权
    linux下的 sudo ln -s 源文件 目标文件
    小程序实现倒计时:解决ios倒计时失效(setInterval失效)
    浅谈CSS高度坍塌
    sourcetree安装以及跳过sourcetree注册登录
  • 原文地址:https://www.cnblogs.com/xyk1987/p/8331008.html
Copyright © 2011-2022 走看看