网络推荐

推荐给好友 上一篇 | 下一篇

如何使用Java中的RowSet


声明
  • 声明: 1、任何网站转载本站点内容时需注明来自JAVA-CN.COM,否则我们有权将根据《互联网著作权行政保护办法》追究其相应法律责任; 2、JAVA中文站社区刊登此文只为传递信息,并不表示赞同或者反对.
ResultSet是使用Jdbc编程的人入门和常用的操作数据库的类,自 JDK 1.4 开始,易于使用RowSet接口被引入。RowSet 接口扩展了标准 java.sql.ResultSet 接口。RowSetMetaData 接口扩展了 java.sql.ResultSetMetaData 接口。因此,熟悉 JDBC API 的开发人员必须学习少数几个新 API 才能使用 rowset。此外,与 JDBC ResultSet 对象配套使用的第三方软件工具也可以方便地用于 rowset。但是在JDK 1.4中,只有一个RowSet接口,使得RowSet的使用范围打了折扣。不过 JDK 5.0 定义了5 个标准的 JDBC RowSet 接口,并且给出了相应的参考实现,因此可以很方便的使用RowSet接口所提供的功能。

J*x(|}$oo  RowSet 对象可以建立一个与数据源的连接并在其整个生命周期中维持该连接,在此情况下,该对象被称为连接的 rowset。rowset 还可以建立一个与数据源的连接,从其获取数据,然后关闭它。这种 rowset 被称为非连接 rowset。非连接 rowset 可以在断开时更改其数据,然后将这些更改发送回原始数据源,不过它必须重新建立连接才能完成此操作。 相比较 java.sql.ResultSet 而言,RowSet 的离线操作能够有效的利用计算机越来越充足的内存,减轻数据库服务器的负担,由于数据操作都是在内存中进行然后批量提交到数据源,灵活性和性能都有了很大的提高。RowSet 默认是一个可滚动,可更新,可序列化的结果集,而且它作为 JavaBeans,可以方便地在网络间传输,用于两端的数据同步。

1`h M0VfR(` JAVA中文站社区门户"_e7x W&_

  1、与ResultSet比较JAVA中文站社区门户W1rT7x U/d

