公告
问题虚拟背景:A项目组要实现一个基于Sql Server的应用,但工作环境只安装有MySql(公司对开源比较看好: )),而且客户有可能会转移到Oracle数据库环境。要求应用具有数据库移植能力和快速更换能力,使应用在工作环境调试成功后能迅速转移到客户的Sql Server环境,而且将来可以方便地转向Oracle。
Andy提出的可用方案:1、使用标准JDBC2、使用抽象类定义数据访问单元3、定义具体数据源访问单元继承2中接口
代码示例:定义数据访问单元抽象类,包含数据访问逻辑
定义具体数据源访问单元
在调用数据访问层时,可以声明一个DataManager的引用,然后在构造器中实例化为具体子类,如:
以后要迁移到另一个数据库(有JDBC驱动),只需定义具体子类继承DataManager(如HsqlDataManager),然后修改资源文件中的DataManager名称(或者将new的类名改一下),不需要修改代码。
这兴许可以解释另一个问题:不赞成使用存储过程,而应将SQL语句嵌在代码中(适用于Java;微软注定.Net不会有平台移植性,数据库大都用Sql Server,所以写存储过程还是比较好的)。(我在我的一个Eclipse RCP项目里使用了这种模式,从Sql server 2000到Hsql,特别方便,看起来感觉也比较好)欢迎大家拍转,^_^
Job代表一个异步操作。要执行的操作在run方法里。
schedule后,任务在平台线程等待队列中排队,等待调度执行。调用方式1:
调用方式2:
DatabaseMetaData?接口有超过150个方法,根据提供的信息可以分为以下几类:
DatabaseMetaData?接口还有超过40个字段,这些字段用于DatabaseMetaData中各种方法的常量返回值。
这一章粗略介绍一下DatabaseMetaData接口,通过举例子对元数据方法进行分类,同时介绍一些新的方法。详细介绍请参考JDBC 4.0 类库规范
JDBC中的ResultSetMetaData接口将在第15章“结果集”介绍。
// con是一个Connection对象 DatabaseMetaData dbmd = con.getMetadata(); int maxLen = dbmd.getMaxTableNameLength();
代码示例 7-1 创建和使用DatabaseMetaData对象
判断是否支持某个特性的方法如下:
查看特性支持级别的方法:
方法返回一个整型的限制数。0表示没有限制或未知限制。
这些方法的完整定义见JDBC 4.0 类库规范(javadoc)。
JDBC 4.0 类库规范中有这些方法更新后的定义。
翻译进度请参考http://www.pgsqldb.org/twiki/bin/view/PgSQL/JDBC4说明书
这一章描述了JDBC类库实现在各个兼容级别要支持的特性。一个JDBC类库实现包含了一个JDBC驱动和底层数据源。兼容性定义了在驱动层之上要实现的特性。
任何没有提到的特性都是可选的。通常,如果底层数据源不支持,驱动不需要实现这个特性。
下列指导原则适合所有级别的兼容性:
与JDBC 1.0 类库兼容的驱动应满足以下条件:
JDBC 2.0类库中不赞成使用的构造器和方法: java.sql.CallableStatement.getBigDecimal(int, int)
java.sql.Date(int, int, int)java.sql.Date.getHours()java.sql.Date.getMinutes()java.sql.Date.getSeconds()java.sql.Date.setHours(int)java.sql.Date.setMinutes(int)java.sql.Date.setSeconds(int)
java.sql.DriverManager.getLogStream()java.sql.DriverManager.setLogStream(PrintStream?)
java.sql.PreparedStatement.setUnicodeStream(int, InputStream?, int)
java.sql.ResultSet.getBigDecimal(int, int)java.sql.ResultSet.getBigDecimal(String, int)java.sql.ResultSet.getUnicodeStream(int)java.sql.ResultSet.getUnicodeStream(String)
java.sql.Time(int, int, int)java.sql.Time.getDate()java.sql.Time.getDay()java.sql.Time.getMonth()java.sql.Time.getYear()java.sql.Time.setDate(int)java.sql.Time.setMonth(int)java.sql.Time.setYear(int)
java.sql.Timestamp(int, int, int, int, int, int, int)
也可参考http://www.pgsqldb.org/twiki/bin/view/PgSQL/兼容性
以下类和接口组成了JDBC类库
java.sql.AutoGeneratedKeys java.sql.Arrayjava.sql.BaseQueryjava.sql.BatchUpdateException java.sql.Blobjava.sql.CallableStatementjava.sql.ClientInfoException java.sql.Column java.sql.Clobjava.sql.Connectionjava.sql.DataSetjava.sql.DataTruncation java.sql.DatabaseMetaDatajava.sql.Date java.sql.Driverjava.sql.DriverManager java.sql.DriverPropertyInfo java.sql.NClobjava.sql.ParameterMetaDatajava.sql.PreparedStatementjava.sql.Query java.sql.QueryObjectFactory java.sql.QueryObjectGeneratorjava.sql.Refjava.sql.ResultSetjava.sql.ResultSetMetaDatajava.sql.RowIdjava.sql.RowIdLifeTime java.sql.Savepointjava.sql.SQLDatajava.sql.SQLDataException java.sql.SQLException java.sql.SQLInputjava.sql.SQLIntegrityConstraintViolationException java.sql.SQLInvalidAuthorizationSpecException java.sql.SQLNonTransientConnectionException java.sql.SQLNonTransientException java.sql.SQLOutputjava.sql.SQLPermissionjava.sql.SQLSyntaxErrorException java.sql.SQLTimeoutException java.sql.SQLTransactionRollbackException java.sql.SQLTransientConnectionException java.sql.SQLTransientException java.sql.SQLXMLjava.sql.SQLWarning java.sql.Statementjava.sql.Structjava.sql.Table java.sql.Time java.sql.Timestamp java.sql.Types java.sql.Update java.sql.Wrapper
下列类和接口是新增的或经过修改的。新的类和接口用粗体标出。
java.sql.AutoGeneratedKeys java.sql.BaseQuery java.sql.Blobjava.sql.CallableStatementjava.sql.ClientInfoException java.sql.Clobjava.sql.Column java.sql.Connectionjava.sql.DatabaseMetaDatajava.sql.NClob java.sql.PreparedStatementjava.sql.Query java.sql.QueryObjectFactory java.sql.QueryObjectGenerator java.sql.ResultSetjava.sql.RowId java.sql.RowIdLifeTime java.sql.SQLDataException java.sql.SQLExceptionjava.sql.SQLIntegrityConstraintViolationException java.sql.SQLInvalidAuthorizationSpecException java.sql.SQLNonTransientConnectionException java.sql.SQLNonTransientException java.sql.SQLSyntaxErrorException java.sql.SQLTimeoutException java.sql.SQLTransactionRollbackException java.sql.SQLTransientConnectionException java.sql.SQLTransientException java.sql.SQLXML java.sql.SQLWarningjava.sql.Statementjava.sql.Table java.sql.Typesjava.sql.Update java.sql.Wrapper javax.sql.CommonDataSource javax.sql.StatementEvent javax.sql.StatementEventListener
图5-1显示了java.sql包中关键类和接口之间的交互和关系,以及用于创建语句、设置参数、检索结果的方法。
图5-1 java.sql包中主要类和接口之间的关系
javax.sql.CommonDataSourcejavax.sql.ConnectionEvent javax.sql.ConnectionEventListenerjavax.sql.ConnectionPoolDataSourcejavax.sql.DataSourcejavax.sql.PooledConnectionjavax.sql.RowSetjavax.sql.RowSetEvent javax.sql.RowSetInternaljavax.sql.RowSetListenerjavax.sql.RowSetMetaDatajavax.sql.RowSetReaderjavax.sql.RowSetWriterjavax.sql.StatementEvent javax.sql.StatementEventListenerjavax.sql.XAConnectionjavax.sql.XADataSource
图5-2,图5-3,图5-4和图5-5显示了以下功能领域中关键类和接口之间的关系:DataSource对象,池化连接,分布式事务,行集。
图5-2 javax.sql.DataSource和java.sql.Connection之间的关系
图5-3 连接池化过程中涉及的关系
图5-4 分布式事务支持中涉及的关系
图5-5 行集涉及的关系
-- Main.Andyluo - 6 Oct 2005
Job代表一个异步操作。要执行的操作写在run方法里。
-- Main.Andyluo - 6 Oct 2005也可参照http://www.pgsqldb.org/twiki/bin/view/PgSQL/类和接口
==========================================================
概述
JDBC类库使得Java程序可以访问多个数据源,但在大多数情况下,这个数据源是关系数据库,并且通过SQL访问。然而,实现JDBC技术的驱动也可以基于其它的数据源,包括遗留文件系统和面向对象的系统。JDBC类库的一个主要目的就是提供一个应用程序访问多种数据源的标准接口。
这一章介绍JDBC类库的一些关键概念,并描述JDBC应用的两个通用环境及其中的功能实现。两层和三层模型都是能被实现在多个物理配置上的逻辑模型。
=================================================
4.1 创建连接
JDBC类库中的Connection接口代表了底层数据源的一个连接。
在典型场景中,JDBC应用程序使用两种机制连接到数据源:
1.DriverManager --- 这个类在JDBC 1.0中引入,它使用硬编码的URL来加载驱动。
2.DataSource --- 这个接口在JDBC 2.0可选包中引入。它优于DriverManager方式,因为它隐藏了数据源的详细信息。我们通过设置DataSource的属性来标明它代表的数据源。当getConnection方法被调用时,DataSource对象会返回一个对应的连接。我们可以通过改变DataSource的属性来使它指向另一个数据源,而不是改变程序代码。而且,即使DataSource的实现改变了,使用它的应用程序代码也不需要改变。
JDBC类库定义了两个DataSource的扩展来支持企业级应用,如下:
1.ConnectionPoolDataSource --- 支持物理连接的缓存和重用,这样可以提高应用的性能和可伸缩性。
2.XADataSource --- 提供可以使用在分布式事务中的连接。
=========================================================
4.2 执行SQL语句和操纵结果
连接建立后,我们可以使用JDBC类库对目标数据源进行查询和更新。JDBC类库提供了对大多数SQL2003通用特性的支持。由于各个厂商可能要支持不同的特性,JDBC类库提供了一个DatabaseMetadata接口。应用可以通过这个接口了解数据源是否支持某个特性。JDBC类库也定义了转义语义来支持特定厂商非标准的特性。转义语义使得我们可以访问与本地程序相同的SQL特性集,同时保持应用的可移植性。
应用通过使用Connection接口来设置事务属性和创建Statement, PreparedStatement和CallableStatement. 这些statement被用来执行SQL语句和检索结果。ResultSet接口封装了SQL查询的结果。语句也可以批处理,这样应用可以通过一次单元执行提交对数据源的多次更新。
RowSet接口扩展了ResultSet接口。它提供了一个比标准结果集功能更多的表数据容器。RowSet对象是Java Beans组件,它可以在中断数据库连接的情况下操纵数据。例如,一个RowSet实现可以被序列化从而传送到网络上,这对于吞吐量小的客户端尤为有用,因为这可以省去加载JDBC驱动和建立JDBC连接的开销。RowSet还可以使用定制的阅读器(Reader)来访问表格数据(不仅仅是关系数据库的数据)。甚者,RowSet对象可以在中断数据库连接的情况下更新数据,并在连接正常时通过一个定制的书写器(Writer)将更新写入数据源。
4.2.1 对SQL高级数据类型的支持
JDBC类库定义了SQL数据类型到JDBC数据类型的标准映射。映射也包含了对SQL2003高级数据类型如BLOB,CLOB,ARRAY,REF,STRUCT和DISTINCT的支持。JDBC驱动也可以实现多个用户自定义类型(UDTs,user-defined types)的映射,在这里,每个UDT映射到Java中的一个类。
JDBC类库也提供对外部数据的支持,例如数据源外部的一个文件。
========================================
4.3 两层模型
两层模型将功能分配到客户端和服务器端,如图4-1.
FIGURE 4-1 两层模型
客户端包含了应用和一个或多个JDBC驱动,这些应用负责下列内容:
* 表示逻辑
* 业务逻辑
* 对多语句事务(multiple-statement transactions)或分布式事务的管理
* 资源管理
在这个模型中,应用直接跟JDBC驱动打交道,包括建立和管理物理连接,以及处理底层数据源的相关细节。应用可以通过对数据源实现的了解来使用它的非标准特性或者提升性能。
模型的缺点:
* 将表示逻辑、业务逻辑和基础设施、系统级别的功能混淆在一起,不利于维护。
* 由于被绑定到特定的数据库,应用很难被移植。需要连接到多个数据库的应用要注意各个厂商实现的区别。
* 缺少可伸缩性。典型地,应用将从始至终占有一个或多个物理连接,缺少对并发应用的支持。在这个模型中,性能、可伸缩性和可靠性问题都是由JDBC驱动和底层数据源处理的。如果应用要跟多个驱动打交道,它需要注意每个驱动/数据源对是怎么处理这些问题的。
======================================================
4.4 三层模型
三层模型引入了中间层服务器来管理业务逻辑和基础结构,如图4-2.
FIGURE 4-2 三层模型
这个架构为企业级应用提供了更好的性能、可伸缩性和可靠性。功能划分如下:
1.客户端 --- 只负责表示逻辑,处理人机交互。Java应用程序、网页浏览器和PDA等都是典型的客户端。客户端与中间层应用交互,它不需要了解底层的基础结构和数据源实现。
2.中间层服务器 --- 中间层包含:
* 一些应用程序。这些应用负责跟客户端打交道和实现业务逻辑。如果应用包含与数据源的交互,它应该使用高层抽象,例如DataSource对象和逻辑连接,而不是底层的驱动程序类库。
* 一个应用服务器。提供支持大部分应用的基础结构。这可能包含管理和池化物理连接、管理事务和掩盖不同JDBC驱动的细节。最后一点使得应用更容易被移植。应用服务器可以使用J2EE服务器。它应该直接和JDBC驱动交互和提供高层应用使用的功能抽象。
* 一个或多个JDBC驱动。提供与底层数据源的连接,每个驱动使用底层数据源支持的特性来实现标准JDBC类库。驱动层需要掩盖SQL2003标准和底层数据源语言的不同。如果数据源不是一个关系型数据库管理系统(DBMS),那么驱动要实现应用服务器使用的关系层。
3.底层数据源 --- 存放数据的层。包含关系型数据库管理系统(relational DBMS),遗留文件系统,面向对象的DBMS,数据仓库,报表或者其他包装和表示数据的方式,只要有对应的支持JDBC类库的驱动。
===================================================
4.5 J2EE平台中的JDBC
J2EE组件,例如JSP,Servlets和EJB,经常需要利用JDBC类库访问关系型数据。当在J2EE组件里使用JDBC类库时,容器可能帮你管理事务和数据源(译者注:Container Managed Persistence,容器管理持久性)。这样,J2EE组件开发者就不直接使用JDBC类库的事务和数据源管理功能。详情请见J2EE平台规范。
=====================================================概述
这一章介绍JDBC类库的一些关键概念,并描述JDBC应用的两个通用环境及其中的功能实现。两层和三层模型都是能被实现在多个物理配置上的逻辑模型。=====================================================4.1 创建连接JDBC类库中的Connection接口代表了底层数据源的一个连接。
在典型场景中,JDBC应用程序使用两种机制连接到数据源:1.DriverManager --- 这个类在JDBC 1.0中引入,它使用硬编码的URL来加载驱动。2.DataSource --- 这个接口在JDBC 2.0可选包中引入。它优于DriverManager方式,因为它隐藏了数据源的详细信息。我们通过设置DataSource的属性来标明它代表的数据源。当getConnection方法被调用时,DataSource对象会返回一个对应的连接。我们可以通过改变DataSource的属性来使它指向另一个数据源,而不是改变程序代码。而且,即使DataSource的实现改变了,使用它的应用程序代码也不需要改变。
JDBC类库定义了两个DataSource的扩展来支持企业级应用,如下:1.ConnectionPoolDataSource --- 支持物理连接的缓存和重用,这样可以提高应用的性能和可伸缩性。2.XADataSource --- 提供可以使用在分布式事务中的连接。======================================================4.2 执行SQL语句和操纵结果 连接建立后,我们可以使用JDBC类库对目标数据源进行查询和更新。JDBC类库提供了对大多数SQL2003通用特性的支持。由于各个厂商可能要支持不同的特性,JDBC类库提供了一个DatabaseMetadata接口。应用可以通过这个接口了解数据源是否支持某个特性。JDBC类库也定义了转义语义来支持特定厂商非标准的特性。转义语义使得我们可以访问与本地程序相同的SQL特性集,同时保持应用的可移植性。
应用通过使用Connection接口来设置事务属性和创建Statement,PreparedStatement和CallableStatement. 这些statement被用来执行SQL语句和检索结果。ResultSet接口封装了SQL查询的结果。语句也可以批处理,这样应用可以通过一次单元执行提交对数据源的多次更新。
4.2.1 对SQL高级数据类型的支持 JDBC类库定义了SQL数据类型到JDBC数据类型的标准映射。映射也包含了对SQL2003高级数据类型如BLOB,CLOB,ARRAY,REF,STRUCT和DISTINCT的支持。JDBC驱动也可以实现多个用户自定义类型(UDTs,user-defined types)的映射,在这里,每个UDT映射到Java中的一个类。
========================================4.3 两层模型 两层模型将功能分配到客户端和服务器端,如图4-1. FIGURE 4-1 两层模型 客户端包含了应用和一个或多个JDBC驱动,这些应用负责下列内容: * 表示逻辑 * 业务逻辑 * 对多语句事务(multiple-statement transactions)或分布式事务的管理 * 资源管理
模型的缺点: * 将表示逻辑、业务逻辑和基础设施、系统级别的功能混淆在一起,不利于维护。 * 由于被绑定到特定的数据库,应用很难被移植。需要连接到多个数据库的应用要注意各个厂商实现的区别。 * 缺少可伸缩性。典型地,应用将从始至终占有一个或多个物理连接,缺少对并发应用的支持。在这个模型中,性能、可伸缩性和可靠性问题都是由JDBC驱动和底层数据源处理的。如果应用要跟多个驱动打交道,它需要注意每个驱动/数据源对是怎么处理这些问题的。
======================================================4.4 三层模型 三层模型引入了中间层服务器来管理业务逻辑和基础结构,如图4-2. FIGURE 4-2 三层模型 这个架构为企业级应用提供了更好的性能、可伸缩性和可靠性。功能划分如下: 1.客户端 --- 只负责表示逻辑,处理人机交互。Java应用程序、网页浏览器和PDA等都是典型的客户端。客户端与中间层应用交互,它不需要了解底层的基础结构和数据源实现。
2.中间层服务器 --- 中间层包含: * 一些应用程序。这些应用负责跟客户端打交道和实现业务逻辑。如果应用包含与数据源的交互,它应该使用高层抽象,例如DataSource对象和逻辑连接,而不是底层的驱动程序类库。 * 一个应用服务器。提供支持大部分应用的基础结构。这可能包含管理和池化物理连接、管理事务和掩盖不同JDBC驱动的细节。最后一点使得应用更容易被移植。应用服务器可以使用J2EE服务器。它应该直接和JDBC驱动交互和提供高层应用使用的功能抽象。 * 一个或多个JDBC驱动。提供与底层数据源的连接,每个驱动使用底层数据源支持的特性来实现标准JDBC类库。驱动层需要掩盖SQL2003标准和底层数据源语言的不同。如果数据源不是一个关系型数据库管理系统(DBMS),那么驱动要实现应用服务器使用的关系层。
===================================================4.5 J2EE平台中的JDBC J2EE组件,例如JSP,Servlets和EJB,经常需要利用JDBC类库访问关系型数据。当在J2EE组件里使用JDBC类库时,容器可能帮你管理事务和数据源(译者注:Container Managed Persistence,容器管理持久性)。这样,J2EE组件开发者就不直接使用JDBC类库的事务和数据源管理功能。详情请见J2EE平台规范。
其它章节的翻译参见:
http://www.pgsqldb.org/twiki/bin/view/PgSQL/JDBC4%E8%AF%B4%E6%98%8E%E4%B9%A6
=================================================================
序言
这个文档巩固了下面几个规范的内容:
“JDBC: Java的SQL类库”
“JDBC 2.1 类库”
“JDBC 2.0 标准扩展类库”
“JDBC 3.0 规范”
文档介绍了JDBC 4.0 类库的新特征和一些增强的特征。文档根据不同特征划分章节,这样可以更方便了解JDBC 4.0和3.0的不同之处。
读者如果想了解JDBC类库的详细信息,可以参考JDBC的类库文档(Javadoc),该文档可以由以下链接获得:
http://java.sun.com/products/jdbc
==========================================================================
介绍
1.1 JDBC类库
JDBC类库提供了通过Java语言访问关系数据库的能力。Java程序通过JDBC可以执行SQL语句,对获取的数据进行处理,并将变化了的数据存回数据库。在分布式异构环境中,我们还可以通过JDBC操纵多个数据源。
JDBC类库基于X/Open SQL通用语言接口(CLI),ODBC也基于此。JDBC提供了一个使用方便的映射方案:从Java语言到X/Open 通用语言接口和SQL标准的抽象实体及概念的映射。
自1997年的产生至今,JDBC类库已被广泛的接受和实现。类库的灵活性使得它可以有很多个具体实现。
1.2 平台
JDBC类库是Java平台的一部分。4.0版分为两个包:java.sql 和 javax.sql。这两个包都包含在JSE(Java桌面版)和JEE(Java企业版)中。
1.3 适合读者
该文档主要面向下列产品的开发者:
1. JDBC驱动程序
2. 基于数据库驱动提供三层架构服务的应用服务器
3. 使用JDBC类库来提供服务的工具
该文档想达到以下目的:
1.对使用JDBC类库的开发者的一个介绍
2.作为开发基于JDBC的类库的起始点
===============================================================
目标
2.1 历史
2.2 JDBC 4.0 之目标
---1.与JEE和JSE平台相处融洽
---2.与SQL:2003一致
---3.巩固前述四个规范
---4.提供中立于厂商的通用功能
---5.主要只针对SQL类型的数据源
---6.提供高层类库和工具的基础设施
---7.保持简单
---8.加强可靠性、可用性和可伸缩性
---9.保持向后兼容性
---10.与JDBC行集(RowSet)紧密联系
---11.与连接器架构(Connectors)兼容
---12.清晰描述JDBC需求
==================================================================
新特性概览
3.1 变更概览
JDBC 4.0 类库在以下领域注入了变化和新的元素:
1.自动加载java.sql.Driver
DriverManager.getConnection方法被修改以利用JSE的服务提供者机制来自动加载JDBC驱动。这样就不需要调用Class.forName方法了。
2.类库使用更容易
添加了标准JDBC注释。支持数据集(DataSet),使Java应用调用SQL数据源更加方便。
3.ROWID数据类型
添加了java.sql.RowID数据类型,使得JDBC程序可以访问SQL ROWID。
4.支持本地字符集转换(National Character Set Conversion)
添加了一些JDBC类型:NCHAR, NVARCHAR, LONGVARCHAR, NCLOB。对应的方法setNString, setNCharacterStream, setNClob也被添加到PreparedStatement接口中。
5.增强了对BLOB和CLOB的支持
Connection接口添加了生产BLOB,CLOB和NCLOB对象的方法。PreparedStatement接口添加了通过InputStream插入BLOB的方法和使用Reader插入CLOB,NCLOB的方法。Blob, Clob和NClob现在可以通过free方法释放资源。
6.SQL/XML和XML支持
SQL2003引入了用SQL表达XML数据的概念。一些类库被添加进来以支持应用对这些数据的访问。
7.包装器(Wrapper)模式
添加了解包JDBC实现的能力,使开发者可以利用在厂商实现中提供的非标准JDBC方法。
8.加强的SQLException
添加对JSE链式异常的支持。SQLException现在支持Iterable接口,所以我们可以在for-each循环里读取SQLExceptions。新添加了两类SQL异常:SQLTransientException和SQLNonTransientException。每个类都提供映射到普通SQLState类型值(译者注:SQLState?)的子类。
9.连接管理
Connection和Statement接口得到了增强,以利于对连接状态的跟踪,并增加在池环境中管理Statement对象的灵活性。
10.JDBC类库的变化
下面的JDBC接口被修改:
---10.1 Connection
添加了下列方法:createBlob, createClob, createNClob, createQueryObject, isValid, createXML, getClientInfo, setClientInfo。
---10.2 CallableStatement
添加了下列方法:getRowId, setRowId, getNClob, setNString, setNCharacterStream, setNClob, getSQLXML, setSQLXML。重载了setClob和setBlob方法。
---10.3 DatabaseMetaData
添加了下列方法:getRowIdLifetime, autoCommitFailureClosesAllResultSets, providesQueryObjectGenerator, getClientInfoProperties, supportsStoredFunctionsUsingCallSyntax. 重载了getSchemas方法。
---10.4 PreparedStatement
添加了下列方法:setRowId, setNString, setNCharacterStream, setSQLXML, isPoolable, setPoolable, setNClob。重载了setClob和setBlob方法。
---10.5 ResultSet
添加了下列方法:getHoldability, getRowId, updateRowID, getNClob, isClosed, updateNString, getSQLXML, updateSQLXML, updateNClob。
---10.6 Statement
添加了isClosed和getResultSetHoldability方法。
---10.7 DataSource
添加了createQueryObject方法。
---10.8 PooledConnection
添加了addStatementEventListener和removeStatementEventListener方法。
====================================================================
概览
JDBC类库使得Java程序可以访问多个数据源,但在大多数情况下,这个数据源是关系数据库,并且通过SQL访问。然而,实现JDBC技术的驱动也可以基于其它的数据源,包括遗留文件系统和面向对象的系统。
JDBC类库的主要目的就是提供应用程序访问多种数据源的标准接口。
这一章介绍JDBC类库的一些关键概念,并描述JDBC应用的两个通用环境及其中的功能实现。
2.DataSource --- 这个接口在JDBC 2.0可选包中引入。它优于DriverManager方式,因为它隐藏了数据源的详细信息。我们通过设置DataSource的属性来标明它代表的数据源。当getConnection方法被调用时,DataSource对象会返回一个对应的连接。我们可以通过改变DataSource的属性来使它指向另一个数据源,而不是改变程序代码。而且,如果DataSource的实现改变了,使用它的应用程序代码不需要改变。
JDBC类库也定义了两个DataSource的扩展,用来支持企业级应用,如下: