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