jdbc 3.0 特性介绍

已经步入4.0时代了。不过依然有用3.0的用户。了解一下也是好的。

1.元数据 api
元数据 api 已经得到更新,databasemetadata 接口现在可以检索 sql 类型的层次结构,一种新的 parametermetadata 接口可以描述 preparedstatement 对象中参数的类型和属性。
callablestatements 中已命名的参数
在 jdbc 3.0 之前,设置一个存储过程中的一个参数要指定它的索引值,而不是它的名称。callablestatement 接口已经被更新了,现在您可以用名称来指定参数。

2.数据类型的改变
jdbc 所支持的数据类型作了几个改变,其中之一是增加了两种新的数据类型。
为了便于修改 clob(character large object,字符型巨对象)、blob(binary large object,二进制巨对象)和 ref(sql 结构)类型的值,同名的数据类型接口都被更新了。接下来的是,因为我们现在能够更新这些数据类型的值,所以 resultset 接口也被修改了,以支持对这些数据类型的列的更新,也包括对 array 类型的更新。
增加的两种新的数据类型是 java.sql.types.datalink 和 java.sql.types.boolean。新增的数据类型指的是同名的 sql 类型。datalink 提供对外部资源的访问或 url,而 boolean 类型在逻辑上和 bit 类型是等同的,只是增加了在语义上的含义。datalink 列值是通过使用新的 geturl() 方法从 resultset 的一个实例中检索到的,而 boolean 类型是通过使用 getboolean() 来检索的。
3.检索自动产生的关键字
为了解决对获取自动产生的或自动增加的关键字的值的需求,jdbc 3.0 api 现在将获取这种值变得很轻松。要确定任何所产生的关键字的值,只要简单地在语句的 execute() 方法中指定一个可选的标记,表示您有兴趣获取产生的值。您感兴趣的程度可以是 statement.return_generated_keys,也可以是 statement.no_generated_keys。在执行这条语句后,所产生的关键字的值就会通过从 statement 的实例方法 getgeneratedkeys() 来检索 resultset 而获得。resultset 包含了每个所产生的关键字的列。

示例代码. 检索自动产生的关键字


statement stmt = conn.createstatement();
// obtain the generated key that results from the query.
stmt.executeupdate("insert into authors " +
"(first_name, last_name) " +
"values (george, orwell)",
statement.return_generated_keys);
resultset rs = stmt.getgeneratedkeys();
if ( rs.next() ) {
// retrieve the auto generated key(s).
int key = rs.getint();}
4.resultset 可保持性
一个可保持的游标(或结果),就是说该游标在包含它的事务被提交后,也不会自动地关闭。jdbc 3.0 增加了对指定游标可保持性的支持。要制定您 resultset 的可保持性,您必须在使用 createstatement()、preparestatement() 或 preparecall() 方法准备编写一条语句时就这么做。可保持性可以是下面常量中的一个。


hold_cursors_over_commit

resultset 对象(游标)没有被关闭;它们在提交操作得到显式的或隐式的执行以后仍保持打开的状态。


close_cursors_at_commit

resultset 对象(游标)在提交操作得到显式的或隐式的执行后被关闭。


总的来说,在事务提交之后关闭游标操作会带来更好的性能。除非您在事务结束后还需要该游标,否则您最好在执行提交操作后将其关闭。因为规范没有规定 resultset 的缺省的可保持性,所以具体行为还将取决于执行情况。然而,我希望在可以使用 jdbc 3.0 驱动程序时,大多数执行在事务结束后仍旧会关闭游标。

5.返回多重结果
jdbc 2 规范的一个局限是,在任意时刻,返回多重结果的语句只能打开一个 resultset。作为 jdbc 3.0 规范中改变的一个部分,规范将允许 statement 接口支持多重打开的 resultsets。然而,重要的是 execute() 方法仍然会关闭任何以前 execute() 调用中打开的 resultset。所以,要支持多重打开的结果,statement 接口就要加上一个重载的 getmoreresults() 方法。新式的方法会做一个整数标记,在 getresultset() 方法被调用时指定前一次打开的 resultset 的行为。接口将按如下所示定义标记:


close_all_results

当调用 getmoreresults() 时,所有以前打开的 resultset 对象都将被关闭。


