
7.3 各种驱动程序实例
通过前面讲解的内容可以知道JDBC程序分为Java到数据库协议、Java到本地API、JDBC-ODBC桥和Java到网络协议,关于JDBC程序的工作原理如图7.13所示。

图7.13 JDBC的工作原理
7.3.1 利用Java到数据库协议方式连接数据库
当利用Java到数据库协议方式来操作数据库时,会利用数据库相关的协议把对驱动程序的请求直接发送给数据库,该协议实际上就是包含在驱动程序中纯Java类。
本小节将演示如何利用oracle:thin子协议来操作Oracle数据库,具体步骤如下:
01 配置开发环境,引入与Oracle数据库相对应的JDBC。首先复制对应的驱动程序,然后在Package Explorer视图中用鼠标右键单击jdbc项目,在弹出的快捷菜单中选择“Paste”,就完成了环境的配置。
02 连接和操作Oracle数据库,文件JDBCTest.java通过oracle:thin子协议显示出Oracle数据库中的employee表格中的数据,具体内容如下:
//******* JDBCTest.java ************** public static void main(String[] args) { try{ Class.forName("oracle.jdbc.driver.OracleDriver"); //加载JDBC驱动 //连接数据库 Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost: 1521:orcl","scott","root"); Statement stmt=conn.createStatement(); //获取陈述对象 //获取结果集 ResultSet rs = stmt.executeQuery("select * from employee"); System.out.println("记录内容:"); System.out.println("\tID号\t姓名\t电话号码" ); //遍历结果集 while(rs.next()){ System.out.print("\t" + rs.getInt(1)); System.out.print("\t" + rs.getString(2)); System.out.println("\t" + rs.getInt(3)); System.out.println(); } rs.close(); stmt.close(); conn.close(); }catch(Exception e){ e.printStackTrace(); } } }
代码说明:
当程序通过DriverManager.getConnection()方法连接Oracle数据库时,其参数jdbc:oracle:thin:@localhost:1521:orcl中使用的子协议名为oracle:thin,子名称中localhost为主机名、1521为Oracle服务器端口号、orcl为数据库名。
03 编译和运行该程序后,结果如图7.14所示。

图7.14 运行结果
7.3.2 利用Java到本地API方式连接数据库
当利用Java到本地API方式来操作数据库时,首先会通过调用本地的API(数据库客户端提供的API)连接到相应数据库客户端,然后再通过该客户端连接到相对应的数据库。在具体编写代码时,只需把调用驱动程序的代码转换成调用本地API的代码即可。
本小节将演示如何利用OCI(Oracle Call Interface)子协议来操作Oracle数据库,所谓OCI方式就是应用程序先连接Oracle数据库的客户端,然后在通过该客户端连接数据库,因此该方式属于Java到本地API方式,具体步骤如下:
01 Oracle客户端配置,该功能可以通过3种方式来实现:利用客户端工具Net Configuration Assistant;利用Net Manager图形化工具或修改“tnsnames.ora”数据库配置文件。
下面将通过Net Configuration Assistant工具来实现本地Net服务名配置,首先打开Net Configuration Assistant工具,在该工具的欢迎界面(如图7.15所示)中选择“本地Net服务名配置”单选按钮,单击“下一步”按钮,进入“服务名配置”对话框(如图7.16所示),在该对话中选择“添加”单选按钮,单击“下一步”按钮,进入“服务名配置,服务名”对话框(如图7.17所示),在该对话框中需要为服务名选项填写安装Oracle服务器的时产生的SID(系统标识号),然后单击“下一步”按钮,进入“服务名配置,请选择协议”对话框(如图7.18所示),在该对话框中保持默认设置,单击“下一步”按钮,进入“服务名配置,TCP/IP协议”对话框(如图7.19所示),在该对话框中需要对主机和端口号进行设置,该项目因为在本地计算机上所以填写的是“127.0.0.1”,所以这里端口号保持默认即可。至此,基本完成Oracle客户端配置,对于其他的对话框保持默认即可。

图7.15 欢迎界面

图7.16 服务名配置

图7.17 添加服务名

图7.18 选择协议

