简介
有了JDBC,向各种关系数据发送SQL语句就是一件很容易的事。换言之,有了JDBCAPI,就不必为访问Sybase数据库专门写一个程序,为访问Oracle数据库又专门写一个程序,或为访问Informix数据库又编写另一个程序等等,程序员只需用JDBCAPI写一个程序就够了,它可向相应数据库发送SQL调用,将Java语言和JDBC结合起来使程序员只须写一遍程序就可以让它在任何平台上运行。
Java数据库连接体系结构是用于Java应用程序连接数据库的标准方法。JDBC对Java程序员而言是API,对实现与数据库连接的服务提供商而言是接口模型。作为API,JDBC为程序开发提供标准的接口,并为数据库厂商及第三方中间件厂商实现与数据库的连接提供了标准方法。JDBC使用已有的SQL标准并支持与其它数据库连接标准,如ODBC之间的桥接。JDBC实现了所有这些面向标准的目标并且具有简单、严格类型定义且高性能实现的接口。
JDBCTM是一种用于执行SQL语句的JavaTMAPI,它由一组用Java编程语言编写的类和接口组成。JDBC为工具/数据库开发人员提供了一个标准的API,使他们能够用纯JavaAPI来编写数据库应用程序。
有了JDBC,向各种关系数据库发送SQL语句就是一件很容易的事。换言之,有了JDBCAPI,就不必为访问Sybase数据库专门写一个程序,为访问Oracle数据库又专门写一个程序,为访问Informix数据库又写另一个程序,等等。您只需用JDBCAPI写一个程序就够了它可向相应数据库发送SQL语句。而且,使用Java编程语言编写的应用程序,就无须去忧虑要为不同的平台编写不同的应用程序。将Java和JDBC结合起来将使程序员只须写一遍程序就可让它在任何平台上运行。
Java具有坚固、安全、易于使用、易于理解和可从网络上自动下载等特性,是编写数据库应用程序的杰出语言。所需要的只是Java应用程序与各种不同数据库之间进行对话的方法。而JDBC正是作为此种用途的机制。
JDBC扩展了Java的功能。例如,用Java和JDBCAPI可以发布含有applet的网页,而该applet使用的信息可能来自远程数据库企业也可以用JDBC通过Intranet将所有职员连到一个或多个内部数据库中(即使这些职员所用的计算机有Windows、Macintosh和UNIX等各种不同的操作系统)。随着越来越多的程序员开始使用Java编程语言,对从Java中便捷地访问数据库的要求也在日益增加。
MIS管理员们都喜欢Java和JDBC的结合,因为它使信息传播变得容易和经济。企业可继续使用它们安装好的数据库,并能便捷地存取信息,即使这些信息是储存在不同数据库管理系统上。新程序的开发期很短。安装和版本控制将大为简化。程序员可只编写一遍应用程序或只更新一次,然后将它放到服务器上,随后任何人就都可得到最新版本的应用程序。对于商务上的销售信息服务,Java和JDBC可为外部客户提供获取信息更新的更好方法。
API
JDBC是个"低级"接口,也就是说,它用于直接调用SQL命令。在这方面它的功能极佳,并比其它的数据库连接API易于使用,但它同时也被设计为一种基础接口,在它之上可以建立高级接口和工具。高级接口是"对用户友好的"接口,它使用的是一种更易理解和更为方便的API,这种API在幕后被转换为诸如JDBC这样的低级接口。
在关系数据库的"对象/关系"映射中,表中的每行对应于类的一个实例,而每列的值对应于该实例的一个属性。于是,程序员可直接对Java对象进行操作;存取数据所需的SQL调用将在"掩盖下"自动生成。此外还可提供更复杂的映射,例如将多个表中的行结合进一个Java类中。
随着人们对JDBC的兴趣日益增涨,越来越多的开发人员一直在使用基于JDBC的工具,以使程序的编写更加容易。程序员也一直在编写力图使最终用户对数据库的访问变得更为简单的应用程序。例如应用程序可提供一个选择数据库任务的菜单。任务被选定后,应用程序将给出提示及空白供填写执行选定任务所需的信息。所需信息输入应用程序将自动调用所需的SQL命令。在这样一种程序的协助下,即使用户根本不懂SQL的语法,也可以执行数据库任务。
比较
ODBC很难学。它把简单和高级功能混在一起,而且即使对于简单的查询,其选项也极为复杂。相反,JDBC尽量保证简单功能的简便性,而同时在必要时允许使用高级功能。启用"纯Java"机制需要象JDBC这样的JavaAPI。如果使用ODBC,就必须手动地将ODBC驱动程序管理器和驱动程序安装在每台客户机上。如果完全用Java编写JDBC驱动程序则JDBC代码在所有Java平台上(从网络计算机到大型机)都可以自动安装、移植并保证安全性。
总之,JDBCAPI对于基本的SQL抽象和概念是一种自然的Java接口。它建立在ODBC上而不是从零开始。因此,熟悉ODBC的程序员将发现JDBC很容易使用。JDBC保留了ODBC的基本设计特征;事实上,两种接口都基于X/OpenSQLCLI(调用级接口)。它们之间最大的区别在于:JDBC以Java风格与优点为基础并进行优化,因此更加易于使用。
目前,Microsoft又引进了ODBC之外的新API:RDO、ADO和OLEDB。这些设计在许多方面与JDBC是相同的,即它们都是面向对象的数据库接口且基于可在ODBC上实现的类。但在这些接口中,我们未看见有特别的功能使我们要转而选择它们来替代ODBC,尤其是在ODBC驱动程序已建立起较为完善的市场的情况下。它们最多也就是在ODBC上加了一种装饰而已。
支持
JDBCAPI既支持数据库访问的两层模型(C/S),同时也支持三层模型(B/S)。在两层模型中,Javaapplet或应用程序将直接与数据库进行对话。这将需要一个JDBC驱动程序来与所访问的特定数据库管理系统进行通讯。用户的SQL语句被送往数据库中,而其结果将被送回给用户。数据库可以位于另一台计算机上,用户通过网络连接到上面。这就叫做客户机/服务器配置,其中用户的计算机为客户机,提供数据库的计算机为服务器。网络可以是Intranet(它可将公司职员连接起来),也可以是Internet。
在三层模型中,命令先是被发送到服务的"中间层",然后由它将SQL语句发送给数据库。数据库对SQL语句进行处理并将结果送回到中间层,中间层再将结果送回给用户。MIS主管们都发现三层模型很吸引人,因为可用中间层来控制对公司数据的访问和可作的的更新的种类。中间层的另一个好处是,用户可以利用易于使用的高级API,而中间层将把它转换为相应的低级调用。最后,许多情况下三层结构可提供一些性能上的好处。
到目前为止,中间层通常都用C或C++这类语言来编写,这些语言执行速度较快。然而,随着最优化编译器(它把Java字节代码转换为高效的特定于机器的代码)的引入,用Java来实现中间层将变得越来越实际。这将是一个很大的进步,它使人们可以充分利用Java的诸多优点(如坚固、多线程和安全等特征)。JDBC对于从Java的中间层来访问数据库非常重要。
SQL的一致性
结构化查询语言(SQL)是访问关系数据库的标准语言。困难之处在于:虽然大多数的DBMS(数据库管理系统)对其基本功能都使用了标准形式的SQL,但它们却不符合最近为更高级的功能定义的标准SQL语法或语义。例如,并非所有的数据库都支持储存程序或外部连接,那些支持这一功能的数据库又相互不一致。人们希望SQL中真正标准的那部份能够进行扩展以包括越来越多的功能。但同时JDBCAPI又必须支持现有的SQL。
JDBCAPI解决这个问题的一种方法是允许将任何查询字符串一直传到所涉及的DBMS驱动程序上。这意味着应用程序可以使用任意多的SQL功能,但它必须冒这样的风险:有可能在某些DBMS上出错。事实上,应用程序查询甚至不一定要是SQL,或者说它可以是个为特定的DBMS设计的SQL的专用派生物(例如,文档或图象查询)。
JDBC处理SQL一致性问题的第二种方法是提供ODBC风格的转义子句,这将在后续部分中讨论。转义语法为几个常见的SQL分歧提供了一种标准的JDBC语法。例如,对日期文字和已储存过程的调用都有转义语法。
对于复杂的应用程序,JDBC用第三种方法来处理SQL的一致性问题它利用DatabaseMetaData接口来提供关于DBMS的描述性信息,从而使应用程序能适应每个DBMS的要求和功能。
由于JDBCAPI将用作开发高级数据库访问工具和API的基础API,因此它还必须注意其所有上层建筑的一致性。"符合JDBC标准TM"代表用户可依赖的JDBC功能的标准级别。要使用这一说明,驱动程序至少必须支持ANSISQL-2EntryLevel(ANSISQL-2代表美国国家标准局1992年所采用的标准。EntryLevel代表SQL功能的特定清单)。驱动程序开发人员可用JDBCAPI所带的测试工具包来确定他们的驱动程序是否符合这些标准。
"符合JDBC标准TM"表示提供者的JDBC实现已经通过了JavaSoft提供的一致性测试。这些一致性测试将检查JDBCAPI中定义的所有类和方法是否都存在,并尽可能地检查程序是否具有SQLEntryLevel功能。当然,这些测试并不完全,而且JavaSoft目前也无意对各提供者的实现进行标级。但这种一致性定义的确可对JDBC实现提供一定的可信度。随着越来越多的数据库提供者、连接提供者、Internet提供者和应用程序编程员对JDBCAPI的接受,JDBC也正迅速成为Java数据库访问的标准。
设置表
创建表
首先,我们在我们的示例数据库创建其中一张表COFFEES,包含在咖啡店所卖咖啡的必要的信息,包括咖啡名字,他们的价格,本星期卖了多少磅及迄今为止卖的数目。
存储咖啡名的列是COF_NAME,它的SQL数据类型是VARCHAR,最大的长度为32个字符。因为我们所卖的每种类型咖啡都使用不同的名字,名字可用于作为唯一识别咖啡的标识,因此可用于作主键。第二个列叫SUP_ID,用于保存咖啡供应商标识;其SQL数据类型为INTEGER。
第3列叫PRICE,因为它需要保存带小数的十进制数,因此它的SQL类型为FLOAT。(注意,通常钱的SQL类型为DECIMAL或NUMERIC,但在不同DBMSs间存在差异,为了避免于老版本的JDBC的不兼容性在本教程我们采用更标准的FLOAT类型)SALES列的SQL类型为INTEGER,其值为本星期所卖咖啡的磅数。最后一列,TOTAL的SQL类型为INTEGER,保存了迄今为止所卖咖啡的总磅数。
COFFEES跟SUPPLIERS都包含列SUP_ID,它意味着可以用SELECT语句从这两张表中取得有关信息。列SUP_ID是SUPPLIERS表的主键,用于唯一识别每个咖啡供应商。在COFFEES表中,SUP_ID列被称外键。注意每个SUP_ID值在SUPPLIERS表里只出现一次;这对主键是必须的。在COFFEES表里,它作为外键,显然它可以有重复的SUP_ID值,因为同一供应商可以提供很多种的咖啡。在本节的最后,你将看见如何在SELECT语句中使用主键及外键的一个例子。
在CREATETABLE语句中,关键字采用大写字符,并且每个项目都另起一行。SQL并没有此要求;仅仅是为了更容易阅读。SQL标准是不区分关键词的大小写的,因此,如下例中的SELECT语句可以有多种写法。因此下面两个不同写法的语句对SQL来说是一样的。
执行语句
使用executeUpdate方法是因为在createTableCoffees中的SQL语句是DDL(数据定义语言)语句。创建表,改变表,删除表都是DDL语句的例子,要用executeUpdate方法来执行。你也可以从它的名字里看出,方法executeUpdate也被用于执行更新表SQL语句。实际上,相对于创建表来说,executeUpdate用于更新表的时间更多,因为表只需要创建一次,但经常被更新。
被使用最多的执行SQL语句的方法是executeQuery。这个方法被用来执行SELECT语句,它几乎是使用最多的SQL语句。马上你将看到如何使用这个方法。
开始
安装
Java数据库连接(JDBC)是一个标准SQL(StructuredQueryLanguage,结构化查询语言)数据库访问接口,可以为多种关系数据库提供统一访问。JDBC(JavaDataBaseConnection,Java数据库连接)也提供一种基准,据此可以构建更高级的工具和接口。目前的JDK(JavaDevelopmentKit,Java开发工具包)软件捆绑包括JDBC和JDBC-ODBC(OpenDataBaseConnection,开放式数据库连接)桥。这些包也可独立得到,以跟JDK1.0一起使用。应该注意的是,本文的示例使用了JDBC2.0接口,需要JDK2.0来运行,不能在JDK1.1下运行。
安装驱动程序
你的驱动程序应该有安装方法。为特定的DBMSs写的JDBC驱动程序安装时只要拷贝到你的计算机上就可以了。并不需要特殊的配置。
如果你下载的是Solaris或WindowsJDK1.1版本,桥作为包sun.jdbc.odbc与JDK一起自动安装。有关安装和配置ODBC的信息,请咨询ODBC驱动程序厂商。桥无须特殊配置。有关客户机安装和配置信息,请咨询数据库厂商。
配置数据库
我们假设数据库COFFEEBREAK已经存在。(创建一个数据库并不困难,但需要一定的权限并通常是由数据库管理员来做)你还需要在此数据库里创建本教程作为例子使用的表。我们有意限制表的大小跟及数目,以便于管理。