第 10章 中间件技术本章重要概念
( 1) 中间件的定义和作用
( 2) ODBC分层的体系结构:应用程序,驱动程序管理器,DB驱动程序,ODBC数据源 。
( 3 ) ODBC 接口:应用程序基本流程,
ODBC句柄,ODBC连接,SQL语句的执行 。
ODBC两套符合性级别 。 典型的 DB应用系统开发工具 。
( 4) JDBC的基本功能,JDBC的结构,JDBC
接口。
前言
对于那些相对独立的软件供应商而言,经常要为每一个
DBMS编写一个版本的应用程序,或者为每个要访问的
DBMS编写针对 DBMS的代码。这就意味着,大量的资源都耗在了编写和维护 DB的访问上,更不用说应用程序了。此时应用程序的评价标准不再是质量,而是它能否在给定的
DBMS中访问数据库。
这就需要开放的数据库连接,就是人们需要用一种新的方法来访问不同的数据库。为此,在 C/S系统中必须广泛使用中间件技术,以隐藏各种复杂性,屏蔽各种系统之间的差异。
ODBC技术和 JDBC技术就是这种优秀的中间件技术。
10.1.1 中间件的定义
定义 10.1 中间件( middleware)是分布式环境中保证操作系统、通信协议、数据库等之间进行对话、互操作的软件系统。
10.2.2 中间件的作用
中间件的作用是保证网络中各部件(软件和硬件)之间透明地连接,即隐藏网络部件的异构性,尤其保证不同网络、
不同 DBMS和某些访问语言的透明性,即下面三个透明性。
① 网络透明性:能支持所有类型的网络 。
② 服务器透明性:不管服务器上的 DBMS是何种型号
( ORACLE,SYBASE,DB2等),一个好的中间件都能通过标准的 SQL语言与不同 DBMS上的 SQL语言连接起来。
③ 语言透明性:客户机可用任何开发语言进行发送请求和接受回答,被调用的功能应该像语言那样也是独立的。
10.2.1 ODBC概念应用程序 应用程序 应用程序……
公共接口 A P I
网络软件
SYB A SE D B2O RA C L ESQL S e rv e rFo x p ro
10.2.2 ODBC的体系结构(一)
OD BC 数据库应用程序
S QL S e rv e r
驱动程序
Ora c le
驱动程序
DB2
驱动程序
S y b a se
驱动程序
F o x p ro
驱动程序驱动程序管理器
S QL S e rv e r
数据源
Ora c le
数据源
F o x p ro
数据源
S y b a se
数据源
DB2
数据源
DB DB DB DB DB
10.2.2 ODBC的体系结构(二)
应用程序的主要功能是:调用 ODBC函数,递交
SQL语句给 DBMS,检索出结果,并进行处理。
驱动程序管理器是一个动态连接库( DLL),用于连接各种 DBS的 DBMS驱动程序(如 Oracle、
Foxpro,Sybase等驱动程序),管理应用程序和
DBMS驱动程序之间的交互作用(通信)。
应用程序通过调用驱动程序所支持的函数来操纵数据库。驱动程序也是一个动态连接库( DLL)。
10.2.2 ODBC的体系结构(三)
网络环境下基于单层驱动程序的 ODBC结构工作站
OD BC 数据库应用程序驱动程序管理器单层驱动程序(包含数据库引擎)
数据库文件( *,DBF )
网络文件服务器
10.2.2 ODBC的体系结构(四)
基于多层驱动程序的 ODBC结构
OD BC 数据库应用程序驱动程序管理器多层驱动程序客户端网络支撑软件客户端
(网络)
S QL 请求数据库服务器操作结果数据库软件( *,DBF )
数据库引擎服务器网络支撑软件
10.2.2 ODBC的体系结构(五)
基于网关机制的多层驱动程序的 ODBC结构
OD BC 数据库应用程序客户端网络支撑软件客户浏览器
(网络)
数据库引擎
WW W 服务器数据库驱动程序管理器数据库网关服务器网络支撑软件驱动程序数据库服务器
10.2.2 ODBC的体系结构(六)
① 用户数据源:用户创建的数据源,称为“用户数据源”。此时只有创建者才能使用,并且只能在所定义的机器上运行。任何用户都不能使用其他用户创建的用户数据源。
② 系统数据源:所有用户和在 Windows NT下以服务方式运行的应用程序均可使用系统数据源。
③ 文件数据源:文件数据源是 ODBC 3.0以上版本增加的一种数据源,可用于企业用户,ODBC驱动程序也安装在用户的计算机上。
10.2.3 ODBC的特性
① ODBC是一个调用层的接口
② ODBC定义了标准的 SQL语法
③ ODBC提供一个驱动程序管理器来管理并同时访问多个 DBMS系统
10.3.1 ODBC应用程序的基本流程分配环境句柄分配连接句柄与服务器连接分配语句句柄初始化释放环境句柄
S QL 处理释放语句句柄语句处理和检索部分与服务器断开释放连接句柄终止相应的函数名
S QLA ll o c En v
S QLA ll o c Co n n e c t
S QL Co n n e c t
S QLA ll o c S tm t
S QL Ex e c Dire c t (直接执行函数)
S QL P re p a re (语句预备函数)
S QL Ex e c u te (语句执行函数)
S QL Disc o n n e c t
S QL F re e En v
S QL F re e Co n n e c t
S QL F re e S t m t
10.3.2 ODBC句柄(一)
应用程序环境句柄 (只有一个)
连接句柄 连接句柄 …… 连接句柄语句句柄 语句句柄 …… 语句句柄
10.3.2 ODBC句柄(二)

