注意:
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。
相关连接:
声明:
1.原创文章,转载请标明并加本文连接。
2.文章反映个人愚见,如有异议欢迎讨论指正
相关推荐
- CachedRowSet:这是最基础的Rowset类型,它可以将数据缓存到内存中,支持离线操作。 - JoinRowSet:允许合并多个Rowset,实现跨表查询。 - FilteredRowSet:提供了基于谓词的过滤功能,可以筛选满足特定条件的...
java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 Java 编程语言注释设施提供库支持。 java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java....
第四章: Java语法基础 47 学习目标 47 基本语法元素 48 Java关键字 49 基本Java数据类型 50 变量声明和赋值 52 引用(Reference)类型 52 存储器分配和布局 53 this引用 55 Java编码约定 56 运算符的优先级 58 升级...
本教程“Java零基础自学之JDBC1-3课时”旨在帮助初学者理解并掌握JDBC的基本概念、使用方法以及常见操作。 在JDBC的第一课时中,通常会讲解以下内容: 1. **JDBC概述**:解释JDBC是什么,它的作用,以及如何在Java...
Java 自学之路的七条主线涵盖了从基础知识到进阶技术的广泛领域。以下是每个主线中的关键知识点的详细说明: 1. **J2SE 面向对象**:理解面向对象的基本概念,如封装、继承和多态。深入学习内存管理,包括对象创建...
第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.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 Java 编程语言注释设施提供库支持。 java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java....
### Java学习之路知识点详解 #### 一、J2SE面向对象——封装、继承、多态 ...通过以上知识点的学习,你可以建立起扎实的Java基础知识体系,并逐步深入到各个领域,最终成为一名合格的Java开发人员。
java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 Java 编程语言注释设施提供库支持。 java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java....
Java自学之路是一个全面掌握Java技术体系的过程,涵盖了从基础到高级的多个方面。以下是对标题和描述中涉及知识点的详细说明: 1. **J2SE**:Java标准版,是Java开发的基础,主要包括面向对象编程的三大特性:封装...
Java学习之路是一个逐步深入的过程,涉及多个层面的技术和框架。以下是对这个学习方向的详细解析: 1. **J2SE**:Java标准版是Java的基础,涵盖了面向对象编程、核心类库、IO流、多线程、网络编程、反射机制等内容...
标题中的知识点包括Java基础、Java图形用户界面(GUI)、Java多线程编程、网络编程、Java数据库连接(JDBC)、Java企业版(J2EE)、Java Web开发、Struts框架、MVC设计模式、Struts动态表单和验证框架、XML技术、...
在Java 2及后续版本中,JDBC得到了进一步的增强,例如引入了CallableStatement支持存储过程调用,PreparedStatement用于预编译SQL语句提高性能,以及RowSet接口实现了离线数据处理。此外,JDBC连接池技术如C3P0和...
《Java JDK 7学习笔记》将IDE操作纳为教学内容之一,使读者能与实践结合,提供的视频教学能更清楚地帮助读者掌握操作步骤。 内容简介 书籍 计算机书籍 《java jdk 7学习笔记》是作者多年来教学实践经验的总结...
java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 Java 编程语言注释设施提供库支持。 java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java....
1. `java.sql`包:包含了JDBC的基础功能,如`Connection`、`Statement`、`ResultSet`等核心接口和类,适用于J2SE环境。 2. `javax.sql`包:在J2EE环境中使用,提供了如`DataSource`、`PooledConnection`和`RowSet`等...
JDBC API中还涉及了数据库连接池、RowSet以及J2EE环境下的JDBC等高级概念,这些都是构建数据库应用程序的基础。 在学习Java的过程中,了解并掌握上述知识点对于成为一名熟练的Java开发者至关重要。通过阅读和实践...
Java数据库接口,简称JDBC(Java Database ...总之,JDBC作为Java与数据库交互的标准接口,是每个Java开发者必备的基础技能之一。通过深入学习和实践,你可以更好地理解和掌握数据库操作,提升你的Java应用开发能力。
java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 Java 编程语言注释设施提供库支持。 java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java....
1. `java.sql`包提供了基础的数据库编程服务,如创建连接、执行SQL语句、预编译SQL语句以及处理结果集等。以下是一些关键的接口和类: - `java.sql.Connection`:代表与数据库的会话,可以获取元数据信息,执行SQL...