• Java与数据库的连接——JDBC

    2004-04-06

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://jellyfish.blogbus.com/logs/129962.html

    Java与数据库的连接——JDBC(from bbs)

    一、概述
        JDBC是执行SQL语句的Java API。JDBC本身是一个产品的商标名,但它也可被看作为"Ja
    va Database Connecivity(Java数据库连接)"。它由一组用Java语言编写的类与接口组成。
    JDBC已成为一种供工具/数据库开发者使用的标准API,用户可以用纯Java API来编写数据库
    应用。
        使用JDBC可以很容易地把SQL语句传送到任何关系型数据库中。换言之,用户不必为访问
    Sybase数据库写一个程序,又为访问Oracle数据库写另一个程序。你可以用JDBC API写出唯
    一的程序,它能够将SQL语句发送到相应的任何一种数据库。Java与JDBC的结合,使程序员可
    以只写一次数据库应用软件后,就能在各种数据库系统上运行。由于Java语言具有健壮性、
    安全、易使用、易理解和自动下载到网络等优点,因此,它是数据库应用的一个极好的基础语
    言。现在需要找到一种能使Java应用与各种不同数据库对话的方式,而JDBC正是实现这种对
    话的一种机制。
        JDBC扩充了Java的应用范围。例如,用Java与JDBC API可以发布一种包含远程数据库信
    息的Applet的Web页面。企业使用JDBC可以把它的所有雇员信息通过Intranet连接到一个或
    多个内部数据库里。毫无疑问,随着Java程序员的不断增加,对Java的数据库的访问需求会越
    来越迫切。MIS管理员希望Java与JDBC结合,因为这有助于更容易、更经济地发布企业信息。
    商界可以不断地使用已安装的数据库,方便地存取信息,而不必顾及这些数据库是在何种DBM
    S系统下存储的。它有助于缩短新应用的开发时间,并可大大简化数据库的安装与版本控制。
    一旦程序员编写或更新了应用,并把它放入服务器之后,那么每个人都可以获得这个最新版本
    。在商业销售信息服务领域,Java与JDBC则可以更好地向外界客户提供最新信息。

        二、JDBC的功能与特点
        1.JDBC的基本功能
        简单地说,JDBC可以做三件事:
        ·建立与数据库的连接。
        ·发送SQL语句。
        ·处理结果。
        为说明JDBC的基本功能,现特举一例。下面的程序代码片断实现以上所列的三种基本功
    能。
        connection on=DriverManager.GetConnection("jdbc:orbc:wombat",
        "Login","Password");
        statement stmt=con.createstatement();
        ResultSet rs=stmt.executeQuery("SELECT a,b,c FROM Table 1");
        while (rs.next()){
        int x=getInt("a");
        string s=getstring("b");
        float f=getFloat("c");
        }

        2.JDBC是低级的API与高级API的基础
        JDBC是一种"低级"的接口,因为它直接调用SQL命令,但它又可作为构造高级接口与工
    具的基础。高级接口是"用户友好的"、更易理解和更为方便的API,由后台将它翻译成如JDB
    C这样的低级接口。有两种基于JDBC的高级API正处在开发之中:
        一种是嵌入SQL的Java。JDBC要求把SQL语句作为字符串传递给Java方法。嵌入SQL预处
    理程序,可让程序员把SQL与Java直接混合使用。例如,在SQL语句中可用Java变量接收或提供
    SQL值。嵌入SQL预处理程序,把这种混合的Java/SQL翻译成带JDBC调用的Java。
        另一种是把关系数据库表直接映射成Java类。在"对象/关系"的映射中,表中的每一行变
    成类的一个实例,每一列的值对应于该实例的一个属性。然后程序员可直接操作Java对象,并
    自动生成取、存数据的SQL调用。另外它还提供了更高级的映射,例如在Java类中把多个表的
    行结合起来。

        3.JDBC与ODBC及其它API的比较
        目前,Microsoft的ODBC API是访问关系型数据库中应用最广的编程接口,它几乎能将所
    有平台的所有数据库连接起来。现在的问题是可否通过Java来使用ODBC呢?回答是肯定的,但
    最好的做法是在JDBC帮助下采用JDBC-ODBC桥接方式实现。需要JDBC的理由如下:
        (1)Java不能直接使用ODBC。因为ODBC使用C语言接口,如果让Java来调用本机C代码的话
    ,那么会在安全、属性、健壮性、应用的可移植性等方面带来困难。
        (2)不希望把ODBC C API逐字地翻译成Java API。例如,ODBC使用了大量的易于出错的指
    针,而Java取消了这种不安全的指针。现在通过JDBC,把ODBC翻译成具有Java风格的面向对象
    的接口。
        (3)ODBC难以学习。ODBC把简单功能与高级功能混杂在一起,即便是简单的查询也会带来
    复杂的任选项。而JDBC的设计使得简单的事情用简单的做法,仅在必要时才让用户使用高级
    功能。
        (4)JDBC的Java API提供"纯Java"的解决办法。当使用ODBC时,ODBC驱动器管理程序与驱
    动器必须手工地装入到每架客户机上。而JDBC驱动器全部是用Java编写的,JDBC代码则在所
    有Java平台(从网络计算机到主机)上都可自动安装,并且是可移植的和安全的。
        总之,JDBC API是一种基于SQL的抽象与概念的Java接口,它是基于ODBC的。熟悉ODBC的
    程序员很容易学习JDBC,JDBC保留了ODBC的基本设计功能。而且两种接口都是基于X/OpenSQ
    L CLI(Call Level Interface)。最大的区别是JDBC保持了Java自身的风格与优点。最近,M
    icrosoft引入了ODBC以外的新的API,包括RDO、ADO和OLE DB。其设计策略在许多方面与JDB
    C类似,也是一种基于ODBC类的面向对象的数据库接口。

        4.在数据库存取的二层与三层模型上的应用
        JDBC API支持数据库存取的二层与三层模型。在二层模型中,Java applet应用直
    接与数据库对话,这要求JDBC驱动器能与所存取的特定的DBMS系统进行通信。用户的SQL语句
    递交给数据库,其结果回送给用户。数据库可以存放在由网络连接的另一台机器上,这就是典
    型的客户/服务器配置,用户机为客户,存放数据库的机器为服务器。网络可以是连接公司雇
    员的Intranet, 也可以是Internet。
        在三层模型中,把命令发送给模型的"中间层"(包括应用服务器和JDBC),然后中间
    层再把SQL语句发送至数据库。数据库处理SQL语句,把结果回送给中间层,然后再送至用户。
    MIS主管认为三层模型很适合他们的要求,可让中间层来支持对共同数据库的存取与特性控制
    。中间层的另一个优点是,用户可以使用方便的高级API,由中间层把它翻译成某种低级调用
    ,而且在很多情形下,三层架构能提供更好的性能。
    1.客户层——实现用户交互表示逻辑。该层与中间层的应用进行交互,不需要知道下层结构
    或底层数据源函数的任何信息。
    2.中间层包括:
      应用——与客户层进行交互,实现商业逻辑。
      应用服务器——对下层结构提供支持。包括管理和共享物理连接,事务管理,并屏蔽不同
    JDBC驱动之间的差异。最后一点使得编写可移植的应用更容易。应用服务器的角色可以由
    J2EE服务器来实现。应用服务器实现了应用所需的高层抽象,并与JDBC驱动器进行直接交互。
      JDBC驱动器——提供了与低层数据源的连接。每个驱动器实现了不同数据源支持的任意SQL99
    特性上的标准JDBC接口。驱动器层可以会屏蔽标准SQL99语法和数据源支持的本地语法之间的
    差异。如果数据源不是一个关系DBMS,驱动器会实现一个应用服务器使用的关系层。
    3.底层数据源——它可能包括关系DBMS,早期文件系统,面向对象DBMS,数据仓库,电子表格
    或其他形式的数据。唯一的要求是要有一个支持JDBC接口的对应的驱动器。
        到目前为止,中间层一直是用C或C++编写的,因此其性能较好。随着今后优化编译器的引
    入,在能把Java字节代码翻译成高效的机器代码时,就可用Java来实现中间层。

        5.保证一致性的措施
        结构化查询语言(SQL)是存取关系型数据库的标准语言。尽管多数DBMS系统在基本功能
    都上采用SQL的标准形式,但在高级功能上它们并不遵循最新定义的标准SQL语法、语义。例
    如,不是所有的数据库都支持存储过程或外部连接,这样就产生了不一致。JDBC API处理这个
    问题的方法之一是允许将任何查询字符串传递给基础DBMS驱动器,这意味着应用可以自动地
    使用尽可能多的SQL功能,但这会使某些DBMS系统接收到某种错误的查询。
        JDBC处理SQL一致性问题的第二种方法是采用ODBC风格的例外条款,它提供了表示几种常
    见的SQL差别的标准JDBC语法,例如,有表示日期文字与存储过程定义的例外条款。
         对于复杂应用,JDBC提供了处理SQL一致性的第三种方法,那就是借助于DatabaseMetaD
    ata接口,提供关于DBMS的描述性信息样,使应用能适应每个DBMS的需求与能力。
        由于JDBC API是开发高级数据库存取工具与API的基础,所以它还必须涉及到它所构造的
    数据库系统的一致性问题。为此它设置了可以让用户信赖的关于JDBC标准功能级的"JDBCCO
    MPLIANT"标记。要拥有JDBC这一功能标记,驱动器必须至少支持ANSI SQL-2 EntryLevel。"
    JDBC COMPLIANT"标记意味着:厂商的JDBC实现已通过了JavaSoft提供的一致性测试。这种一
    致性测试检查是否存在JDBC API中定义的所有的类与方法,并尽可能检查所提供的SQL Entr
    y Level功能。
        随着JDBC被越来越多大数据库厂商、连接厂商、Internet服务厂商及应用程序编制者所
    接受,JDBC将很快会成为Java数据库存取的标准。

       三、JDBC产品
        当前已有一些可使用的基于JDBC的产品,还有一些正在开发的产品。
        1.JavaSoft框架
        如图3所示,JavaSoft提供了三种JDBC产品构件,并把它们作为JDK的组成部分:
        ·JDBC驱动器管理程序。
        ·JDBC驱动器测试集。
        ·JDBC_ODBJ桥接。
    @@22107002.GIF;图3 Javasoft框架@@
        JDBC驱动器管理程序是JDBC架构的支柱,它的主要功能是把Java应用连接到正确的JDBC
    驱动器,然后离开。
        JDBC驱动器测试集测试为使程序运行的JDBC驱动器的可信度。只有通过JDBC测试集的驱
    动器才可以得到JDBC-COMPLIANT标记。
        JDBC-ODBC桥接允许ODBC驱动器作为JDBC驱动器使用。这是使JDBC迅速投入使用的一种
    现实方式。从长远考虑,它将用来存取非主流的DBMS系统。

        2.JDBC驱动器类型
        到目前为止,有四种类型的JDBC驱动器:
        (1)JDBC-ODBC桥接加上ODBC驱动器  JavaSoft的桥接产品提供了经过ODBC驱动器的
        JDBC存取。注意,ODBC二进制代码及许多情形下的数据库客户代码,必须装入到使用此驱
    动器的每个客户机上。
        (2)本机API加上部分的Java驱动器 这类驱动器把JDBC调用转换为各种DBMS系统(O
        racle、Sybase、Informix、DB2等)的客户API调用。注意,与桥接驱动器一样,这类的驱
    动器需要在每架客户机上装入某种二进制代码。
        (3)JDBC Net加上Java驱动器 这类驱动器把JDBC调用翻译成独立于DBMS的网络协议
        ,然后再由服务器翻译成DBMS协议。这种网络服务器中间件能将纯粹的Java客户程序连
    接到许多不同的数据库。一般来说,这是最灵活的JDBC方案。
        (4)本机协议加上Java驱动器 这类驱动器直接把JDBC调用转换为DBMS使用的网络协
        议,这样可以由客户直接调用DBMS服务器,这是进行Intranet存取的一种切实可行的办法

        我们预期,第3、4类驱动器将是JDBC存取数据库的优选方案,而第1、2类驱动器只是尚未
    提供纯Java驱动器前的过渡性办法。第4类驱动器是理想方案,但少数情况下第3类驱动器
    可能更好些

        3.流行的JDBC驱动器
        当前有许多可与JavaSoft桥接产品一起使用的ODBC驱动器,即第1类驱动器。第2类驱动
    器约有12个,它们是在DBMS的本机API基础是构造起来的。有几个第3类驱动器及2个以上的第
    4类驱动器,估计到1997年底,所有主要的DBMS都将有第4类驱动器。

        4.其它产品
        各种不同JDBC的应用开发工具正在开发中。JavaSoft与国际标准化组织试图将独立于D
    BMS的网络需要标准化。如果这一设想能够实现,那么JavaSoft可能会将协议的"客户端"实
    现与JDK绑在一起,而让不同厂商提供服务器端实现,如图4所示。
    图4 客户端实现与服务器端分离的方案


    收藏到:Del.icio.us