📄 利用 db2 udb 来使用 java cachedrowset 实现.htm
字号:
crs.getString("firstname") + " " +
crs.getString("lastname"));
}
System.out.println("---------------------------");
</CODE></PRE></TD></TR></TBODY></TABLE>
<P>在上面的代码中,我创建了一个 <CODE><FONT
face=新宋体>com.sun.rowset.CachedRowSetImpl</FONT></CODE> 对象。注意我是如何为
<CODE><FONT face=新宋体>CachedRowsetImpl</FONT></CODE> 对象指定数据库连接信息的。我用
<CODE><FONT face=新宋体>setCommand</FONT></CODE> 方法来指定想要执行的查询。当发出
<CODE><FONT face=新宋体>execute</FONT></CODE> 方法时,就会填充 <CODE><FONT
face=新宋体>CachedRowSetImpl</FONT></CODE>
对象。就是在该方法调用中,我们获得然后再关闭数据库连接。然后我可以在对象中迭代,并使用 getter 方法来抽取和报告其中包含的数据。
</P>
<P>正如前面所提到的, <CODE><FONT face=新宋体>CachedRowSetImpl</FONT></CODE>
对象是可滚动的。下面的代码例示了这项功能,我在该代码中使用 <CODE><FONT
face=新宋体>last()</FONT></CODE> 和 <CODE><FONT
face=新宋体>previous()</FONT></CODE> 方法在数据间前后滚动。 </P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
System.out.println("Showcase scrollability");
// move backwards through rowset
// scroll to last row
crs.last();
// iterate to next row
while (crs.previous())
{
// report current row contents
System.out.println(crs.getRow() + " - " + crs.getString("lastname"));
}
</CODE></PRE></TD></TR></TBODY></TABLE>
<P>方法 <CODE><FONT face=新宋体>first()</FONT></CODE> 和 <CODE><FONT
face=新宋体>next()</FONT></CODE> 也可用于在数据间滚动。 </P>
<P>为了演示从数据库断开连接的能力,示例程序设计为暂停,并让您实际地执行生动的操作,即停止 DB2,以真正了解 <CODE><FONT
face=新宋体>CachedRowSet</FONT></CODE> 功能的优势。在继续操作(由完成 <CODE><FONT
face=新宋体>BufferedReader</FONT></CODE> 对象的一个简单 <CODE><FONT
face=新宋体>readLine</FONT></CODE> 而推动)之前,应用程序等待按下任意键。当示例程序提示您停止 DB2
时,可以在一个新的 DB2 命令行处理器窗口中使用下面的命令: </P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
db2 force applications all
</CODE></PRE></TD></TR></TBODY></TABLE>
<P>然后再使用</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
db2stop
</CODE></PRE></TD></TR></TBODY></TABLE>
<P>来强迫 DB2 的停止。</P>
<P>尽管数据库已经停止,但是下面的代码必须执行:</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
System.out.println("Demonstration of how to update cached row set");
crs.updateString("lastname","Kaur");
// commit changes to cached portion of rowset
crs.updateRow();
System.out.println(crs.getRow() + " - " + crs.getString("lastname"));
</CODE></PRE></TD></TR></TBODY></TABLE>
<P>在上面的代码中,我们更改了当前行条目的 last name 字段。注意,对 <CODE><FONT
face=新宋体>CachedRowSetImpl</FONT></CODE> 对象使用了 <CODE><FONT
face=新宋体>updateRow()</FONT></CODE>
方法,以记录对该对象的更改。在这一时间点,数据库还没有被更新。正如您可以回想起的,数据库 <I
xmlns:dw="http://www.ibm.com/developerworks/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">甚至没有运行</I>。应用程序将提示您启动
DB2。为此,可以从 DB2 命令行处理器发出下面的命令: </P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
db2start
</CODE></PRE></TD></TR></TBODY></TABLE>
<P>在 DB2 启动之后,按任意键继续示例应用程序。</P>
<P>此时,下面的代码将会运行,这将有效地在数据库中同步更改。</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
crs.acceptChanges();
</CODE></PRE></TD></TR></TBODY></TABLE>
<P>通过对 cachetbl 执行一个选择查询,可以确认数据库实际上已经更新,如 图 1所示: </P>
<P><B>图 1. 确认更新更改已经与数据库同步</B><BR><IMG height=200 alt=确认更新更改已经与数据库同步
src="利用 DB2 UDB 来使用 Java CachedRowSet 实现.files/figure1.gif"
width=600 xmlns:dw="http://www.ibm.com/developerworks/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> </P>
<P>为了结束我们对 <CODE><FONT face=新宋体>CachedRowSet</FONT></CODE>
的动手研究,示例应用程序还演示了如何插入和删除行。要执行插入,必须将光标移动到一个叫做“插入行”的特殊位置。在这里,我们使用更新方法来填充新行。当我们使用
<CODE><FONT face=新宋体>insertRow()</FONT></CODE> 方法时, <CODE><FONT
face=新宋体>CachedRowSetImpl</FONT></CODE> 对象就会被更新。当执行 <CODE><FONT
face=新宋体>acceptChanges()</FONT></CODE> 方法时,更改就被持久地存储到数据库中。 </P>
<P>以下代码演示了这一点:</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
// move the cursor to a blank row
crs.moveToInsertRow();
// populate the new row
crs.updateInt(1,01234);
crs.updateString(2,"Judith");
crs.updateString(3,"Smith");
// insert the new row
crs.insertRow();
// move cursor back to previous position
crs.moveToCurrentRow();
// synchronize changes to database
crs.acceptChanges();
</CODE></PRE></TD></TR></TBODY></TABLE>
<P>在插入完成之后程序将会暂停,以允许您在数据库中查询插入。</P>
<P>从对象删除行相当直观。只需要将光标定位到想要删除的地方,然后使用 <CODE><FONT
face=新宋体>deleteRow</FONT></CODE> 方法即可。跟前面一样,需要一个后续的同步,以将更改持久存储到数据库中:
</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
// delete row (where the cursor is currently positioned)
crs.deleteRow();
// synchronize changes to database
crs.acceptChanges();
</CODE></PRE></TD></TR></TBODY></TABLE>
<P><SPAN class=atitle2>只是一种实现</SPAN><BR>读者应该注意, <CODE><FONT
face=新宋体>javax.sql.RowSet</FONT></CODE> 接口的 <CODE><FONT
face=新宋体>CachedRowSetImpl</FONT></CODE>
实现只是一种实现(更确切地说是参考实现)。其他供应商也拥有 <CODE><FONT
face=新宋体>RowSet</FONT></CODE>
的实现,这些实现与参考实现处理问题(比如数据完整性)的方式可能会不同(例如,第三方实现可能会对服务器进行锁维护)。 </P>
<P><SPAN class=atitle2>普遍含义</SPAN><BR>可更新的“断开连接的” <CODE><FONT
face=新宋体>ResultSets</FONT></CODE> 在普遍世界中具有各种含义,其中,网络连接可以是断断续续的。使用
<CODE><FONT face=新宋体>CachedRowSet</FONT></CODE>
可以允许客户机在连接可用时将数据缓存在本地,然后重新连接,以同步对数据执行的更改。 </P>
<P><SPAN
class=atitle2>谨慎使用</SPAN><BR>断开连接具有其优点。但是用户必须理解,断开连接的对象是保存在内存中。因此,不应该使用具有大型结果集的方法。大型结果集的相应更新和滚动会是耗资源的操作。</P>
<P><SPAN class=atitle2>结束语</SPAN><BR>与标准 JDBC 2.0 <CODE><FONT
face=新宋体>ResultSet</FONT></CODE> 不一样,利用 <CODE><FONT
face=新宋体>CachedRowSet</FONT></CODE>
不再需要连续使用数据库连接。因为数据库连接池中的数据库连接是宝贵的资源,所以连接数据库、断开连接,然后重新连接以便同步数据库,这种能力无疑是非常受欢迎的。
</P></DIV><BR>
<DIV id=div_info_nextInfo><A class=color_nextInfo
href="http://www.itjc.cn/html_info/176151.htm">用户自定义聚集函数提供分组支持</A></DIV></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<SCRIPT language=javascript
src="利用 DB2 UDB 来使用 Java CachedRowSet 实现.files/bottom.js"></SCRIPT>
</BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -