ITEEDU

第9章 在servlet中使用JDBC(上)

  servlet的典型应用之一就是访问服务器上的信息。有研究表明,百分之八十以上的应用程序使用了保存在关系数据库中的数据。在本章中,我们将讨论JDBC的使用以及如何在servlet中使用数据库信息。JDBC是JavaSoft的一个用于连接数据库、操纵数据的一个API规范。

9.1 JDBC概述

  什么是JDBC呢?简单的说,JDBC实现了Java的数据库互连,它是一个定义了以下内容的一个API规范。
·如何在Java applet、应用程序或者servlet中与数据源交互
·如何使用JDBC驱动程序
·如何编写JDBC驱动程序
专门有讲解JDBC驱动程序的著作(实际上,我就写过这么一本),而在本书中,我只想在一章中介绍一些JDBC的基本知识。相信在阅读过这个简要的概述之后,你就可以开始开发数据相关的Java应用程序了。
JDBC这个项目是在1995年底启动的,负责人是JavaSoft的Rick Cattel和Graham Hamilton。JDBC API是在X/Open CLI(调用层接口)的基础上研制的,X/Open CLI定义了在使用数据库系统的时候,客户和服务器如何进行交互。非常有趣的是,Microsoft的开放数据库系统互连(ODBC)也是基于X/Open CLI的,所以你可以认为它们是一对堂兄弟。JavaSoft广泛听取了主要数据库厂商的意见,以形成JDBC规范。事实上,对于所有的新API规范的制订也包括JDBC,JavaSoft坚持下列过程。
1、将新的API和API的主要改动提交给主要的厂商进行讨论。在规范指定过程中这一步的存在,显示了JavaSoft的成熟和智慧。他们认识到他们可能不是某个领域的专家,所以他们要找这些专家来讨论。这不但使规范更加稳定和强大,而且可以确保这些厂商会买进这些规范,因为是他们帮助创建的规范。这一步会经过多次反复,历时长达数月。
2、在经过厂商研究讨论之后,公开并出版规范以便公众讨论,任何人都可以从Interent上下载规范,讨论它,并提出自己的意见和建议。这一步通常会用几个月的时间,而且会有准确的截止日期。
3、在经过公众讨论,并且进行了必要的调整之后,这个规范才会被发布并加入到下一版本的JDK中。公众的意见和建议仍然会被接受,以便形成未来的修订版本。
JDBC规范的制订就经加了上述过程,终于在1996年6月发布在java.sql包中。由于这个API已经经过讨论,所以在它发布的时候,已经得到了主要的厂商的参与和认可。

9.1.1 互操作性:JDBC的关键

  JDBC的一个主要卖点就是数据库的互操作性。这到底意味着什么呢?这意味着通过使用JDBC API来进行数据库访问,你可以在不修改应用程序的情况下,改变所使用的数据库驱动程序(或数据库引擎)。更进一步说,在编写应用程序的时候,你可以不了解某个数据库系统的细节,你只要按照标准的JDBC API规范来做,并且安装与你所用的数据库相对应的JDBC驱动程序就可以了。如图9.1所示。所有的与某个数据库系统接口的数据库实现的细节由JDBC驱动程序开发商来完成。
请记住JDBC API规划是一个双行线,它不但定义了应用程序开发人员如何操作数据库,而且定义了如何编写JDBC驱动程序以保证互操作性。在这个方面,JavaSoft开发了JDBC驱动程序认证套件,这个软件确保了JDBC坚持规范并且以可预期的方式工作。

    ┌─────────────────┐
│JAVA APPLICATION,│
│APPLET,OR SERVLET│
└────────┬────────┘
┌────────┴────────┐
│     JDBC API    │
└────────┬────────┘
┌────────┴────────┐
│     JDBC API    │
│ DRIVER MANAGER  │
└───┬────┬────┬───┘
┌─┘    │    └──┐
┌───┴──┐┌──┴───┐┌──┴───┐
│ JDBC ││ JDBC ││ JDBC │
│DRIVER││DRIVER││DRIVER│
└───┬──┘└──┬───┘└──┬───┘
╭┴╮    ╭┴╮     ╭┴╮
╰─╯    ╰─╯     ╰─╯
│ │    │ │     │ │
╰─╯    ╰─╯     ╰─╯
ODBC     ORACLE     SYBASE
图9.1 JDBC互操作性