图7.19 配置协议
02 连接和操作Oracle数据库,文件OCITest.java通过OCI子协议显示出Oracle数据库中的employee表格中的数据,具体内容如下所示。
//******* OCITest.java ************** public class OCITest{ public static void main(String args[]){ try{ Class.forName("oracle.jdbc.driver.OracleDriver"); //加载驱动 //连接数据库 Connection conn = DriverManager.getConnection("jdbc:oracle:oci:@orcl","scott","root"); Statement stmt=conn.createStatement(); //获取陈述对象 //获取运行结果 ResultSet rs = stmt.executeQuery("select * from guestbook"); System.out.println("记录内容:"); System.out.println("\tID号\t姓名\t电话号码" ); while(rs.next()){ System.out.print("\t" + rs.getInt(1)); System.out.print("\t" + rs.getString(2)); System.out.println("\t" + rs.getInt(3)); System.out.println(); } rs.close(); stmt.close(); conn.close(); }catch(Exception e){ e.printStackTrace(); } } }
代码说明:
当程序通过DriverManager.getConnection()方法连接Oracle数据库时,其参数“jdbc:oracle:oci:@orcl”中使用的子协议名为oracle:oci,子名称中@后面必须为刚才配置好的本地Net服务名。
03 该程序如果想运行成功,必须要加入与Oracle数据库相对应的JDBC驱动程序。编译和运行该程序后,其运行结果如图7.20所示。

图7.20 运行结果
7.3.3 利用JDBC-ODBC方式连接数据库
当利用JDBC-ODBC桥驱动程序来操作数据库时,该驱动程序并不是直接操作数据库驱动程序,而是调用JDBC-ODBC桥驱动程序操作ODBC驱动程序,进而连接各种数据库。其详细过程是:应用程序中调用JDBC-ODBC桥驱动程序的指令在“驱动管理器”的中转下交由JDBC-ODBC桥驱动程序处理,经过处理后这些指令格式就会转成ODBC的指令格式。这些指令会自动通过ODBC的驱动程序来利用底层相应的数据库驱动程序来访问对应数据库,具体过程如图7.21所示。

图7.21 JDBC-ODBC桥驱动程序使用
注意:对于开发人员来说,图7.21中最后3步是由Windows系统自动封装成为ODBC数据源,不需要进行相应的编程。
下面将演示如何利用JDBC-ODBC桥驱动程序操作数据库,具体步骤如下:
01 创建ODBC数据源,微软的Windows系统全方位支持ODBC数据源。首先通过双击管理工具中“数据源(ODBC)”图标打开ODBC数据源管理器(如图7.22所示)。然后在“用户DSN”标签中单击“添加”按钮,打开“创建新数据源”对话框(如图7.23所示),在该对话框中为操作的数据源选择相对应的驱动程序,因为该项目操作Excel,所以选择了“Driver do Microsoft Excel(*.xls)”选项。接着单击“完成”按钮就会出现关于ODBC Microsoft Excel安装的对话框,在该对话框中除了要自己定义一个数据源名外,还需要通过“选择工作簿”按钮来设置数据源Excel的路径,设置结果如图7.24所示。最后单击“确定”按钮返回ODBC数据源管理器(如图7.25所示),在该对话框中多出了一个名为“ExcelTest”的数据源记录。至此,ODBC数据源就创建成功了。

图7.22 ODBC数据源管理器

图7.23 创建数据源

图7.24 ODBC Microsoft Excel安装

图7.25 ODBC数据源管理器
02 连接和操作ODBC数据源,文件JDBC_ODBCTest.java通过JDBC-ODBC桥驱动程序来显示Excel表格中的数据,具体内容如下:
//******* JDBC_ODBCTest.java ************** import java.sql.*; public class JDBC_ODBCTest{ public static void main(String args[]){ String drv="sun.jdbc.odbc.JdbcOdbcDriver"; //创建驱动连接字符串 try{ Class.forName(drv); //加载驱动 //获取连接 Connection con = DriverManager.getConnection("jdbc:odbc:ExcelTest", "", ""); Statement stmt=con.createStatement(); //获取陈述对象 ResultSet rs=stmt.executeQuery("select * from [Sheet1$]"); System.out.println("记录内容:"); System.out.println("\tID号\t姓名\t电话号码" ); while(rs.next()){ System.out.print("\t" + rs.getInt(1)); System.out.print("\t" + rs.getString(2)); System.out.print("\t" + rs.getInt(3)); System.out.println(); } rs.close(); stmt.close(); con.close(); }catch(Exception e){ e.printStackTrace(); } } }
代码说明:
● 当程序通过Class.forName()方法加载驱动程序类时,其参数必须为sun.jdbc.odbc.JdbcOdbcDriver,即JDBC-ODBC桥驱动程序。
● 当程序通过DriverManager.getConnection()方法连接ODBC数据源时,其第一个参数中协议与子协议名必须为jdbc和odbc,而子名称是确定的必须为ExcelTest数据源名。第二个和第三个参数用来设置用户名和密码,当它们为空时可以设置为空字符串。
注意:在早期由于经常会使用JDBC-ODBC桥驱动程序操作数据库,所以Sun公司在JDK中就提供了JDBC-ODBC桥驱动程序,因此在程序中不需要加入JDBC-ODBC桥驱动程的架包。
03 编译和运行该程序后,其运行结果如图7.26所示。

图7.26 运行结果