zoukankan      html  css  js  c++  java
  • 普通结果集ResultSet和离线结果集RowSet(四)

    数据库的查询操作会得到一系列数据,JDBC API也提供了相关对象来接收查询结果集。

    一、ResultSet

    java.sql.ResultSet接口表示数据库查询的结果集。

    JDBC提供以下连接方法来创建具有所需ResultSet的语句:

    • createStatement(int RSType, int RSConcurrency);
    • prepareStatement(String SQL, int RSType, int RSConcurrency);
    • prepareCall(String sql, int RSType, int RSConcurrency);

    RSType参数表示ResultSet对象的类型,RSConcurrency是两个ResultSet常量之一,用于指定结果集是只读还是可更新。

    1. ResultSet类型

    ResultSet.TYPE_FORWARD_ONLY:光标只能在结果集中向前移动。
    ResultSet.TYPE_SCROLL_INSENSITIVE:光标可以向前和向后滚动,结果集对创建结果集后发生的数据库所做的更改不敏感。
    ResultSet.TYPE_SCROLL_SENSITIVE:光标可以向前和向后滚动,结果集对创建结果集之后发生的其他数据库的更改敏感。

    如果不指定任何ResultSet类型,默认是TYPE_FORWARD_ONLY值。

    2. ResultSet的并发性

    ResultSet.CONCUR_READ_ONLY 创建只读结果集
    ResultSet.CONCUR_UPDATABLE 创建可更新的结果集
    如果不指定任何并发类型,默认是CONCUR_READ_ONLY值。

    3. 查看结果集

    ResultSet接口包含数十种获取当前行数据的方法。
    每个可能的数据类型都有一个get方法,每个get方法有两个版本,一个是采用列名称,一个是采用列索引(从1开始)。

    注意:ResultSet在数据库连接关闭后(close掉)后就不能使用了,必须一直保持连接的状态才能使用,否则需要使用到RowSet离线结果集。

    二、RowSet

    RowSet接口继承自ResultSet接口。与ResultSet相比,RowSet默认是可滚动、可更新、可序列化的结果集,可以作为JavaBean来方便地在网络上传输,用于同步两端数据。对于离线RowSet而言,程序从创建RowSet时就已经把数据load进内存,因此可以更好地利用内存性能,降低数据库服务器的负载,提高程序性能。

    1. 什么是离线结果集

    如果直接使用ResultSet, 程序在得到ResultSet记录之后需要立即使用,否则一旦关闭Connection就不再可用,要解决这种情况要么将ResultSet的结果转换成JavaBean存储,要么在Connection关闭之前完成所有操作,不过这些办法都不太方便。

    但是通过离线的RowSet却能很好地解决这个问题。RowSet可以将ResultSet的结果集封装成RowSet对象,存储在内存中进行数据操作,而Connection则可以断开。直到数据操作完成之后,重新再连接数据库,进行数据同步即可。

    总结起来就是说,RowSet可以把数据库的数据放在内存中进行离线读写操作,操作完成之后再同步到数据库中去。

    RowSet接口下包含了JdbcRowSet, CachedRowSet, FilteredRowSet, JoinRowSet, WebRowSet,除了JdbcRowSet之外,后面四个都是离线RowSet。

    2. RowSetFactory

    在JDK1.6及以前的版本中,如果要使用JdbcRowSet,则必须使用JdbcRowSetImpl的构造器来构造对象,但是在编译的时候会有警告,因此JdbcRowSetImpl是内部专用的API,在未来版本可能会删除。这种获取JdbcRowSet的方式是不推荐的,因为使用内部API,在将来的版本中可能不兼容,而且这样的程序直接与具体的实现类JdbcRowSetImpl耦合,不利于维护和升级。

    在JDK1.7中,引入了RowSetFactory和RowSetProvider接口,其中RowSetProvider负责创建RowSetFactory,而RowSetFactory则可以通过以下方法创建RowSet实例。

    • createCachedRowSet()
    • createFilteredRowSet()
    • createJdbcRowSet()
    • createJoinRowSet()
    • createWebRowSet()

    创建对象时可以传入ResultSet实例填充RowSet,也可以在创建JdbcRowSet实例之后通过execute(sql)方法得到数据填充RowSet。

    //创建RowSetFactory
    RowSetFactory rowSetFactory = RowSetProvider.newFactory();
    //创建指定的RowSet
    CachedRowSet rowSet = rowSetFactory.createCachedRowSet();
    //将ResultSet放到RowSet中
    rowSet.populate(resultSet);

    3. 离线查询分页

    所谓分页,就是一次只装载ResultSet的某几条记录,这样可以避免CachedRowSet内存占用过大的问题。

    CachedRowSet控制分页的方法:

    • populate(ResultSet rs, int startRow) , 从第startRow行开始装载
    • setPageSize(int pageSize), 设置每页大小
    • previousPage(); 在底层ResultSet可用情况下,让CachedRowSet读取上一页记录
    • nextPage() 在底层ResultSet可用情况下,让CachedRowSet读取下一页记录
    import javax.sql.rowset.CachedRowSet;
    import javax.sql.rowset.RowSetFactory;
    import javax.sql.rowset.RowSetProvider;
    import java.sql.*;
    
    public class ConnectionManager {
        private static final String URL = "jdbc:mysql://192.168.178.5:12345/cloudDB01";
        private static final String USER_NAME = "root";
        private static final String PASSWORD = "123456";
        
        
        static{
            try {
                Class.forName("com.mysql.jdbc.Driver");
            } catch (ClassNotFoundException e) {
                System.out.println("加载MySQL数据库驱动失败");
            }
        }
    
        public static void main(String[] args) throws Exception{
            String sql = "select * from dept";
            Connection connection = DriverManager.getConnection(URL,USER_NAME, PASSWORD);
            PreparedStatement psmt = connection.prepareStatement(sql);
            ResultSet resultSet = psmt.executeQuery();
    
            RowSetFactory rowSetFactory = RowSetProvider.newFactory();
            CachedRowSet rowSet = rowSetFactory.createCachedRowSet();
            rowSet.setPageSize(2);
            rowSet.populate(resultSet, 2);//从第二行开始
            while (rowSet.next()){
                System.out.println(rowSet.getString(2));
            }
        }
    }

    注:CachedRowSet是一次性加载所有数据,是内存分页,并不是物理分页,实际开发中用到的也较少。

  • 相关阅读:
    xx
    office 2016 下载链接
    Revit 2019 下载链接
    AE cc 2019 下载链接
    Premiere Pro cc 2019 下载链接
    Photoshop cc 2019 下载链接
    百度云单机版、软件包及教程
    Visual Studio 2017 软件包及教程
    归并排序:逆序对问题
    归并排序:小和问题
  • 原文地址:https://www.cnblogs.com/myitnews/p/11846087.html
Copyright © 2011-2022 走看看