??xml version="1.0" encoding="utf-8" standalone="yes"?>
JDBC应用E序接口?/span>Java~程语言讉K一个或多个数据源提供了(jin)一U途径。在大多数情况下Q数据源是用SQL讉K的关pL据库理pȝ。尽如此,支持JDBC技术的驱动E序也可以访问其他的数据源,包括遗留文gpȝ(legacy file systems)和面向对象的pȝ?/span>JDBC应用E序接口的一个主要动机就是ؓ(f)应用E序可以讉Kq泛的数据源提供标准的应用程序接?/span>(API)?/span>
q一章介l了(jin)一?/span>JDBC应用E序接口的关键概c(din)除此之外,q描qC(jin)JDBC应用E序的两U运行环境,以及(qing)讨论?jin)不同的功能角色在每个运行环境中是怎样被实现的。两层和三层逻辑l构能够在大量的物理l构上被实现?/span>
4.1建立一个连?/span>
JDBC应用E序接口定义?/span>Connection接口来表CZ个到潜在数据源的q接?/span>
在典型情况下Q?/span>JDBC应用E序?x)用两种方式中的一U来q接到目标数据源Q?/span>
■ DriverManager —— q个被充分实现的cd最初的JDBC1.0应用E序接口中介l过Q它需要应用程序装载一个特定的驱动Q这一驱动使用编码的l一资源定位?/span>(URL)?/span>
■ DataSource —— q个接口?/span>JDBC2.0可选包应用E序接口(Optional Package API)中介l过。与DriverManager相比它被作ؓ(f)首选,因ؓ(f)他允许潜在数据源的细节对应用E序透明。一?/span>DataSource对象的属性被讄以后可以表示一个特定的数据源。当它的getConnectionҎ(gu)被调用以后,Datasource的实例将?x)返回一个到数据源的q接。应用程序可以通过改变Datasource对象的属性来q接C同的数据源,而不需要改变应用程序的代码。同L(fng)Q一?/span>DataSource可以在不改变使用它的应用E序的代码的前提下被改变?/span>
JDBC应用E序接口q定义了(jin)DataSource接口的两个重要扩展来支持企业U的应用E序。这些扩展就是以下的两个接口Q?/span>
■ ConnectionPoolDataSource —— 支持物理q接高速缓冲和重用Q物理连接改善了(jin)应用E序的性能和可伸羃性?/span>
■ XADataSource —— 提供?jin)在分布式事务中可共享的q接?/span>
4.2执行SQL表达式以?qing)操作结果?/span>
一旦一个连接被建立Q那么用这个连接的应用E序可以用JDBC应用E序接口对目标数据源q行查询和更新?/span>JDBC3.0应用E序接口提供?jin)对大多数实C(jin)?/span>SQL99Ҏ(gu)的支持。因Z同的厂商都在不同的别支持这些特性,?/span>JDBC应用E序接口则包括了(jin)DatabaseMetadata接口。应用程序能够用此接口来确定它们用的数据源是否支持某一Ҏ(gu)?/span>JDBC应用E序接口q定义了(jin)转义语法使得应用E序可以讉K非标准的厂商定义的特性。{义语法的优点是可以?/span>JDBC应用E序能够像本地应用程序一栯问相同的Ҏ(gu),而同时又能够保证应用E序的可UL性?/span>
应用E序使用Connection接口中的Ҏ(gu)来定义事务的属性和创徏StatementQ?/span>PreparedStatement?/span>CallableStatement对象。这些表辑ּ被用来执?/span>SQL表达式和(g)索结果集?/span>ResultSet接口装SQL的查询结果。表辑ּ也可以被扚w执行Q即允许应用E序向数据源提交多条更新语句作ؓ(f)执行的单个单元?/span>
JDBC应用E序接口?/span>RowSet接口扩展?/span>ResultSet接口Q从而ؓ(f)列表数据提供?jin)一个容器,而这h标准l果集更加通用。一?/span>Rowset对象是一?/span>JavaBeans™lgQ它可以在没有连接到数据源的情况下对它进行操作。例如,一?/span>RowSet可以被串行化Q因此也可以在网l之间被传输Q这寚w些想不需?/span>JDBC驱动和数据源q接而对表格数据q行操作的小型客L(fng)是非常有用的?/span>RowSet的另一个特性是能够包含一个阅d来访问Q意表格Ş式的数据Q而不仅仅是关pL据库中的数据。更q一步的Q一?/span>RowSet对象可以在当它与数据源失去连接的时候更新它的行。它可以包含一个记录器Q把那些更新写回到潜在的数据源?/span>
JDBC应用E序接口定义?jin)标准的?/span>SQL数据cd?/span>JDBC数据cd的映。这包括?/span>SQL99高数据cd的支持,诸如BLOBQ?/span>CLOBQ?/span>ARRAYQ?/span>REFQ?/span>STRUCT?/span>DISTINCT?/span>JDBC驱动也可以ؓ(f)用户定义cdQ?/span>UDTsQ实C个或多个自定义类型映。在q个映射中,用户定义cdQ?/span>UDTQ被映射C?/span>JavacM?/span>JDBC3.0应用E序接口q添加了(jin)对外部数据管理的支持Q例如一个在数据源外部的文g中的数据?/span>
4.3两层l构模型
一个两层结构模型按功能可以被划分ؓ(f)客户端层和服务器层,见图4-1?/span>
?/span>4-1 两层l构模型
客户端层包括?jin)应用程序和一个或多个JDBC驱动Q应用程序负责对以下职责q行处理Q?/span>
■ 表现层逻辑
■ 业务逻辑
■ 对多重事务和分布式事务的理
■ 资源理
在这个模型中Q应用程序直接与JDBC驱动交互Q包括徏立和理物理q接以及(qing)处理潜在的特定的数据源的l节。应用程序可以采用特D的实现采用不标准的Ҏ(gu)或性能调整的优炏V?/span>
q个模型的一些缺点包括:(x)
■ 伴随着基础l构和系l的功能得表现层逻辑和业务层逻辑不能分离。这׃ؓ(f)使用一个好的体pȝ构来~写可维护性好的品代码带来了(jin)困难?/span>
■ 因ؓ(f)采用?jin)特定的数据库实玎ͼ降低了(jin)应用程序的可移植性。而那些要求连接到多个数据库的应用E序必须知道不同厂商的数据库之间的差异?/span>
■ 限制?jin)可伸羃性。通常圎ͼ应用E序在结束之前将保持一个或多个到数据库的物理连接,q样限制了(jin)它支持ƈ发应用程序的数量。在q个模型中,性能Q可伸羃性和可用性受?/span>JDBC驱动和相应的数据源的限制。如果一个应用程序采用了(jin)多个驱动Q它也可能需要知道每U驱动和数据源解册些限制的不同Ҏ(gu)?/span>
4.4三层l构模型
三层模型l构Z务逻辑和基l构引入?jin)中间层服务器,见?/span>4-2Q?/span>
?/span>4-2 三层l构模型
q个体系l构被设计来Z业的应用程序提高性能Q可伸羃性和可用性。三个层的功能分别ؓ(f)Q?/span>
1?span> 客户端层 —— 为程序和人的交互实现表现层逻辑的一个层?/span>JavaE序Q浏览器和掌上电(sh)脑(PDAsQ是常见的客L(fng)实例。客L(fng)与中间层应用E序交互而且不需要包含Q何与基础l构和数据源相关的功能?/span>
2?span> 中间层服务器 —— 中间层包括:(x)
■ 和客L(fng)以及(qing)业务逻辑层交互的应用E序。如果该应用E序能够与数据源交互Q和低的驱动应用程序接口相比,他将更多地处理像DataSource对象和逻辑q接q些高抽象?/span>
■ 为广泛的应用E序提供基础?strong>应用E序服务?/strong>。这包括理和共享物理连接、事务管理和屏蔽不同JDBC驱动之间的差异。最后一点得编写可UL性良好的应用E序更加单?/span>J2EE服务器可以实现应用程序服务器q一角色。应用程序服务器可以实现被应用程序所使用的高U抽象和直接?/span>JDBC驱动交互?/span>
■ JDBC驱动提供到潜在数据源的连接。每个驱动程序在它所使用的数据源所支持的特性基上实现标准的JDBC应用E序接口。驱动层可以屏蔽标准SQL99语法和数据源所支持的本地语法之间的差异。如果数据源不是一个关pL据库理pȝQ那驱动E序则用应用程序服务器实现关系层?/span>
3?span> 潜在数据?/span> —— x据驻留层。它包括关系型数据库理pȝQ遗留文件系l(legacy file systemsQ,对象型数据库理pȝQ数据仓库,?sh)子表格或者其他Ş式的数据。唯一的要求就是有相应的支?/span>JDBC应用E序接口的驱动程序?/span>
4.5?/span>J2EEq_中的JDBC
J2EElgQ例?/span>JavaServer™ PagesQ?/span>Servlets和企业Java Beans™Q?/span>EJB™Q组Ӟ常常需要?/span>JDBC应用E序接口来访问关pd数据。当J2EElg使用?/span>JDBC应用E序接口以后Q那么可以用相应的容器来管理它们的事务和数据源。这意味着J2EElg开发h员可以不直接使用JDBC应用E序接口的事务管理和数据源管理的工具。具体细节请参?/span>J2EEq_规范?/span>
JDBC3.0在以下领域有所改变Q?/span>
?span> 保存?/span>(Savepoint)支持
d?jin)保存点接口Q此接口包含?jin)新的方法来对一个指定的保存点进行设|,释放或者回滚事务?/span>
?span> 通过q接池重用预处理语句(Prepared Statments)
为部|者提供了(jin)通过q接来控刉处理语句怎样被共享和重用的能力?/span>
?span> 配置q接?/span>
?/span>ConnectionPoolDatasource接口定义?jin)大量属性。这些属性能够描q通过Datasource对象创徏?/span>PooledConnection对象怎样被共享?/span>
?span> 对参数元数据的检?/span>
d?/span>ParameterMetadata接口Q此接口描述?jin)预处理语?/span>(Prepared Statements)的参C敎ͼcd和属性?/span>
?span> 对自动生键的检?/span>
d?jin)从那些能够自动产生值的列来(g)索值的手段?/span>
?span> 打开多个l果?/span>(ResultSet)对象的能?/span>
d?/span>getMoreResults(int)q一Ҏ(gu)Q此Ҏ(gu)提供?jin)一个参敎ͼq一个参数定义了(jin)Statement对象q回?/span>ResultSet对象在返回Q何ƈ发的ResultSet对象之前是否应该被关闭?/span>
?span> 通过名字?/span>CallableStatment对象传递参?/span>
d?jin)一个新Ҏ(gu)Q此Ҏ(gu)可以通过一个字W串来标?/span>CallableStatement对象的参数?/span>
?span> 对可控制游标的支?/span>
d?jin)指?/span>ResultSet对象的可控制游标的能力?/span>
?span> 布尔数据cd
d?jin)数据类?/span>java.sql.Types.BOOLEAN?/span>BOOLEAN?/span>BIT是在逻辑上等L(fng)?/span>
?span> ?/span>Blob?/span>Clob对象中的数据q行内部更新
d?jin)新的方法允?/span>Blob?/span>Clob对象包含的数据被改变?/span>
?span> (g)索和更新?/span>Ref对象引用的对?/span>
d?jin)新的方法来(g)索被Ref对象引用的对象。也d?jin)更新?/span>Ref对象引用的对象的能力?/span>
?span> 更新包含BLOB,CLOB,ARRAY?/span>REFcd的列
?/span>ResultSet接口d?/span>updateBlobQ?/span>updateClobQ?/span>updateArray?/span>updateRefҎ(gu)?/span>
?span> DATALINK/URL数据cd
d?jin)新的数据类?/span>java.sql.Types.DATALINKQ允?/span>JDBC驱动存储和检索对外部数据的引用?/span>
?span> 转化l?/span>(Transform groups)和类型映?/span>
描述?jin){化组的作用和在元数据中这一作用是怎样被反映的?/span>
?span> JDBC SPI(服务提供者接?/span>)和连接器体系l构的关p?/span>
在第19?#8220;和连接器的关p?#8221;中描qC(jin)JDBC SPI和连接器体系l构的关pR?/span>
?span> 数据库元数据(DatabaseMetadata) APIs
Z(jin)(g)?/span>SQLcd体系d?jin)元数据。具体细节参见此规范?/span>
参见W五?#8220;cd接口”中受到这些改变的影响的类和接口的清单?/span>
W二?目标
JDBC应用E序接口是成熟的技术,它早?/span>1997q?/span>1月就被提出。在它最初发行的时候,JDBC应用E序接口注重于提供一个基本的调用U的?/span>SQL数据库的接口。?/span>JDBC2.1规范?/span>2.0可选择包规范则扩展?/span>JDBC的范围。这两个规范包括?jin)对更多高应用E序的支持和使用JDBC应用E序接口的应用程序服务器Z(jin)q行于它们之上的应用E序的性能所要求的新Ҏ(gu)的支持?/span>
JDBC3.0规范的M目标是补上那些在很少斚w的功能缺失。以下的清单列出?/span>JDBC以及(qing)JDBC3.0所Ҏ(gu)的目标和设计原理Q?/span>
1?span> 适合J2EE?/span>J2SEq_
JDBC应用E序接口?/span>Javaq_的组成技术。因此,JDBC3.0应该?/span>Java2企业版和Java2标准版的M方向保持一致?/span>
2?span> ?/span>SQL99保持一?/span>
JDBC应用E序接口提供?jin)?/span>Java~写的应用程序到标准SQL的编E访问。在JDBC2.0开发的q程中,SQL99规范q处在一U变化不定的情况下。现?/span>SQL99规范是一个公开的标准,它包括了(jin)被数据库理pȝ厂商q泛支持的以?qing)那些被很少厂商支持的特性?/span>JDBC3.0的目标就是实?/span>SQL99中那些极可能在将来五q里?x)被q泛支持的特性的子集?/span>
3?span> 合ƈ之前版本的规?/span>
此规范合q了(jin)之前三版JDBC规范以提供一份独立的关于JDBC应用E序接口的规范?/span>
4?span> 提供厂商中立的对普通特性的讉K
JDBC应用E序接口努力实现对被不同厂商普遍支持的特征的高性能的访问。目标是在一定程度上提供本地应用E序能完成的对特性的讉K。因此,JDBC应用E序接口必须_全面和灵zM֏(qing)大量的实现方式?/span>
5?span> l箋保持?/span>SQL的注?/span>
JDBC应用E序接口一直注重于?/span>Java~程语言到关pd数据的访问?/span>JDBC3.0l注重于q一炏V?/span>JDBC3.0不排除和其它技术交互,包括XML?/span>CORBA和非关系型数据,但是最主要的目标将仍然是和关系型数据和SQL交互?/span>
6?span> 为工具和更高层的应用E序接口提供基础
JDBC应用E序接口提供标准的应用程序接口来讉Kq泛的数据源或者保留系l?/span>(Legacy Systems)。通过JDBC应用E序接口的抽象,实现方式的不同之处也变得透明?jin)。这使得JDBC对于那些想生产轻便工具和应用E序的厂商来_(d)是一个不可多得的目标q_?/span>
因ؓ(f)JDBC是一个从Java~程语言?/span>SQL的调用的接口,所以,JDBC应用E序接口也适合作ؓ(f)那些?/span>EJB2.0容器理持久?/span>SQLJQ注QSQLJ是一个与Java~程语言紧密集成的嵌入式SQL版本Q这些高U程序的基础?/span>
7?span> 保持它的?/span>
JDBC应用E序接口被设计ؓ(f)单易懂的接口Q但是通过它能够编写更复杂的实体。这一目标是通过定义许多z,拥有单一功能的方法来代替通过标志参数控制的少量的复杂而拥有多功能的方法来实现的?/span>
8?span> 增强可靠性、实用性和灉|?/span>
可靠性、实用性和灉|性是J2EE?/span>J2SEq_的主题,也是Javaq_未来的方向?/span>JDBC3.0应用E序接口通过增强对若q领域的支持体现?jin)这些主题,q些领域包括资源理Q通过逻辑q接重用预处理语句(prepared statementsQ以?qing)错误处理?/span>
9?span> 保留对现有应用程序和驱动E序的向后兼Ҏ(gu)?/span>
现有的支?/span>JDBC技术的驱动和用这些驱动的应用E序在支?/span>JDBC3.0?/span>Java虚拟Z必须能够l箋工作。对于那些只使用?jin)先前版本?/span>JDBC应用E序接口的特性,但是没有使用JDBC2.0反对的特性的应用E序Q将不需要Q何改变而正常运行。现有的应用E序UL?/span>JDBC3.0技术上是g单的事情?/span>
10?span>允许对连接器的向前兼?/span>
q接器的体系l构定义?jin)一个标准的Ҏ(gu)来打包和部v资源适配器。这使得J2EE容器可以通过外部资源集成q接器的q接、事务和安全理?/span>
JDBC3.0应用E序接口提供?jin)?/span>JDBC驱动E序UL到连接器体系的途径。这使得那些使用JDBC技术的产品的厂商更多地转移C用连接器应用E序接口Q?/span>Connector APIQ成为可能。希望这些厂商会(x)在他们现有的数据源工具上写上“资源理器封?#8221;Q这栯些工具就能够在连接器框架中被重用?/span>
11?span> 清楚地规定需?/span>
JDBC规范的需求应该是明确的和Ҏ(gu)识别的?/span>JDBC3.0规范?/span>Javadoc文档规定?jin)哪些特性是必需 的,而哪些特性是可选的?/span>1.1 JDBC应用E序接口
JDBC™应用E序接口提供?jin)?/span>Java™~程语言~程讉K关系数据的能力。通过使用JDBC应用E序接口Q?/span>Java~程语言写的应用E序能够执行SQL表达式,(g)索结果集和把改变传回潜在的数据源?/span>JDBC应用E序接口q可以和在分布式的、异源的环境中的多种数据源进行交互?/span>
JDBC应用E序接口ZX/Open SQL CLIQ?/span>ODBC也是建立在此基础上?/span>JDBC提供?jin)?/span>Java~程语言?/span>X/Open CLI?/span>SQL标准定义的抽象和概念的自然、简单的映射?/span>
自从1997q?/span>1月被提出Q?/span>JDBC应用E序接口pq泛接受和实现。它的灵zL考虑C(jin)大量的实现方式?/span>
1.2 q_
JDBC应用E序接口?/span>Javaq_的一部分Q?/span>Javaq_包括?/span>Java™2标准版(J2SE™Q和Java2™企业版(J2EE™Q?/span>JDBC3.0被分成了(jin)两个包:(x)java.sql?/span>javax.sql。这两个包都被包括到?/span>J2SE?/span>J2EEq_中?/span>
1.3 目标读?/span>
此规范主要面向以下几cM品的厂家Q?/span>
?span> 实现JDBC应用E序接口的驱动程?/span>
?span> 提供驱动层以上的中间层服务的应用E序服务?/span>
?span> 使用JDBC应用E序接口提供服务的工P如应用程序生成器
此规范也打算Z下目的服务:(x)
?span> 在他们的E序中?/span>JDBC应用E序接口的最l用L(fng)一份说明书
?span> 开发基?/span>JDBC应用E序接口的其它应用程序接口的E序员的一个v?/span>
1.4 感谢
作者要感谢以下专家l成员,因ؓ(f)他们为此规范做出?jin)宝늚贡献Q?/span>
?span> ElhamChandler, Informix
?span> Stefan Dessloch, IBM
?span> John Goodson, Merant
?span> Jay Hiremath, Bluestone
?span> Viquar Hussain, Inprise
?span> Prabha Krishna, Oracle
?span> Scott Marlow, Silverstream
?span> Kuldip Pathak, Informix
?span> David Schorow, Compaq
?span> Yeh-Heng Sheng, Informix
?span> Mark Spotswood, BEA
?span> Satish Viswanatham, iPlanet
Maydene Fisher 曄很有耐心(j)地把我们写的东西译成英语?/span>
Jennifer Ball 也从书写方式转变成ؓ(f)我们所希望的用图表表示的方式来表达?/span>
Graham Hamilton, Rick Cattell, Mark Hapner, Seth White以及(qing)许多其他曄?/span>JDBC技术工作的?/span>
使此规范的出版成为可能?/span>