JAVA中文站社区门户 v-b(xR!F \ C1_

  (1)RowSet扩展了ResultSet接口,因此可以像使用ResultSet一样使用RowSet。

Q3[!w!? e/~ T5R

&xM#~0aLn1^C  (2)RowSet扩展了ResultSet接口,因此功能比ResultSet更多、更丰富。JAVA中文站社区门户#YL(|#q)O9o!X8P0JLr

+?&x _ h/n  (3)默认情况下,所有 RowSet 对象都是可滚动的和可更新的。而ResultSet是只能向前滚动和只读的。

xU R1Tj%y6T

h v*A!I%\1g s  (4)RowSet可以是非链接的,而ResultSet是连接的。因此利用CacheRowSet接口可以离线操作数据。JAVA中文站社区门户b4^tE q%K

C]n:fx K  (5)RowSet接口添加了对 JavaBeans 组件模型的 JDBC API 支持。rowset 可用作可视化 Bean 开发环境中的 JavaBeans 组件。JAVA中文站社区门户0q Iz[FA!~

JAVA中文站社区门户@ icHS|

  (6)RowSet采用了新的连接数据库的方法。

W0AP c2q#GW JAVA中文站社区门户7f&N:k4i%fz1Ym_

  (7)CacheRowSet是可以序列化的。

Mp#\#k$]6RN[

vt0u;H0g4__? M  (8)RowSet和ResultSet都代表一行行的数据、属性以及相关操作方法。

3IwU.lDT7~Dz`

M0xad,\r4Q7M6O$A  (9)自己认为,应该倾向于把RowSet看成是与数据库无关的东西,它只是一个代表一行行数据的对象,而ResultSet则是一个与数据库紧密联系的东西。JAVA中文站社区门户1V9XyWl&l N

2C5h {E!@ X k  2、JDK 5.0 的5个标准RowSet接口JAVA中文站社区门户tc4P4ef%{

Q}IUa#k#znBE  在JDK 5.0中,5个标准RowSet接口包括 CachedRowSet,WebRowSet,FilteredRowSet,JoinRowSet 和 JdbcRowSet。相应的参考实现是Sun公司给出的,位于com.sun.rowset包下,分别为为CachedRowSetImpl,WebRowSetImpl,FilteredRowSetImpl,JoinRowSetImpl 和 JdbcRowSetImpl。这5个标准接口中JdbcRowSet是链接的rowset,而其他4个是非链接的rowset。JAVA中文站社区门户w"A.V3dD/Vs$E{!M

JAVA中文站社区门户4g:H [Pf |n

  (1)CachedRowSet:最常用的一种 RowSet。其他三种 RowSet(WebRowSet,FilteredRowSet,JoinRowSet)都是直接或间接继承于它并进行了扩展。它提供了对数据库的离线操作,可以将数据读取到内存中进行增删改查,再同步到数据源。CachedRowSet是可滚动的、可更新的、可序列化,可作为 JavaBeans 在网络间传输。支持事件监听,分页等特性。 CachedRowSet 对象通常包含取自结果集的多个行,但是也可包含任何取自表格式文件(如电子表格)的行。JAVA中文站社区门户bV.d-]$Z(z[{

3f/X5H| F1r!h F'bF  (2)WebRowSet:继承自 CachedRowSet,并可以将 WebRowSet 写到 XML 文件中,也可以用符合规范的 XML 文件来填充 WebRowSet。

(O3^y5d Mn7c1D wW JAVA中文站社区门户3it/Z }#dIP+[{T7_

  (3)FilteredRowSet:通过设置 Predicate(在 javax.sql.rowset 包中),提供数据过滤的功能。可以根据不同的条件对 RowSet 中的数据进行筛选和过滤。JAVA中文站社区门户;U,V;HIhB7I7xS$h

C6N1_&]Q-tI7[ g/H!L5k  (4)JoinRowSet:提供类似 SQL JOIN 的功能,将不同的 RowSet 中的数据组合起来。目前在 Java 6 中只支持内联(Inner Join)。

;R?@!ULqw-a-`~+Kr

s4b"b#L%Sh }@s'i  (5)JdbcRowSet:对 ResultSet 的一个封装,使其能够作为 JavaBeans 被使用,是唯一一个保持数据库连接的 RowSet。JdbcRowSet 对象是连接的 RowSet 对象,也就是说,它必须使用启用 JDBC 技术的驱动程序(“JDBC 驱动程序”)来持续维持它与数据源的连接。JAVA中文站社区门户2x8D1JqZ6zbn

JAVA中文站社区门户 I,kgdY)n Pm(Z6q

  3、填充RowSetJAVA中文站社区门户M]I]{5F[

JAVA中文站社区门户$KT Gs*d]?+YZ

  前面说过,应该倾向于把RowSet看成是与数据库无关而只代表一行行数据的对象,因此就涉及到数据从哪里来的问题。JAVA中文站社区门户f0c6QCyDA

JAVA中文站社区门户(O4PW5C6i

  (1)从数据库直接获取数据JAVA中文站社区门户fi p)q WZD*e"FX

Fpoa1r nJe  由于大部分情况下,与数据打交道也就是与数据库打交道,因此RowSet接口提供了通过JDBC直接从数据库获取数据的方法,以参考实现JdbcRowSetImpl为例,就是这样:JAVA中文站社区门户rn+V jWi:]

JAVA中文站社区门户0mtP T&Y#ot~fq

  RowSet rs = new JdbcRowSetImpl(); //也可以是CachedRowSetImpl,WebRowSetImpl,FilteredRowSetImpl,JoinRowSetImpl。JAVA中文站社区门户}3yAv:f/z

"PEj w9P K  rs.setUrl("jdbc:mysql:///test");JAVA中文站社区门户 lZD(e @H9S N;q

+_1g8D,\{&X[  rs.setUsername("root");

Xs(l_w$O~"A

)R.W:n7P{}k  rs.setPassword("");JAVA中文站社区门户;I;X5Z/r]I/X,S+E4o~

JAVA中文站社区门户Jr,x m%^mx u0uP

  rs.setCommand("SELECT * FROM EMPLOYEES");

}4Brz0sn`c&E^ JAVA中文站社区门户*HL!Yo$Nw i

  rs.execute();

'm4q2p'_/I }G5v Q0v

/B2] }x qe-ul  设置好相关属性,运行execute()方法后,EMPLOYEES表中的数据就被填充到rs对象中了。

7G'D(kv6P)m C+R JAVA中文站社区门户6W]4|5nx6x6RL

  除了通过设置JDBC连接URL、用户名和密码外,RowSet也可以使用数据源名称属性的值来查找已经在命名服务中注册的 DataSource 对象。完成检索后,可以使用 DataSource 对象创建到它所表示的数据源的连接,设置数据源名称可以使用setDataSourceName()方法。JAVA中文站社区门户B2{"K%k:M0i`4C