close_current_result

当调用 getmoreresults() 时,当前的 resultset 对象将被关闭。


keep_current_result

当调用 getmoreresults() 时,当前的 resultset 对象将不会被关闭。


示例代码. 如何处理多重打开结果

连接池
jdbc 3.0 定义了几个标准的连接池属性。开发人员并不需要直接地用 api 去修改这些属性,而是通过应用服务器或数据存储设备来实现。由于开发人员只会间接地被连接池属性的标准化所影响,所以有利之处并不明显。然而,通过减少厂商特定设置的属性的数量并用标准化的属性来代替它们,开发人员能更容易地在不同厂商的 jdbc 驱动程序之间进行交换。另外,这些属性还允许管理员很好地优化连接池,从而使应用程序的性能特点发挥到极致。这些属性如下表所示。


属性名称描述


maxstatements

连接池可以保持打开的语句数目。


initialpoolsize

当池初始化时可以建立的物理连接的数目。


minpoolsize

池可以包含的物理连接的最小数目。


maxpoolsize

池可以包含的物理连接的最大数目。零指没有最大值。


maxidletime

持续时间,以秒计,指一个闲置的物理连接在被关闭前可以在池中停留的时间。零指没有限制。


propertycycle

间隔时间,以秒计,指连接池在执行其属性策略前可以等待的时间。


6.预备语句池
除了改进对连接池的支持以外,现在也能缓冲预备语句了。预备语句允许您用一条常用的 sql 语句然后预编译它,从而在这条语句被多次执行的情况下大幅度地提升性能。在另一个方面,建立一个 preparedstatement 对象会带来一定量的系统开销。所以,在理想情况下,这条语句的生命周期应该足够长,以补偿它所带来的系统开销。追求性能的开发人员有时候为了延长 preparedstatement 对象的生命周期会不惜扭曲他们的对象模型。jdbc 3.0 让开发人员不再为此担心,因为数据源层现在负责为预备语句进行缓存。
清单 3 将示范如何利用 jdbc 对预备语句池的支持。细心的读者可能会发现清单中的语句和普通 jdbc 2 的代码没什么两样。这是因为语句的缓冲是完全在内部实现的。这就意味着,在 jdbc 3.0 下,您现存的代码可以自动利用语句池。但可惜的是,这也意味着您将不能控制哪个预备语句将被缓冲,而只能控制被缓存的语句的数目。
清单 3. 缓冲预备语句


string insert_book_query =
"insert into booklist " +
"(author, title) " +
"values (?, ?) ";
connection conn = apooledconnection.getconnection();
preparedstatement ps = conn.preparestatement(insert_book_query);
ps.setstring(1, "orwell, george");
ps.setstring(2, "1Array84");
ps.executeupdate();
ps.close();
conn.close();
// ...
conn = apooledconnection.getconnection();
// since the connection is from a pooledconnection, the data layer has
// the option to retrieve this statement from its statement pool,
// saving the vm from re-compiling the statement again.
preparedstatement cachedstatement = conn.preparestatemet(insert_book_query);
// ...

7. 在您的事务中使用 savepoint
也许在 jdbc 3.0 中最令人兴奋的附加特点就是 savepoint 了。jdbc 2 中的事务支持让开发人员可以控制对数据的并发访问,从而保证持续数据总是保持一致的状态。可惜的是,有时候需要的是对事务多一点的控制,而不是在当前的事务中简单地对每一个改变进行回滚。在 jdbc 3.0 下,您就可以通过 savepoint 获得这种控制。savepoint 接口允许您将事务分割为各个逻辑断点,以控制有多少事务需要回滚。图 1 将说明如何在事务中运用 savepoint。
图 1. savepoint 的直观表示

您或许不是经常需要使用 savepoint。然而,在一种普遍的情况下 savepoint 会发挥作用,那就是您需要作一系列的改变,但是在知道所有的结果之前不能确定应该保留这些改变的哪一部分。清单 4 中的代码示例说明了如何使用 savepoint 接口。
清单 4. 使用 savepoint


