快速业务通道

关于Java Database Connectivity您不知道的5件事:提升您和JDBC API的关系 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
求一个可滚动的 ResultSet 的过程。事实上,在此您将为 createStatement() 使用第二个参数。您不需要为第二个参数指定 ResultSet.CONCUR_READ_ONLY,只需要发送 ResultSet.CONCUR_UPDATEABLE 即可,如清单 5 所示:

清单 5. 我想要一个可更新的 ResultSet

Statement stmt = con.createStatement(              ResultSet.TYPE_SCROLL_INSENSITIVE,              ResultSet.CONCUR_UPDATEABLE); ResultSet scrollingRS = stmt.executeQuery("SELECT * FROM whatever");

假设您的驱动程序支持可更新光标(这是 JDBC 2.0 规范的另一个特性,这是大多数 “现实” 数据库所支持的),您可以更新 ResultSet 中任何给定的值,方法是导航到该行并调用它的一个 update...() 方法(如清单 6 所示),如同 ResultSet 的 get...()方法。在 ResultSet 中 update...() 对于实际的列类型是超负荷的。因此要更改名为 “PRICE” 的浮点列,调用 updateFloat("PRICE")。然而,这样做只能更新 ResultSet 中的值。为了将该值插入支持它的数据库中,可以调用 updateRow()。如果用户改变调整价格的想法,调用 cancelRowUpdates() 可以停止所有正在进行的更新。

清单 6. 一个更好的方法

Statement stmt = con.createStatement(              ResultSet.TYPE_SCROLL_INSENSITIVE,              ResultSet.CONCUR_UPDATEABLE); ResultSet scrollingRS =    stmt.executeQuery("SELECT * FROM lineitem WHERE id=1"); scrollingRS.first(); scrollingRS.udpateFloat("PRICE", 121.45f); // ... if (userSaidOK)    scrollingRS.updateRow(); else    scrollingRS.cancelRowUpdates();

JDBC 2.0 不只支持更新。如果用户想要添加一个全新的行,不需要创建一个新 Statement 并执行一个 INSERT,只需要调用 moveToInsertRow(),为每个列调用 update...(),然后调用 insertRow() 完成工作。如果没有指定一个列值,数据库会默认将其看作 SQL NULL(如果数据库模式不允许该列为 NULL,这可能触发 SQLException)。

当然,如果 ResultSet 支持更新一行,也必然支持通过 deleteRow() 删除一行。

差点忘了强调一点,所有这些可滚动性和可更新性都适用于 PreparedStatement(通过向 prepareStatement() 方法传递参数),由于一直处于 SQL 注入攻击的危险中,这比一个规则的 Statement 好很多。

关于Java Database Connectivity您不知道的5件事:提升您和JDBC API的关系(3)

时间:2010-11-03 IBM Ted Neward

4. Rowsets

既然所有这些功能在 JDBC 中大约有 10 年了,为什么大多数开发人员仍然迷恋向前滚动 ResultSet 和不连贯访问?

罪魁祸首是可伸缩性。保持最低的数据库连接是支持大量用户通过 Internet 访问公司网站的关键。因为滚动和/或更新 ResultSet 通常需要一个开放的网络连接,而许多开发人员通常不(或不能)使用这些连接。

幸好,JDBC 3.0 引入另一种解决方案让您同样可以做很多之前使用 ResultSet 方可以做的事情,而不需要数据库连接保持开放状态。

从概念上讲,Rowset 本质上是一个 ResultSet,但是它支持连接模型或断开模型,您所需要做的是创建一个 Rowset,将其指向一个 ResultSet,当它完成自我填充之后,将其作为一个 ResultSet,如清单 7 所示:

清单 7. Rowset 取代 ResultSet

Statement stmt = con.createStatement(              ResultSet.TYPE_SCROLL_INSENSITIVE,              ResultSet.CONCUR_UPDATEABLE); ResultSet scrollingRS = stmt.execu

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号