`
landy
  • 浏览: 7971 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

用 Java 5 RowSet 新特性访问 IBM DB2 数据库

阅读更多

2006 年 4 月 10 日

Java 5 在 Java Database Connectivity (JDBC) 方面加强了支持,其中加入了新的包 javax.sql.rowset,javax.sql.rowset.serial,javax.sql.rowset.spi。本文将通过实例来演示这些新的特性。

RowSet 新特性简介

Java 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格式。

下面分别演示如何使用这五个新接口。

实验环境

IBM DB2 Universal 8.1
数据库名:DemoDB
数据库用户名:db2admin
数据库密码:password





回页首


CachedRowSet

CachedRowSet可以通过调用populate(ResuletSet rs)来生成数据,一旦获得数据,CachedRowSet就可以断开与数据库的连接,直到往数据库写入数据的时候才需建立连接。

可以使用自己扩展的或是使用Reference Implement的实现类进行访问数据库。下面的代码演示了如何根据ResultSet建立一个CachedRowSet对象,在中断与数据库连接的情况下,读取数据,并做更新,最后再获取数据库连接,将更新落实到数据库中。


                        
                            public static void testCachedRowSet(){
  Connection conn = null;
  try {
    // 获得数据库连接
      conn= DriverManager.getConnection(DB2URL, DB2USER, DB2PASSWORD);
      Statement stmt = conn.createStatement();
      // 查询数据库,获得表数据
      ResultSet rs = stmt.executeQuery("select * from student");//$NON-NLS-1$
      // 根据ResultSet对象生成CachedRowSet类型的对象
      CachedRowSetImpl crs = new CachedRowSetImpl();
      crs.populate(rs);
      // 关闭ResultSet
    rs.close();
      // 关闭数据库的连接
      conn.close();
      // 在中断与数据库连接的情况下,对CachedRowSet进行操作
      operateOnRowSet(crs);
      // 重新获取与数据库的连接
      conn= DriverManager.getConnection(DB2URL, DB2USER, DB2PASSWORD);
      // 将CachedRowSet的内容更新到数据库
      crs.acceptChanges(conn);
      // 关闭CachedRowSet
      crs.close();
      // 关闭数据库连接
      conn.close();
  } catch (InstantiationException e) {
      System.out.println("Andrew: InstantiationException!");//$NON-NLS-1$
  } catch (IllegalAccessException e) {
      System.out.println("Andrew: IllegalAccessException!");//$NON-NLS-1$
  } catch (ClassNotFoundException e) {
      System.out.println("Andrew: ClassNotFoundException!");//$NON-NLS-1$
  }catch (SQLException e) {
      System.out.println("Andrew: SQLException!");//$NON-NLS-1$
    e.printStackTrace();
  }  
}

                        
                    

其中operateOnRowSet方法遍历读取RowSet中的元素,并将id值加1。RowSet允许注册监听器,可以在光标移动,RowSet发生改变时触发。其具体代码如下:


                        
                            public static void operateOnRowSet(RowSet rs){
  // 为RowSet注册监听器
  MyRowsetListener myListener = new MyRowsetListener();
    rs.addRowSetListener(myListener);
    // 操作RowSet数据
  try{
    // 遍历读取数据
    while (rs.next()) {
      String id = rs.getString("ID");//$NON-NLS-1$
          String name = rs.getString("NAME");//$NON-NLS-1$
          System.out.println("ID="+id+",NAME="+name);//$NON-NLS-1$
          //在id最末位连接"1"
          rs.updateString(1, id+"1");
      }
  }catch (SQLException e) {
      System.out.println("Andrew: SQLException!");//$NON-NLS-1$
    e.printStackTrace();
  }
}
class MyRowsetListener implements RowSetListener{
  // 光标发生移动
  public void cursorMoved(RowSetEvent event) {
    System.out.println("cursor moved");
  }
  // row发生改变
  public void rowChanged(RowSetEvent event) {
    System.out.println("row changed");
  }
  // RowSet发生改变
  public void rowSetChanged(RowSetEvent event) {
    System.out.println("row set changed");
  }
}
public static void main(String[] args) {
  try {
    Class.forName(DB2DRIVER).newInstance();
  } catch (InstantiationException e) {
    System.out.println("Andrew: InstantiationException!");//$NON-NLS-1$
  } catch (IllegalAccessException e) {
    System.out.println("Andrew: IllegalAccessException!");//$NON-NLS-1$
  } catch (ClassNotFoundException e) {
    System.out.println("Andrew: ClassNotFoundException!");//$NON-NLS-1$
  }
  testCachedRowSet();
}

                        
                    

上面的程序的运行结果如下:


                        
                            cursor moved
ID=001,NAME=zhou
cursor moved
ID=002,NAME=zhang
cursor moved
cursor moved
cursor moved
cursor moved
cursor moved
cursor moved
row set changed

                        
                    

并且数据库中的id更新为0011,0021。





回页首


JdbcRowSet

JdbcRowSet功能与ResultSet类似,与CachedRowSet不同,JdbcRowSet在操作时保持与数据库的连接。可以将与数据库连接的URL,用户名,密码以及执行的SQL语句通过setXXX形式绑定。另外,JdbcRowSet返回的结果默认是可以上下滚动和可更新的,当然这需要数据库厂商提供的JDBC Driver支持。下面的代码演示了如何通过set方法设定数据库连接参数,以及如何操作JdbcRowSet对象。


                        
                            public static void testJdbcRowSet() {
  JdbcRowSetImpl jrs = new JdbcRowSetImpl();
  try {
    // 设置连接数据库的URL
    jrs.setUrl(DB2URL);
    // 设置连接数据库的用户名
    jrs.setUsername(DB2USER);
    // 设置连接数据库的密码
    jrs.setPassword(DB2PASSWORD);
    // 设置执行数据库的SQL语句
    jrs.setCommand("select * from student");
    // 执行操作
    jrs.execute();
    // 对获得的JdbcRowSet进行操作
    operateOnRowSet(jrs);
    // 关闭JdbcRowset
    jrs.close();
  } catch (SQLException e) {
    System.out.println("Andrew: SQLException!");//$NON-NLS-1$
    e.printStackTrace();
  }
}

public static void operateOnRowSet(RowSet rs) {
  // 为RowSet注册监听器
  MyRowsetListener myListener = new MyRowsetListener();
  rs.addRowSetListener(myListener);
  // 操作RowSet数据
  try {
    // 遍历读取数据
    while (rs.next()) {
      String id = rs.getString("ID");//$NON-NLS-1$
      String name = rs.getString("NAME");//$NON-NLS-1$
      System.out.println("ID=" + id + ",NAME=" + name);//$NON-NLS-1$
    }
  } catch (SQLException e) {
    System.out.println("Andrew: SQLException!");//$NON-NLS-1$
    e.printStackTrace();
  }
}
  
                        
                    

其运行结果如下:


                        
                            cursor moved
ID=0011,NAME=zhou
cursor moved
ID=0021,NAME=zhang
cursor moved

                        
                    





回页首


FilteredRowSet

FilteredRowSet接口中规定了可以设定过滤器,其过滤接口为Predicate接口,必须实现Predicate接口中的evaluate方法。具体的代码如下:


                        
                            public static void testFilteredRowSet() {
  try {
    // 获得数据库连接
    Connection conn = DriverManager.getConnection(DB2URL, DB2USER,
      DB2PASSWORD);
    Statement stmt = conn.createStatement();
    // 查询数据库,获得表数据
    ResultSet rs = stmt.executeQuery("select * from student");//$NON-NLS-1$
    FilteredRowSet frs = new FilteredRowSetImpl();
    frs.populate(rs);
    // 设置过滤器
    MyDBFilter filter = new MyDBFilter(11, 100);
    frs.setFilter(filter);
    operateOnRowSet(frs);
    // 关闭FilteredRowSet
    frs.close();
    // 关闭与数据库的连接
    conn.close();
  } catch (SQLException e) {
    System.out.println("Andrew: SQLException!");//$NON-NLS-1$
    e.printStackTrace();
  }
}

public static void operateOnRowSet(RowSet rs) {
  // 为RowSet注册监听器
  System.out.println("operateOnRowSet!");//$NON-NLS-1$
  MyRowsetListener myListener = new MyRowsetListener();
  rs.addRowSetListener(myListener);
  // 操作RowSet数据
  try {
    // 遍历读取数据
    while (rs.next()) {
      String id = rs.getString("ID");//$NON-NLS-1$
      String name = rs.getString("NAME");//$NON-NLS-1$
      System.out.println("ID=" + id + ",NAME=" + name);//$NON-NLS-1$
    }
  } catch (SQLException e) {
    System.out.println("Andrew: SQLException!");//$NON-NLS-1$
    e.printStackTrace();
  }
}

public static void main(String[] args) {
  try {
    Class.forName(DB2DRIVER).newInstance();
  } catch (InstantiationException e) {
    System.out.println("Andrew: InstantiationException!");//$NON-NLS-1$
  } catch (IllegalAccessException e) {
    System.out.println("Andrew: IllegalAccessException!");//$NON-NLS-1$
  } catch (ClassNotFoundException e) {
    System.out.println("Andrew: ClassNotFoundException!");//$NON-NLS-1$
  }
  testFilteredRowSet();
}

                        
                    

其中MyDBFilter实现了Predicate接口,其实现代码如下:


                        
                            class MyDBFilter implements Predicate {
  private int low;
  private int high;
  public MyDBFilter(int low, int high) {
    this.low = low;
    this.high = high;
  }
  public boolean evaluate(RowSet rs) {
    CachedRowSet crs=(CachedRowSet)rs;
    //如果id在low和high之间返回真
    try {
      String id = (String) crs.getString("id");
      int idValue = Integer.parseInt(id);
      if (low < idValue && idValue < high) {
        return true;
      }
    } catch (SQLException e) {
      
    }
    return false;
  }
  public boolean evaluate(Object arg0, int arg1) throws SQLException {
    return false;
  }

  public boolean evaluate(Object arg0, String arg1) throws SQLException {
    return false;
  }
}

                        
                    

其运行结果如下:


                        
                            cursor moved
ID=0021,NAME=zhang
cursor moved

                        
                    





回页首


JoinRowSet

JoinRowSet可以将多个RowSet对象进行join合并,Join的列可以通过每个RowSet通过调用setMatchColumn方法来设置。setMatchColumn方式是Joinable接口定义的方法,五种类型的RowSet规定都需要实现该接口。下面的代码演示将student表和intern表中id相同的数据进行join操作。JoinRowSet不需要保持与数据库的连接。


                        
                            public static void testJoinRowSet(){
  Connection conn = null;
  try {
    JoinRowSet jrs = new JoinRowSetImpl();
    // 获得数据库连接
    conn = DriverManager.getConnection(DB2URL, DB2USER, DB2PASSWORD);
    Statement stmt = conn.createStatement();
    // 查询数据库,获得表数据
    ResultSet rs1 = stmt.executeQuery("select id,name from student");//$NON-NLS-1$
    // 根据ResultSet对象生成CachedRowSet类型的对象
    CachedRowSetImpl crs1 = new CachedRowSetImpl();
    crs1.populate(rs1);
    crs1.setMatchColumn(1);
    // 关闭ResultSet
    jrs.addRowSet(crs1);
    rs1.close();
    
    // 查询数据库,获得表数据
    ResultSet rs2 = stmt.executeQuery("select id,company from intern");//$NON-NLS-1$
    // 根据ResultSet对象生成CachedRowSet类型的对象
    CachedRowSetImpl crs2 = new CachedRowSetImpl();
    crs2.populate(rs2);
    crs2.setMatchColumn(1);
    // 关闭ResultSet
    rs2.close();
    // 将Result2放入JoinRowSet中进行Join操作
    jrs.addRowSet(crs2);
    // 关闭数据库连接
    conn.close();
    
    while (jrs.next()) {
      String id = jrs.getString(1);
      String name = jrs.getString(2);
      String company = jrs.getString(3);
      //$NON-NLS-1$
      System.out.println("ID=" + id + ",NAME=" + name+",COMPNAY="+company);
    }
  } catch (SQLException e) {
    System.out.println("Andrew: SQLException!");//$NON-NLS-1$
    e.printStackTrace();
  }
}

                        
                    

其输出结果为


                        
                            ID=001111,NAME=zhou,COMPNAY=companyA

                        
                    





回页首


WebRowSet

WebRowSet继承自CachedRowSet,支持XML格式的查询,更新等操作,下面的代码将WebRowSet对象输出成XML格式到文件。


                        
                            public static void testWebRowSet(){
  try {
    // 获得数据库连接
    Connection conn = DriverManager.getConnection(DB2URL, DB2USER,
        DB2PASSWORD);
    Statement stmt = conn.createStatement();
    // 查询数据库,获得表数据
    ResultSet rs = stmt.executeQuery("select * from student");//$NON-NLS-1$
    WebRowSetImpl wrs = new WebRowSetImpl();
    wrs.populate(rs);
    FileOutputStream out = new FileOutputStream("data.xml");
    wrs.writeXml(out);
    wrs.close();
    // 关闭与数据库的连接
    conn.close();
  } catch (SQLException e) {
    System.out.println("Andrew: SQLException!");//$NON-NLS-1$
    e.printStackTrace();
  } catch(IOException e){
    System.out.println("Andrew: IOException!");//$NON-NLS-1$
    e.printStackTrace();
  }
}

                        
                    

其运行结果data.xml大致如下:


                        
                            <?xml version="1.0"?>
XML文件属性格式 
……
<metadata>
    <column-count>2</column-count>
    <column-definition>
      <column-index>1</column-index>
      <auto-increment>false</auto-increment>
      <case-sensitive>true</case-sensitive>
      <currency>false</currency>
      <nullable>0</nullable>
      <signed>false</signed>
      <searchable>true</searchable>
      <column-display-size>10</column-display-size>
      <column-label>ID</column-label>
      <column-name>ID</column-name>
      <schema-name>ZHOUDP  </schema-name>
      <column-precision>10</column-precision>
      <column-scale>0</column-scale>
      <table-name>STUDENT</table-name>
      <catalog-name>TEST</catalog-name>
      <column-type>12</column-type>
      <column-type-name>VARCHAR</column-type-name>
    </column-definition>
    <column-definition>
      <column-index>2</column-index>
      <auto-increment>false</auto-increment>
      <case-sensitive>true</case-sensitive>
      <currency>false</currency>
      <nullable>1</nullable>
      <signed>false</signed>
      <searchable>true</searchable>
      <column-display-size>50</column-display-size>
      <column-label>NAME</column-label>
      <column-name>NAME</column-name>
      <schema-name>ZHOUDP  </schema-name>
      <column-precision>50</column-precision>
      <column-scale>0</column-scale>
      <table-name>STUDENT</table-name>
      <catalog-name>TEST</catalog-name>
      <column-type>12</column-type>
      <column-type-name>VARCHAR</column-type-name>
    </column-definition>
  </metadata>
  <data>
    <currentRow>
      <columnValue>0011</columnValue>
      <columnValue>zhou</columnValue>
    </currentRow>
    <currentRow>
      <columnValue>0021</columnValue>
      <columnValue>zhang</columnValue>
    </currentRow>
  </data>
</webRowSet>

                        
                    



独孤过客 2006-06-10 19:43 发表评论
分享到:
评论

相关推荐

    Java 6 RowSet 使用完全剖析

    Java 6 RowSet 使用完全剖析

    java的rowset工具包

    jdk虽然定义了jdbc中的rowset接口但是没有实现。如果想使用rowset就要倒入这个包。

    Java数据库技术详解 DOC简版

    第1章 Java和数据库 1.1 Java概述 1.2 Java的开发和运行环境 1.3 数据库概述 1.4 数据持久层 1.5 本章小结 第2章 SQL语句基础之DDL 2.1 DDL基础 2.2 DDL操作视图 2.3 本章小结 第3章 SQL语句...

    Java数据库编程宝典3

    第5章 使用JDBC和SQL创建表 5.1 创建数据库 5.2 使用表 5.2.1 记录和字段、行和列 5.2.2 SQL数据类型 5.2.3 完整性约束 5.3 创建表 5.4 使用JDBC创建表 5.4.1 DriverManager 5.4.2 驱动程序 5.4.3 连接 ...

    rowset.jar

    支持CatchRowSet生成Excel报表

    rowset

    sun对Rowset的实现

    Java数据库编程宝典2

    第5章 使用JDBC和SQL创建表 5.1 创建数据库 5.2 使用表 5.2.1 记录和字段、行和列 5.2.2 SQL数据类型 5.2.3 完整性约束 5.3 创建表 5.4 使用JDBC创建表 5.4.1 DriverManager 5.4.2 驱动程序 5.4.3 连接 ...

    com.sun.rowset.jar.zip

    sun公司的rowset jar包。操作数据库很酷的

    Java数据库编程宝典1

    第5章 使用JDBC和SQL创建表 5.1 创建数据库 5.2 使用表 5.2.1 记录和字段、行和列 5.2.2 SQL数据类型 5.2.3 完整性约束 5.3 创建表 5.4 使用JDBC创建表 5.4.1 DriverManager 5.4.2 驱动程序 5.4.3 连接 ...

    Java数据库编程宝典4

    第5章 使用JDBC和SQL创建表 5.1 创建数据库 5.2 使用表 5.2.1 记录和字段、行和列 5.2.2 SQL数据类型 5.2.3 完整性约束 5.3 创建表 5.4 使用JDBC创建表 5.4.1 DriverManager 5.4.2 驱动程序 5.4.3 连接 ...

    Java6RowSet使用完全剖析

    本文内容包括:RowSet简介类继承结构实验环境使用CachedRowSet使用WebRowSet使用FilteredRowSet使用JdbcRowSet使用JoinRowSet结束语下载参考资料C#提供了DataSet,可以将数据源中的数据读取到内存中,进行离线操作,...

    rowset.jar下载

    rowset.jar下载rowset.jar下载rowset.jar下载rowset.jar下载rowset.jar下载rowset.jar下载

    ROWSET介绍加实例

    文档介绍了rowset的详细使用,并附有实例代码。

    rowset.jar包

    此处上传可以直接使用的rowset.jar包,直接下载放在包里,就可以使用了.

    java jdk实列宝典 光盘源代码

    16 j2se5.0 新特性 自动装箱和拆箱; 新的for循环; 枚举类型; 静态导入; 格式化输出; 使用ProcessBuilder执行本地命令; 泛型编程; 监控和管理虚拟机;新的线程执行架构; 线程锁; 线程条件; 线程同步装置:semaphore ...

    java api最新7.0

    java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...

    JAVA_API1.6文档(中文)

    java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...

    sun.jdbc.rowset的jar包

    sun.jdbc.rowset的jar包,2000年的老包。不过有些老项目需要。 包括sun.jdbc.rowset.CachedRowSet。

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

     《Java JDK 7学习笔记》针对Java SE 7新功能全面改版,无论是章节架构或范例程序代码,都做了全面重新编写与翻新。  《Java JDK 7学习笔记》是作者多年来教学实践的经验总结,汇集了学员在教学过程中遇到的概念、...

Global site tag (gtag.js) - Google Analytics