conn.setautocommit(false);
// set a conservative transaction isolation level.
conn.settransactionisolation(connection.transaction_serializable);
statement stmt = conn.createstatement();
int rows = stmt.executeupdate(
"insert into authors " +
"(first_name, last_name) values " +
"(lewis, carroll)");
// set a named savepoint.
savepoint svpt = conn.setsavepoint("newauthor");
// ...
rows = stmt.executeupdate(
"update authors set type = fiction " +
"where last_name = carroll");
// ...
conn.rollback(svpt);
// ...
// the author has been added, but not updated.
conn.commit();


string proccall;
// set the value of proccall to call a stored procedure.
// ...callablestatement cstmt = connection.preparecall(proccall);
int retval = cstmt.execute();
if (retval == false) {
// the statement returned an update count, so handle it.
// ...
}
else {
// resultset
resultset rs1 = cstmt.getresultset();
// ...
retval = cstmt.getmoreresults(statement.keep_current_result);
if (retval == true) {
resultset rs2 = cstmt.getresultset();
// both resultsets are open and ready for use.
rs2.next();
rs1.next();
// ...
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录 第1章 JDBC概述 1.1 JDBC简介 1.2 JDBC3.0规范 1.3 JDBC3.0 API的新特点 1.3.1 JDBC 3.0 API的一致性 1.3.2 不赞成的API 1.4 JDBC 3.0中的类和接口 1.4.1 java.sql包中的类和接口及其使用 1.4.2 javax.sql包中所含内容及其使用 1.5 JDBC驱动程序简介 1.5.1 JDBC-ODBC 桥和ODBC驱动程序 1.5.2 本地API部分Java驱动程序 1.5.3 JDBC网络纯Java驱动程序 1.5.4 本地协议纯Java驱动程序 1.5.5 JDBC驱动程序的比较 1.6 本章小结 第2章 JDBC开发环境及配置 2.1 数据库系统 2.1.1 SQL数据库数据库基本操作语句 2.1.2 Microsoft SQL Server数据库设计及ODBC配置 2.1.3 Oracle 数据库的基本说明及其使用简介 2.1.4 MySQL的安装及使用简介 2.2 使用JDBC连接数据库 2.2.1 SQLJ基本知识 2.2.2 用PL/SQL和Java建立应用程序的基本知识 2.2.3 PL/SQL和Java的特性 2.2.4 PL/SQL和Java的实际开发应用实例 2.2.5 Java连接各类数据库的程序代码 2.3 Web应用服务器 2.3.1 Tomcat的安装及系统文件设置 2.3.2 WebSphere简介 2.3.3 WebLogic的安装和配置 2.3.4 Resin的安装与配置 2.4 Java开发环境 2.4.1 JDK设置 2.4.2 JBuilder的配置 2.4.3 Cafe的配置 2.4.4 JDeveloper的配置 2.4.5 FORTE FOR JAVA简介 2.5 JDBC开发调试技巧 2.6 本章小结 第3章 JDBC3.0 API数据库开发基本操作 3.1 数据库用例说明 3.2 与数据库建立连接 3.2.1 JDBC URL 3.2.2 连接件(Connection Event) 3.2.3 连接件监听器(Connection EventListener) 3.3 获取数据库信息 3.3.1 获取数据库详细信息 3.3.2 获取数据库基本信息 3.3.3 获取数据库中表的信息 3.3.4 获取表中各列的信息 3.3.5 获取索引的信息 3.3.6 获取数据库中各种信息的实例 3.4 Statement对象 3.4.1 Statement对象使用基础 3.4.2 获取所有记录 3.4.3 获取指定记录 3.5 修改数据库表 3.5.1 修改数据库表本身 3.5.2 修改数据库表记录 3.6 结果集 3.6.1 结果集的基本操作 3.6.2 获取结果集的信息 3.6.3 使用流获取大型数据 3.6.4 可滚动结果集 3.6.5 可更新结果集 3.7 SQL和Java数据类型转换 3.8 本章小结 第4章 JDBC 3.0 API数据库开发高级操作 4.1 预编译语句 4.1.1 PreparedStatement对象的创建 4.1.2 传递IN参数 4.1.3 传递对象参数 4.1.4 传递大型数据参数 4.2 调用存储过程对象 4.2.1 CallableStatement对象的创建 4.2.2 IN、OUT及INOUT参数的使用 4.2.3 执行CallableStatement Object对象 4.2.4 CallableStatement对象使用实例 4.2.5 SQL Server存储过程编程经验技巧 4.3 成批更新(BatchedUpdate) 4.3.1 成批更新所使用的对象 4.3.2 使用成批更新的实例 4.4 行集合对象 4.4.1 设计时行集合 4.4.2 运行时行集合 4.4.3 非标准JDBC API类的行集 4.4.4 行集合的接口 4.5 务 4.5.1 务提交(Commit) 4.5.2 务使用实例 4.6 JNDI与JDBC API 4.6.1 JDBC数据源 4.6.2 实例 4.7 连接池 4.7.1 连接池数据源(Connection PoolDataSource) 4.7.2 连接池处理件 4.7.3 三层环境下的连接池操作 4.7.4 连接池和DataSource实现 4.7.5 包含连接池的数据源配置 4.7.6 池连接对象对于语句的重新利用 4.7.7 关闭池连接语句 4.7.8 连接池使用实例 4.8 分布式务处理 4.8.1 XADataSource接口和XAConnection接口 4.8.2 务管理器 4.8.3 关闭连接 4.9 例外处理 4.9.1 数据访问警告(SQLWarning) 4.9.2 数据截断(DataTruncation) 4.10 高级数据类型 4.10.1 Java对象类型 4.10.2 SQL3类型 4.10.3 定制类型 4.10.4 实例 4.11 本章小结 第5章 二层结构数据库开发实例 5.1 二层结构原理 5.2 Applet访问数据库实例 5.3 Application访问数据库实例 5.4 使用Jdevelpoer工具的数据库开发实例 5.5 二层结构开发数据库的优缺点 5.6 本章小结 第6章 三层结构数据库开发实例 6.1 三层结构原理 6.2 JSP数据库操作实例 6.3 Servlet数据库操作实例 6.4 JavaBeans操作数据库实例 6.5 三层结构开发数据库的优缺点 6.6 本章小结 第7章 综合开发实例分析 7.1 UML要点与应用 7.1.1 UML定义及组织 7.1.2 UML的概念模型 7.1.3 UML的应用 7.2 用UML建模开发网上商店实例 7.2.1 对网上商店的UML建模分析 7.2.2 网上商店数据库设计 7.2.3 网上商店的程序实现 7.3 用UML建模开发图书馆系统实例 7.4 本章小结 392 第8章 JAVA与XML数据转换 8.1 XML的基础知识 8.1.1 XML的特点 8.1.2 XML文档的结构 8.1.3 XML DTD的建立与使用 8.1.4 文档显示与样式单 8.1.5 XML链接语言 8.1.6 实用XML工具概览 8.2 XML中数据与信息交换 8.2.1 XML数据源 8.2.2 XML在数据库中的应用模式 8.2.3 XML数据交换技术及应用 8.3 使用JSP和XML两种技术建设动态网站 8.3.1 XML存储数据的优点 8.3.2 XML文档中的Picture对象定义 8.3.3 JSP文档与XML的结合 8.4 用XML和XSL生成动态页面 8.4.1 建立标准的数据格式 8.4.2 生成动态XML 8.4.3 用XSL作为模板语言 8.4.4 生成HTML 8.5 从XML到Java代码的数据绑定 8.5.1 访问方式选择 8.5.2 数据绑定 8.5.3 约束数据 8.5.4 从XML获得Java 8.5.5 生成Java代码 8.5.6 完成包 8.6 使用JSP技术生成动态XML 8.6.1 JSP技术概述 8.6.2 使用JSP技术生成动态XML文档的结构 8.7 本章小结 第9章 JDBC程序开发高级技术 9.1 中文处理技术 9.1.1 Java中文处理的理论知识 9.1.2 中文处理的解决方案 9.1.3 中文处理技术程序实例 9.2 数据查询结果的分页显示技术 9.2.1 使用JavaBean和连接池实现数据分页显示 9.2.2 不用连接池不用JavaBean的分页显示 9.2.3 使用JavaBean不使用连接池的分页显示 9.2.4 用JSP和Servlet配合实现分页显示 9.3 数据库图形文件的存取技术 9.3.1 向数据库中存储图形 9.3.2 将数据库的图象二进制数据显示成图片 9.4 Java开发中的其他技术 9.5 本章小结

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值