@2R0O`s P4[lD?-U (2)用ResultSet填充JAVA中文站社区门户-q2Nk!_w6Kd,w

JAVA中文站社区门户Lf-@$bW-{p

  在有现成ResultSet的情况下,如果想将其作为RowSet使用;或者当 DBMS 不提供对滚动和更新的完全支持时,如果想使不可滚动和只读的 ResultSet 对象变得可滚动和可更新,可以创建一个使用该 ResultSet 对象的数据所填充的 CachedRowSet 对象。

?3_&B-^ }/F JAVA中文站社区门户'd] |,} L3m5[

  ResultSet rs = stmt.executeQuery("SELECT * FROM EMPLOYEES");

m.| UQ\] JAVA中文站社区门户 rt)` A3HA,h[

  CachedRowSet crs = new CachedRowSetImpl(); //也可以是WebRowSetImpl,FilteredRowSetImpl,JoinRowSetImpl,因为他们均继承自CachedRowSetImplJAVA中文站社区门户)|(x uO,S?Z#X

y {N F2H;]Wug  crs.populate(rs);

*J/s.D!M8b(t

-RZ1e5Di~|$i9Zw  运行populate()方法后,ResultSet对象rs中的数据就被填充到crs对象中了。

S TU7t4aq@K JAVA中文站社区门户gx'NlV6n

  (3)用XML填充

SW(Z&vzO m XaI#b W JAVA中文站社区门户0\ n&`%t p_2R

  如果您打算将XML作为数据交换格式在客户端和你的服务器之间传输数据并且向实现数据离线编辑、或者向使用XML格式的数据的话,可以使用WebRowSet接口来用XML填充数据。JAVA中文站社区门户`B(rnJ]6e

JAVA中文站社区门户}+NU7I k8nU9C

  WebRowSet wrs = new WebRowSetImpl();JAVA中文站社区门户+@ lQ"P4o0KwS C5i%h

JAVA中文站社区门户Pb:Sh8\9b

  wrs.readXml(new FileReader(new File("D:\\employees.xml")));JAVA中文站社区门户~@*pU)U2F7m

/}wPi.uK$hi p@6y1O  运行readXml()方法后,employees.xml文件的数据就被填充到wrs对象中了。employees.xml 文件的格式参见附录。JAVA中文站社区门户Dm"I P+l:v;U/g

JAVA中文站社区门户6n*r!xhXT

  (4)用其他方法填充

%\tK^(hn

jS~g._U  如果形用其他方式填充,比如csv、excel、text、http等格式或方法填充数据,那么就需要自己编写代码实现RowSet。JAVA中文站社区门户"b5cSg7O

j g.Y^)m/N'{l  4、操作RowSet中的数据及元数据

a`:oY_'Q5O(i JAVA中文站社区门户]Ye.`)lZ5FJ-LD

  除了ResultSet提供的操作数据和元数据方法外,RowSet接口没有提供太多额外的方法。JAVA中文站社区门户:@9_4hT V1v'D

Ti1w {,`C  1)更新数据JAVA中文站社区门户 A$x7oZ'?RXLS

JAVA中文站社区门户XRyjE

  rs.absolute(5);JAVA中文站社区门户?0Y*Oz4wuR&Ns^{k

/D;M[U/gX'X:K  rs.updateInt(1, 10);

[u.Z;XFH&B)ej JAVA中文站社区门户9o1L%ani*ly

  rs.updateInt(2, 1000);

W)|2rG$S^{ NN H8Q

+| |KHK?  rs.updateString(3, "John");JAVA中文站社区门户0c.\FM[,a%cu`

JAVA中文站社区门户Ljb*I M;Q5DR H

  rs.updateRow();JAVA中文站社区门户u K0MYF5Bf9V]

JAVA中文站社区门户GMCI;tHM

  (2)插入数据

T:Z n8ym1a JAVA中文站社区门户 gz5`;z!^I8Q_

  rs.moveToInsertRow();JAVA中文站社区门户$Cn3w'Uv0m,`

JAVA中文站社区门户"a d9V r\b k

  rs.updateInt(1, 10);JAVA中文站社区门户fl;C|2e@

JAVA中文站社区门户BkGWgd*g

  rs.updateInt(2, 1000);JAVA中文站社区门户i_%w-~,|;L:q

F1mbE'Y`  rs.updateString(3, "John");

P%J:`"jHA

&QP.d'VA6C$_  rs.insertRow();JAVA中文站社区门户pGV]b+T

M(A8?Ty`eU  (3)删除数据

w z$T4G0e$ke OM0m JAVA中文站社区门户{8o)Mqv3e,TN1g8xT

  rs.absolute(5);

c S#AwA)~? JAVA中文站社区门户 G6C4Y5b'X

  rs.deleteRow();

d^ aa)p/h;km

j:P,t#G)UJtH"R  (4)设置属性JAVA中文站社区门户^,RP+H&r1W;z JmF9B

JAVA中文站社区门户Q9|1yk J5_

  rs.setCommand("select id, salary, name from employees where id = ?");

b |^)oH is

0J'[(z*N!]s  rs.setInt(1, 1);JAVA中文站社区门户qC%f4sA

JAVA中文站社区门户0rY(mex&Y-Uc-o

  rs.execute();

'OK9W} tT!B JAVA中文站社区门户^{2gx$n1f:i

  (5)元数据JAVA中文站社区门户 Buvpek?

8]%l#uA8V3u'ZO  RowSetMetaData rsmd = (RowSetMetaData)rs.getMetaData();JAVA中文站社区门户)W'k3R"I/q^\w

JAVA中文站社区门户 uW!h$I#b

  int count = rsmd.getColumnCount();JAVA中文站社区门户 gS6`?3I,L,f

A#l4m R:h!p9\3|uWf  int type = rsmd.getColumnType(2);

q@.atX6r tR JAVA中文站社区门户f~a7[2KB e

  5、事务与更新底层数据源

3zx9M~:q? \ l

$p(q2m)`/l  RowSet本身只代表具体数据,事务以及底层数据源的更新是与底层数据源密切相关的概念。对于JDBC数据源,相应的标准接口JdbcRowSet通过与数据库相关的方法来来实现,如commit(),rollback()等。对于标准接口的中非连接rowset,如CachedRowSet,则在对RowSet中的数据改动后,通过运行acceptChanges()方法,在内部调用 RowSet 对象的 writer 将这些更改写入数据源,从而将 CachedRowSet 对象中的更改传播回底层数据源。

J H_5g,?^k7W

6G`#i`mG^  6、可序列化非连接RowSetJAVA中文站社区门户*ct V:Y`D2`a]

