`

JAVA基础 之 RowSet

    博客分类:
  • java
阅读更多

注意:

    1.本例建议在Java 7 下使用(尽管RowSet从1.4就出现过)

    2.由于很多人看到长代码就产生抵触情绪,本例将部分代码截段,使用时直接粘贴到主程序即可

 

概述:

 

    1.RowSet继承自ResultSet,但是它默认就是可滚动、可更新、可序列化(方便网络传输),可当作JavaBeans使用

       它下面主要有5个子接口JdbcRowSet、CachedRowSet、WebRowSet、JoinRowSet、FilteredRowSet

       JdbcRowSet:封装ResultSet,使得它能可以当作JavaBeans使用,但是它必须保持与数据库的连接(非离线)

       CachedRowSet:拥有JdbcRowSet所有功能,同时还能断开数据库连接进行离线操作

       WebRowSet:拥有所有的CachedRowSet功能,同时还能通过xml来描述自己(把自己写成xml,通过xml来配置自己)

       JoinRowSet:拥有所有WebRowSet的功能,同时它能在断开数据源的情况下做一个sql join(感觉就是java版的表连接,比如2个结果集 我通过什么字段将其关联成一个表,sql中的join(联表)操作)

       FilteredRowSet:有所有哦的WebRowSet的功能,如其名,可以做过滤操作(在不使用查询语句和断开数据源的情况下)

    2.优点

       1.某些子接口支持离线操作(可断开数据库连接)

          当前使用ResultSet的方式:

          方式1.将结果集遍历,封装成List<Map<String,Object>>,然后关闭数据库连接,使用这个封装好的对象(最常用的形式)

          方式2.再遍历使用ResultSet的过程,数据库连接一直处于打开状态,操作完毕后才关闭数据库连接(简单程序和初学者都这么干)

          方式1就是有一次转换的过程,无形中造成了性能的浪费,方式2的数据库连接一直处于打开状态,性能低且不安全。

          RowSet有很多可离线的子接口,解决了上面两种方式的所有问题,想必这是极好的~

        2.可当作JavaBeans使用,可序列化(方便网络传输)

    3.本例讲述的内容

       1.java7前RowSet的使用(比常规的5步使用jdbc简单很多)

       2.java7后RowSet的使用(更简单)

       3.演示离线的RowSet

       4.离线的RowSet操作

       5.RowSet的分页

 

更多的了解请看 http://docs.oracle.com/javase/tutorial/jdbc/basics/rowset.html

 

 

package com.cxy.test;

import java.sql.Connection;
import java.sql.DriverManager;

import javax.sql.rowset.JdbcRowSet;
import javax.sql.rowset.RowSetFactory;
import javax.sql.rowset.RowSetProvider;

import com.sun.rowset.JdbcRowSetImpl;

/**
 * @author cxy
 */
public class RowSetTest
{
	public static void main(String[] args) throws Exception
	{
		Class.forName("com.mysql.jdbc.Driver");
		//java7前的使用方法,是不是看起来简单很多~
		try
		(
				Connection con=DriverManager.getConnection("jdbc:mysql://localhost/dbtest", "root", "root");
				JdbcRowSet jrs=new JdbcRowSetImpl(con);  //传递一个con给JdbcRowSet构造器就可以啦
		)
		{
			jrs.setCommand("select * from t_student");
			jrs.execute();
			System.out.println("id\t姓名\t 性别");
			while(jrs.next())
			{
				System.out.println(jrs.getString(1)+"\t"+jrs.getString(2)+"\t"+jrs.getString(3));
			}
		}
		System.out.println("=======================");
		
		//java7开始 提供了RowSetFactory接口来生成各种RowSet
		RowSetFactory rsf=RowSetProvider.newFactory();  //先使用RowSetProvider创建一个RowSetFactory
		try
		(
			JdbcRowSet jrs=rsf.createJdbcRowSet();
		)
		{
			jrs.setUrl("jdbc:mysql://localhost/dbtest");
			jrs.setUsername("root");
			jrs.setPassword("root");
			jrs.setCommand("select * from t_student");
			jrs.execute();
			System.out.println("id\t姓名\t 性别");
			while(jrs.next())
			{
				System.out.println(jrs.getString(1)+"\t"+jrs.getString(2)+"\t"+jrs.getString(3));
			}
		}
		System.out.println("=======================");
		//是不是更简单了呢?我认为还是极好的~ 至少我只知道一个JdbcRowSet就可以进行数据库操作了,不像原来要创建各种对象
		//如果RowSet没有提供一个con的话,那么他将使用RowSetReader来完成execute方法
	}
}

上面演示了Java RowSet的基本用法。

 

亮点:离线功能演示

 

                //下面 我们来看一个离线版的RowSet,关闭数据库连接后仍然能使用的RowSet
		try
		(
				//由于JdbcRowSet是非离线的 所以 这里我们更换成一个离线的RowSet:CachedRowSet
				Connection con=DriverManager.getConnection("jdbc:mysql://localhost/dbtest", "root", "root");
				PreparedStatement pstmt=con.prepareStatement("select * from t_student", 
															 ResultSet.TYPE_SCROLL_SENSITIVE,
															 ResultSet.CONCUR_UPDATABLE);
				ResultSet rs=pstmt.executeQuery();
				CachedRowSet crs=rsf.createCachedRowSet();
		)
		{
			crs.populate(rs); //封装rs成CachedRowSet
			con.close();  //好了 我们将con这个关闭
			try
			{
				while(rs.next())
				{
					System.out.println(rs.getString(1)+"\t"+rs.getString(2)+"\t"+rs.getString(3));
				}
			}catch(Exception e)
			{
				System.out.println("由于con已经关闭,rs不能再被访问");
			}
			System.out.println("但是离线的crs仍可访问");
			System.out.println("id\t姓名\t 性别");
			while(crs.next())
			{
				System.out.println(crs.getString(1)+"\t"+crs.getString(2)+"\t"+crs.getString(3));
			}
		}
		System.out.println("=======================");

 

 

操作RowSet演示,以插入为例,更多的请看我博客中的《Java基础 之 ResultSet》

 

                //演示如果操作数据(这里演示的是如何插入数据)
		CachedRowSet crs1=rsf.createCachedRowSet();
		crs1.setUrl("jdbc:mysql://localhost/dbtest");
		crs1.setUsername("root");
		crs1.setPassword("root");
		crs1.setCommand("select * from t_student");
		crs1.execute();
		
		//这样的操作只能改变离线的RowSet
		crs1.moveToInsertRow();  //将指针移动到插入行,当前的位置将会被记住
		crs1.updateString(1, UUID.randomUUID().toString().replace("-", ""));
		crs1.updateString(2, "克隆人"+System.currentTimeMillis());
		crs1.updateString(3, "女");
		crs1.insertRow(); //必须和moveToInsertRow联合使用
		crs1.moveToCurrentRow(); //做完插入操作后,将指针指回到插入状态前的行
		crs1.beforeFirst();
		while(crs1.next())
		{
			System.out.println(crs1.getString(1)+","+crs1.getString(2)+","+crs1.getString(3));
		}
		
		//如果想同步数据库那么就需要重新连接数据库,然后把数据提交上去
		try
		(
				Connection con=DriverManager.getConnection("jdbc:mysql://localhost/dbtest", "root", "root");
		)
		{
			con.setAutoCommit(false);  //这句必须要否则会造成下面那句的异常
			crs1.acceptChanges(con);  //同步数据到数据库
		}
		System.out.println("=======================");

 

 

最后我们来看看它的分页功能

 

                //最后我们来看看分页
		/* 第一种方式 有ResultSet的
		 * crs.setPageSize(pageSize); //设置每页的大小
		 * crs.populate(rs, (page-1)*pageSize+1); //封装rs从第几行(根据页和每页大小算出)开始
		 * 个人觉得这种方式不好,因为 这个实际上还是先查出了所有结果rs,然后再同java的方式截取出咱们想要的那页数据
		 * */
		crs1.setPageSize(3); //每页显示几条
		crs1.execute();
		System.out.println(crs1.isBeforeFirst());
		int i=1;
		System.out.println("第"+i+"页:");
		while(crs1.next())
		{
			System.out.println(crs1.getString(1)+","+crs1.getString(2)+","+crs1.getString(3));
		}
		i++;
		while(crs1.nextPage())
		{
			System.out.println("第"+i+"页:");
			while(crs1.next())
			{
				System.out.println(crs1.getString(1)+","+crs1.getString(2)+","+crs1.getString(3));
			}
			i++;
		}

    说明:

 

       1.官方解释 每次nextPage都会创建一个新的CachedRowSet,每次只有PageSize条数据在内存中

       2.另外crs.previousPage();可以向前翻页

 

结束语:

    遗留问题:

    这种不创建con的方式,是通过RowSetReader去读取数据的,但是目前还没时间看它到底是如何实现的,它是每次读取数据都要做数据库连接么?每次执行完再关闭连接?如果是这样的话那会产生性能问题吧?处保险起见个人觉得还是弄个数据库连接池 然后将CachedRowSet中放一个con。

 

相关连接:

《Java基础 之 ResultSet》

《Java基础 之 ResultSetMetaData》

《Java基础 之 JDBC》

 

声明:

1.原创文章,转载请标明并加本文连接。

2.文章反映个人愚见,如有异议欢迎讨论指正

 

2
4
分享到:
评论
1 楼 snkcxy 2013-03-01  
个人觉得RowSet 是让JDBC从不好用到好用(易用)的一个体现,希望这篇文章能给大家带来更多帮助,启发。

相关推荐

    Java语言基础下载

    第四章: Java语法基础 47 学习目标 47 基本语法元素 48 Java关键字 49 基本Java数据类型 50 变量声明和赋值 52 引用(Reference)类型 52 存储器分配和布局 53 this引用 55 Java编码约定 56 运算符的优先级 58 升级...

    JAVA_API1.6文档(中文)

    java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 Java 编程语言注释设施提供库支持。 java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java....

    Java数据库技术详解 DOC简版

    第2章 SQL语句基础之DDL 2.1 DDL基础 2.2 DDL操作视图 2.3 本章小结 第3章 SQL语句基础之DML 3.1 SELECT语句基础 3.2 WHERE子句 3.3 ORDER BY子句 3.4 GROUP BY和HAVING子句 3.5 INSERT语句 3.6...

    Java 1.6 API 中文 New

    java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 Java 编程语言注释设施提供库支持。 java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java....

    JavaAPI1.6中文chm文档 part1

    java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 Java 编程语言注释设施提供库支持。 java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java....

    java api最新7.0

    java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 Java 编程语言注释设施提供库支持。 java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java....

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

     《Java JDK 7学习笔记》将IDE操作纳为教学内容之一,使读者能与实践结合,提供的视频教学能更清楚地帮助读者掌握操作步骤。 内容简介 书籍 计算机书籍  《java jdk 7学习笔记》是作者多年来教学实践经验的总结...

    java jdk-api-1.6 中文 chmd

    java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 Java 编程语言注释设施提供库支持。 java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java....

    JavaAPI中文chm文档 part2

    java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 Java 编程语言注释设施提供库支持。 java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java....

    Java JDK实例宝典

    第1章 Java基础 1.1 转换基本数据类型 1.2 Java的运算符 1.3 控制程序的流程 1.4 计算阶乘 1.5 实现命令行程序 第2章 Java面向对象程序设计 2. 1 复数类 2. 2 equals.chashCode...

    JAVA 范例大全 光盘 资源

    第2章 Java基础语法 9 实例4 变量和常量 9 实例5 基本数据类型转换 10 实例6 操作多种运算符 12 实例7 不同数制间的转换 17 实例8 多种方式实现阶乘的算法 20 第3章 流程控制语句 23 实例9 打印任一年日历 23...

    Java数据编程指南

    使用服务程序进行数据访问 引言 使用服务程序的数据库连接 范例应用程序 JDBC驱动器之结语 小结 第15章 JSP JSP与服务程序 JSP与ASP 实现JSPs JavaServer Page范例 JavaBeans综述...

    Java数据库编程宝典3

    第3章 SQL基础 3.1 SQL语言 3.2 SQL数据类型 3.3 数据定义语言 3.3.1 创建、取消、更改数据库和表 3.3.2 创建、更改和取消视图 3.4 数据处理语言 3.4.1 INSERT语句 3.4.2 UPDATE语句 3.4.3 DELETE语句 ...

    [Java参考文档]

    java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 Java 编程语言注释设施提供库支持。 java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java....

    [Java参考文档].JDK_API 1.6

    java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 Java 编程语言注释设施提供库支持。 java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java....

    Java数据库编程宝典2

    第3章 SQL基础 3.1 SQL语言 3.2 SQL数据类型 3.3 数据定义语言 3.3.1 创建、取消、更改数据库和表 3.3.2 创建、更改和取消视图 3.4 数据处理语言 3.4.1 INSERT语句 3.4.2 UPDATE语句 3.4.3 DELETE语句 ...

    Java数据库编程宝典4

    第3章 SQL基础 3.1 SQL语言 3.2 SQL数据类型 3.3 数据定义语言 3.3.1 创建、取消、更改数据库和表 3.3.2 创建、更改和取消视图 3.4 数据处理语言 3.4.1 INSERT语句 3.4.2 UPDATE语句 3.4.3 DELETE语句 ...

Global site tag (gtag.js) - Google Analytics