java里的离线数据集

原创 2006年05月28日 21:53:00

1       前言

听说在java里面一直没有封装很好的类似dataset的离线数据集,但是java里面同样提供了封装的不好的离线数据集rowset,在早些时候的jdk版本(jdk1.4及以前)其实已经提供了rowsetjar包,但是sun公司只提供了5个接口,并没有提供接口的实现,而我们要完成我们想要的工作就必须自己写实现,但同时,由于广大网友的要求(觉得这样实在不方便)sun公司又单独提供了一个有实现的rowset.jar包,放在sun的官方网站上供人们下载和使用,不过在他的sun官方网站上面该jar包的名字是jdbc_rowset_tiger-1_0_1-mrel-jwsdp.zip,在jdk1.5里面sun公司把这个jar包重写了实现,所以我们如果下载了sun公司单独提供的rowsetjar包或者安装了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简介

Java 5Java Database Connectivity (JDBC)方面加强了支持,其中加入了新的包javax.sql.rowsetjavax.sql.rowset.serialjavax.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";”以保证我们的模式是光标模式而不是直接模式。

 

6       参考文献:

http://support.microsoft.com/default.aspx?scid=kb%3Bzh-cn%3B313181

http://www-128.ibm.com/developerworks/cn/java/j-zhanghz2/

相关文章推荐

java的离线数据集(RowSet)

如果在开发应用的时候没有使用任何持久层框架,而是直接使用jdbc 的api编程的话,大家最长使用的就是ResultSet接口进行数据的读取了,但是大家也会觉得很不方便,因为ResultSet是在线的...

聚类算法之K-means算法-UCI数据集上的java实现

本文主要分析了K-means聚类算法的基本原理,时间复杂度以及优缺点,最后用UCI数据集进行了测试,包含java实现代码,适合初学者参考。...

Java报表软件不带参程序数据集

在某些应用场景中,需要在程序中对数据进行处理后再作为报表的数据源使用,以下例子即为一个简单的不带参程序数据集ArrayTableData的使用过程,并以此简要说明程序数据集的使用方法。1.      ...

Ch09_数据集与断线操作

  • 2011年11月21日 23:24
  • 247KB
  • 下载

初识Java数据集

在设计报表和查询时,仅靠SQL有的需求是根本不够的,所以引入了Java数据集这个概念。通俗点讲就是用用java把sql"包装"起来,封装好便于使用。常用语复杂多表查询,存储结构业务.下面就拿出一个简单...

java 数据库编程中数据集的操作

1. 读写LOB   除了数字、字符串和日期之外,许多数据库还可以存储大对象,例如图片或其它数据。在SQL中,二进制大对象称为BLOB,字符型大对象称为CLOB。   要读取LOB,需要执...
  • zs520ct
  • zs520ct
  • 2017年05月12日 09:49
  • 169
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java里的离线数据集
举报原因:
原因补充:

(最多只允许输入30个字)