……



henv
hdbc
hstmt
环境句柄
(定义 DB应用环境 )
连接句柄
(定义一个 DB连接 )
语句句柄
(定义一个 SQL语句 )
10.3.3 数据源的连接与断开
(1) 连接数据源的函数连接数据源的函数有三个,但最有效、最通用的是下面一种格式:
SQLConnect( hdbc,szDSN,cbDSN,szUID,cbUID,szAuthStr,
cbAuthStr)。其中,参数 hdbc是一个已经分配的连接分配;
参数 szDSN和 cbDSN分别表示系统所要连接的数据源名称及其长度;
参数 szUID和 cbUID分别表示用户标识符及其长度;
参数 szAuthStr和 cbAuthStr分别表示权限字符串及其长度。
(2) 断开数据源函数其格式如下,SQLDisconnect( hdbc)其中,参数 hdbc是要断开的连接句柄。
10.3.4 SQL语句的执行(一)
main()
{ HENV henv; / *说明 henv是一个环境型变量 */
HDBC hdbc; / *说明 hdbc是一个连接型变量 */
HSTMT hstmt; / *说明 hstmt是一个语句句柄变量 */
RETCODE retcode; / *说明 retcode是一个返回变量 */
SQLAllocEnv( &henv); / *分配一个环境句柄 */
SQLAllocConnect( henv,&hdbc); / *分配一个连接句柄 */
SQLConnect( hdbc,"学生 ",SQL_NTS,NULL,0,NULL,0);/ *连接数据源 */
SQLAllocStmt( hdbc,&hstmt); / *分配一个语句句柄 */
retcode=SQLExecDirect( hstmt,"SELECT * FROM S",SQL_NTS);/ *执行语句
*/
…… / *结果集处理 */
SQLDisconnect( hdbc); / *断开数据源 */
SQLFreeStmt( hstmt,SQL_DROP) / *释放一个语句句柄 */
SQLFreeConnect( hdbc); / *释放一个连接句柄 */
SQLFreeEnv( henv); / *当应用完成后,释放环境句柄 */

10.3.4 SQL语句的执行(二)
有准备地执行 SQL语句的函数
(1) SQL语句预备函数其格式如下,SQLPrepare( hstmt,szSqlStr,
cbSqlStr)。其中,参数 hstmt是一个有效的语句句柄,参数 szSqlStr和 cbSqlStr分别表示将要执行的
SQL语句的字符串及其长度。
(2) SQL语句执行函数其格式如下,SQLExecute( hstmt)。其中参数
hstmt是一个有效的语句句柄。
10.3.5 查询结果的获取
while( RETCODE_IS_SUCCESSFUL( retcode)

retcode=SQLFetch( hstmt);
if( RETCODE_IS_SUCCESSFUL( retcode)

do

rcGetData = SQLGetData( hstmt,1,SQL_C_CHAR,
szBuffer,sizeof( szBuffer),&cbValue);
DISPLAY_MEMO( szBuffer,cbValue);/ *显示 */
} while( rcGetData!=SQL_NO_DATA_FOUND);


10.4 ODBC的符合性级别
ODBC使得我们能够访问任何数据源而不必修改应用程序。但在实际使用中存在着一些问题。由于 DBMS厂商提供的 SQL不同(不是指形式上,而是功能上有多有少),有的
SQL功能在某厂商的 DBMS上没有实现,则 ODBC就不可能为应用程序完成这一功能;有的 SQL功能是 SQL标准新增加的,而 DBMS厂商没有及时跟上,则 ODBC同样也无法完成新功能。对于具体 DBMS不支持的 SQL功能,DBMS要通报给应用程序。而从 ODBC本身来讲,它最好支持完全的 SQL,
这样才能做到应用程序不用修改就可以访问不同的数据源。
10.4.1 API符合性的三个级别
① 核心级 API
② 1级 API
③ 2级 API
10.4.2 SQL符合性的三个级别
最小级 SQL
核心级 SQL
扩展级 SQL
10.4.3 ODBC API与 SQL CLI之间的协调
Microsoft公司于 1991年 11月提出了一个关于 ODBC的体系结构,并在 1992年发布了 ODBC 1.0规范,随后以软件开发工具包( SDK)形式出版并发行了这种面向 SQL的 API。
数据库公司国际财团 SQL Access Group( SAG)和标准化组织 X/ Open在 1992年联合出版了一个规范,该规范定义了调用级界面( Call Level Interface),CLI)
标准。
1993年,Microsoft公司推出了 ODBC 2.0规范,并于
1994年出版了 ODBC 2.0 SDK。
Microsoft在 1998年出版的 ODBC 3.0规范中,作了一些修改,目的是更进一步接近 SQL标准。
SQL3(即 SQL99)的第三部分介绍了 SQL/ CLI。
10.4.4 典型的数据库应用系统开发工具
PowerBilder
Delphi
Visual Basic
Developer/ 2000
10.5.1 Java简介
Java语言
Java的工作方式
Java的特性
Java的应用程序和小程序
10.5.2 JDBC的提出
JDBC是执行 SQL语句的 Java API。 JDBC是,Java
DataBase Connectivity”( JDBC数据库连接 )的缩写。
JDBC原来是 Java Soft公司设计的 Java语言的数据库访问
API。最初的 Java语言本身并没有访问 DB的能力,JDBC是第一个支持 Java语言的标准的数据库 API。 1996年夏天,
Sun公司推出了 JDBC工具。现在 JDBC驱动程序已经被大多数主流数据库所用。
JDBC由一组用 Java语言编写的类与接口组成。
JDBC扩充了 Java的应用范围,用 Java与 JDBC API可以发布一种包含远程数据库信息的 Applet(小应用程序)的
WWW页面。
10.5.3 JDBC的基本功能
建立与数据库的连接
发送 SQL语句
处理结果
10.5.4 JDBC与 CGI的比较
J a v a 应用程序 CG I 脚本W e b 服务器 数据库
J a v a 应用程序 JD BC 服务器 数据库
10.6.1 JDBC数据库设计方法
J av a 应用程序
( ap p li catio n )
J DB C
客户机
DB MSDB 服务器
DB MS
专用协议应用程序
( )
客户机应用程序
( )
应用程序
( )
客户机服务器服务器专用协议
J a va W e b 服务
JD B C
应用服务器
DB MSDB 服务器
DB MS
专用协议
J av a 小应用程序
( ap p let )
客户机
HTT P
R MI 调用服务应用服务器服务器专用协议服务应用服务器服务服务应用服务器服务器服务器专用协议小应用程序
( )
客户机调用小应用程序
( )
客户机小应用程序
( )
客户机调用
10.6.2 保持一致性的措施
① 允许将任何查询字符串传递给基础 DBMS驱动器,
这意味着应用可以自动地使用尽可能多的 SQL功能,
但这会使某些 DBMS系统接收到某种错误的查询。
② 采用 ODBC风格的方法,提供表示几种常见的 SQL
差别的标准 JDBC语法。
③ 对于复杂应用,借助于 DatabaseMetaData接口,
提供关于 DBMS的描述性信息,使应用能适应每个
DBMS的需求与能力。
10.6.3 JDBC驱动程序
本地库 Java实现
网络协议 Java驱动程序
本地协议 Java驱动程序
JDBC-ODBC桥驱动程序
10.7.1 JDBC API的目标
① 为 Java定义一个“调用层”( call-level)的
SQL接口
② 遵循 SQL2标准
③ JDBC应建立在现存的数据库接口上
④ 必须保证这个接口与 Java系统的其他部分保持一致
⑤ 使基本的 API尽量简单
⑥ 尽量保持强大的、静态的类型
10.7.2 JDBC API接口概貌
JDBC接口分为两个层次,一个是面向程序开发人员的
JDBC API,另外一个是底层的 JDBC Driver API。一般来说,
应用程序层是数据库应用程序开发者使用的,驱动程序层是驱动厂家实现的。对于应用程序开发者来说只要求 JDBC
API所提供的接口能保证与 JDBC相符合。而对于驱动程序层则要负责开开发数据库接口和支持 JDBC应用程序层调用的编码。每一个驱动程序层都必须实现 4个组要的接口,应用程序层和驱动程序层用一个类桥接。这 4个接口分别是 Driver、
Connection,Statement和 ResultSet。 Driver接口建立与数据库的连接,大多数应用程序中,Driver接口功能是通过驱动程序管理器( DriverManager)类实现的,提供给使用者的另一层的抽象。
小 结(一)
ODBC和 JDBC是当今 C/S数据库环境中使用广泛也是著名的中间件。
目前,使用 ODBC API几乎可以将所有平台上的关系型数据库连接起来。 ODBC的体系结构由四个部分构成。其中驱动程序管理器和 DBMS的驱动程序都是动态链接库( DLL),由一系列函数构成。
ODBC接口由一系列调用函数组成,应用程序分成初始化,SQL处理和终止三个部分,每一部分使用
ODBC函数都有严格的规定和顺序。 ODBC API和
SQL CLI这两个标准正在朝统一的方向迈进。
小 结(二)
JDBC是基于 ODBC的 SQL Java接口,它既保持了
Java语言自身的特点,也保留了 ODBC的基本设计功能,熟悉 ODBC的程序员可以非常容易地学习
JDBC。 JDBC是一种“低级”的接口,它直接调用
SQL命令,但又可以作为构造高级接口和工具的基础。
ODBC和 JDBC的出现,为数据库的发展指明了道路,
会在今后的 Web数据库发展中运用得越来越广泛。
同时,ODBC和 JDBC技术的发展将影响到 Web数据库的发展,甚至可能成为下一代技术的主流。
本章的重点篇幅
( 1) ODBC分层的体系结构 ( 教材 P400的图
10.2) 。
( 2) ODBC应用程序的基本流程 ( 教材 P405的图 10.6) 。
( 3) JDBC驱动程序(教材 P422-423),JDBC
API接口(教材 P424-425)。