9.1.2 JDBC-ODBC桥

  如前所述,Microsoft的ODBC规范和JDBC同是在X/Open CLI的基础上得来的,它们也都使用同样的数据库语言SQL。SQL是结构化查询语言(Structured Query Language)的缩写,不过自从形成这个缩写之后,它就成了一个三个辅音构成的没有元音的词汇。SQL定义了如何用数据定义语言(Data Definition Languare,DDL)来定义和维护数据库以及如何用数据操纵语言(Data Manipulation Language,DML)来读取和更改数据。
1996年时ODBC具备而JDBC不具备的就是ODBC得到了业界的接受。那时,ODBC就已经成为数据库访问的事实上的工业标准并且在业界得到广泛的使用。不但Microsoft的数据库产品提供了ODBC驱动程序,所有主要的数据库厂商(如ORACLE,Sybase,Informix等等)也都在他们的产品中加入了ODBC驱动程序。那么JavaSoft如何利用各公司在ODBC上的现有的投资,并使其中的一部分加入到JDBC王国呢?答案就是JDBC-ODBC桥。
JDBC-ODBC桥是一个JDBC驱动程序,这个驱动程序使用本地(C语言)库来调用现有的ODBC驱动程序以访问数据库引擎。作为JDBC-ODBC桥的作者,我经常被问及如何以及为什么要开发JDBC-ODBC桥。

  内幕


如前所述,JDBC API经历了JavaSoft规范的讨论过程。早在厂商讨论阶段(1995年底),JDBC规范就被发送给INTERSOLV,INTERSOLV目前仍是领先的ODBC驱动程序厂商。那时,我正是ODBC组的一员,而且刚刚完成FoxPro的ODBC驱动程序。幸运的是我早就开始学习Java,并在业余时间制作了一些应用程序(那时Java还很年轻,只有很少的几个公司拥有Java编程的资料)。我的老板找到我,要求我研究一下这个叫做JDBC的新的数据库访问规范,我正求之不得呢!我记得最初的草案是0.20版,模糊地构成了我们现在所看到JDBC。
INTERSOLV对能在Java世界出名非常感兴趣,于是就达成了制作一个使用现有的ODBC驱动程序的JDBC驱动程序的JDBC驱动程序的协议。作为这一开发工作(加上一年的技术支持)的交换,JavaSoft必须公开宣布JavaSoft和INTERSOLV的合作关系。实际上,并没有开发费用。听上去是不是JavaSoft占了便宜?自从我开始研究这个规范,我就决定开发这个JDBC-ODBC桥了。我在1996年月3月开始了这项工作,并且在于月完成了这个桥,尽管过程中API不断改变,而且多次修订。
JavaSoft开发这个桥的主要目的是免费的将它提供给JDBC程序员,使他们可以立刻开始编写JDBC应用程序,换句话说就是给JDBC程序员下钩,以期JDBC得到广泛接受。时间证明JavaSoft的计划得到了回报。

  限制

在使用JDBC-ODBC桥的时候会有许多限制,我们必须牢记在心:
·这个桥从来没有被当作任何软件的一部分,它不被JavaSoft正式支持,它仅仅是一个开发原型或者一个市场工具,我了解到许多公司使用在关键业务应用程序中这个桥,但是,我奉劝大家尽可能使用你所使用的数据库所提供的JDBC驱动程序。
·这个桥使用了本地代码(C语言),这意味着严重的限制。这个桥不能被不被信任的applet所使用,而且所有的本地库必须在每一台机器上安装和设置。其中不光包括这个桥的本地库(JdbcOdbc.dll或者JdbcOdbc.so)。而且还包括所有的ODBC库,ODBC驱动程序以及所有ODBC驱动程序所需的库。所有这些软件都配置好之后,你还必须配置ODBC以建立新的数据源。这样的安装过程与Java零安装的模型相去甚远。
·由于这个桥使用了现有的ODBC驱动程序,所以使用它时你可能遇到任何ODBC驱动程序的bug。
·你的ODBC驱动程序做不了的事,使用了ODBC的桥也做不了。许多人认为使用这个桥加上他们喜爱的ODBC驱动程序会使ODBC驱动程序支持Web,并且魔术般使数据库可以在Internet上访问,这显然是不正确的。一定要记住,ODBC驱动程序在客户机上运行,而它访问数据库的方式是无法改变的。
说了这么多,这个桥仍然是访问某种数据库如(Microsoft Access)的惟一方法。许多数据库只提供了ODBC驱动程序而没有提供相应的JDBC驱动程序。在这种情况下,JDBC-ODBC桥将是取得数据的惟一途径,除非你打算自己编写JDBC驱动程序。

9.1.3 JDBC驱动程序的类型

  JavaSoft定义了四种JDBC驱动程序的基本类型。理解各种类型的特征