1 前言
听说在java里面一直没有封装很好的类似dataset的离线数据集,但是java里面同样提供了封装的不好的离线数据集rowset,在早些时候的jdk版本(jdk1.4及以前)其实已经提供了rowset的jar包,但是sun公司只提供了5个接口,并没有提供接口的实现,而我们要完成我们想要的工作就必须自己写实现,但同时,由于广大网友的要求(觉得这样实在不方便),sun公司又单独提供了一个有实现的rowset.jar包,放在sun的官方网站上供人们下载和使用,不过在他的sun官方网站上面该jar包的名字是jdbc_rowset_tiger-1_0_1-mrel-jwsdp.zip,在jdk1.5里面sun公司把这个jar包重写了实现,所以我们如果下载了sun公司单独提供的rowset的jar包或者安装了jdk1.5,我们都可以轻松的感受sun公司的离线数据集的快乐。
2 准备工作
在使用这个下载的离线数据集包的时候,我们首先要做的一件事就是把他改成中国地区能使用的jar包,因为他提供的这个jar包默认状态下是英文地区使用的,如果不这样做的话只要调用new CachedRowSetImpl(),就可以创建一个CachedRowSet对象,但就是这个new CachedRowSetImpl(),在使用时程序执行这个语句会抛出异常。根本用不了。
解决方法:
1
解压jdbc_rowset_tiger-1_0_1-mrel-ri.zip,产生rowset.jar文件。
2
再解压rowset.jar文档,在产生的com/sun/rowset目录下找到RowSetResourceBundle.properties文件。
3
将RowSetResourceBundle.properties更名为
RowSetResourceBundle_CN.properties
。
4
重新创建rowset.jar包说明:这里_CN表示所处中国。不同的国家,这个名称不同经过以上的步骤就可以正常使用new CachedRowSetImpl()啦.
3 简介rowset
J
ava 5
在Java Database Connectivity (JDBC)方面加强了支持,其中加入了新的包javax.sql.rowset,javax.sql.rowset.serial,javax.sql.rowset.spi。从RowSet接口继承规定了五个新的接口:
1.
CachedRowSet
:
CachedRowset
可以不用与数据源建立长期的连接,只有当从数据库读取数据或是往数据库写入数据的时候才会与数据库建立连接,它提供了一种轻量级的访问数据库的方式,其数据均存在内存中。
2.
JdbcRowSet
:对ResultSet的对象进行包装,使得可以将ResultSet对象做为一个JavaBeans ™ 组件。
3.
FilteredRowSet
:继承自CachedRowSet,可以根据设置条件得到数据的子集。
4.
JoinRowSet
:
继承自CachedRowSet,可以将多个RowSet对象进行SQL Join语句的合并。
5.
WebRowSet
:继承自CachedRowSet,可以将WebRowSet对象输出成XML格式。
4 实现
由于我个人体会这块最有用并且最基础的是CachedRowSet部分,所以我只是做了CachedRowSet的实现例子。
CachedRowSet
可以通过调用populate(ResuletSet rs)来生成数据,一旦获得数据,CachedRowSet就可以断开与数据库的连接,直到往数据库写入数据的时候才需建立连接。
例子代码如下:
package src;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.RowSet;
import com.sun.rowset.CachedRowSetImpl;
public class testCachedRowSet {
public static void testCachedRowSet() {
}
public static com.sun.rowset.CachedRowSetImpl Query_all() throws SQLException{
Connection conn = null;
String url="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=testrowset";
String user="sa";
String password="sa";
// 获得数据库连接
conn= DriverManager.getConnection(url,user,password);
java.sql.Statement stmt = conn.createStatement();
// 查询数据库,获得表数据
ResultSet rs = stmt.executeQuery("select * from test"); // 根据ResultSet对象生成CachedRowSet类型的对象
CachedRowSetImpl crs = new CachedRowSetImpl();
crs.populate(rs);
// 关闭ResultSet
rs.close();
// 关闭数据库的连接
conn.close();
return crs;
}
public static void main(String[] args) throws SQLException {
String driver="com.microsoft.jdbc.sqlserver.SQLServerDriver";
Connection conn = null;
String url="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=testrowset;SelectMethod=Cursor";//
最后注意事项的部分
String user="sa";
String password="sa";
try {
Class.forName(driver).newInstance();
CachedRowSetImpl crs = new CachedRowSetImpl();
crs=Query_all();
crs.setTableName("test");
crs.next();
//改操作
crs.updateString(1, "434");
//查操作
String id = crs.getString("ID");
System.out.println(id);
//删操作
crs.deleteRow();
crs.updateRow();
// 重新获取与数据库的连接
conn= DriverManager.getConnection(url,user,password);
// 将CachedRowSet的内容更新到数据库
crs.acceptChanges(conn);
// 关闭CachedRowSet
crs.close();
// 关闭数据库连接
conn.close();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
5 注意事项:
用JDBC的时候发现一个问题:“java.sql.SQLException:[Microsoft][SQLServer 2000 Driver for JDBC]Can't start a cloned connection while in manual transaction mode.”查了一下微软的官方网站原来才发现,我们使用JDBC的时候所打开的数据库连接的默认设置是“手动模式下的直接连接模式”,在该模式下,不能对SQLServer 的数据库做批量操作,连微软自己都承认这是设计的问题,其他数据库暂时没有发现这个问题,要改变的话我们必须对连接字符串做如下修改:“String url="jdbc:microsoft:sqlserver://localhost;DatabaseName;SelectMethod=Cursor";”以保证我们的模式是光标模式而不是直接模式。