JAVA中文站社区门户`4@cS7cD nX{,\

  使用 CachedRowSet 对象的主要原因之一是要在应用程序的不同组件之间传递数据。因为 CachedRowSet 对象是可序列化的,所以可使用它(举例来说)将运行于服务器环境的企业 JavaBeans 组件执行查询的结果通过网络发送到运行于 web 浏览器的客户端。JAVA中文站社区门户YVce(i$i4{

:r A1g1Ee yRU/ib{  由于 CachedRowSet 对象是非连接的,所以和具有相同数据的 ResultSet 对象相比更为简洁。因此,它特别适于向瘦客户端(如 PDA)发送数据,这种瘦客户端由于资源限制或安全考虑而不适于使用 JDBC 驱动程序。所以 CachedRowSet 对象可提供一种“获取各行”的方式而无需实现全部 JDBC API。

5N!d0C/l P9T I

.X+D9f Uw#u  ebRowSet继承自CachedRowSet,除了拥有CachedRowSet的优点外,还可以将WebRowSet输出成XML,也可以将XML转换成WebRowSet,更加适合在Web环境中使用。标准的 WebRowSet XML 模式定义位于 URI http://java.sun.com/xml/ns/jdbc/webrowset.xsd。将WebRowSet保存为XML的代码事例如下:

+h^Ru/Vq2vP

4b nxp J.\j9f? ^  wrs.setCommand("select id, salary, name from employees");JAVA中文站社区门户z8G5PI['JtK%S

JAVA中文站社区门户.N#Zf#DmvRB]"U

  wrs.execute();JAVA中文站社区门户zz E1m!Zk

JAVA中文站社区门户6izgns0FJ

  wrs.writeXml(new FileWriter(new File("D:\\employees.xml")));JAVA中文站社区门户B&o$vXT;UL,]+b

 


TAG: Java JAVA java RowSet
 

评分:0

我来说两句

seccode