zoukankan      html  css  js  c++  java
  • JDBC 学习笔记(八)—— ResultSet

    JDBC 使用 ResultSet 来封装 SQL 的查询结果,可以将 ResultSet 类比为数据库表的查询结果。

    它拥有如下两个性质:

    • 可滚动。
    • 可更新。

    这两个性质,是在创建 Statement 的时候决定的。

    一般来说,我们使用以下 Connection 的方法创建 Statement:

    Statement createStatement() throws SQLException;
    

    但实际上,Connection 还提供以下方法:

    Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException;

    1. 可滚动

    ResultSet 通过移动指针来取出结果集的内容。

    以下方法的第一个参数,用来控制 ResultSet 的指针移动策略。

    Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException;

    ResultSet 内部设置了3个常量值,来控制指针移动的策略:

        int TYPE_FORWARD_ONLY = 1003;
    
        int TYPE_SCROLL_INSENSITIVE = 1004;
    
        int TYPE_SCROLL_SENSITIVE = 1005;
    • TYPE_FORWARD_ONLY,顾名思义,ResultSet 的指针只允许向后滚动,即只支持 next() 方法(SQLite 只支持这种模式)。
    • TYPE_SCROLL_INSENSITIVE 和 TYPE_SCROLL_SENSITIVE,这两个方法都能够实现任意的前后滚动,使用各种移动的 ResultSet 指针的方法,区别在于两者对于修改数据的敏感性。(TYPE_SCROLL_SENSITIVE 仅针对已经取出来的记录的更改(update、delete)敏感,对新增(insert)的数据不敏感,部分数据库驱动,这两个常量没有太大区别)

    ResultSet 提供了以下8个接口,来支持它可滚动的特性:

    // 向后滚动
    boolean next() throws SQLException;
    
    // 向前滚动
    boolean previous() throws SQLException;
    
    // 移动到相对当前行的第几行
    boolean relative( int rows ) throws SQLException;
    
    // 移动到整个 ResultSet 中的第几行
    boolean absolute( int row ) throws SQLException;
    
    // 移动到第一行
    boolean first() throws SQLException;
    
    // 移动到最后一行
    boolean last() throws SQLException;
    
    // 移动到第一行的前一行(没有数据)
    void beforeFirst() throws SQLException;
    
    // 移动到最后一行的后一行(没有数据)
    void afterLast() throws SQLException;
    

    2. 可更新

    以下方法的第二个参数,用来控制 ResultSet 的并发类型:

    Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException;

    这个参数可以接收以下2个值:

        int CONCUR_READ_ONLY = 1007;
    
        int CONCUR_UPDATABLE = 1008;
    • CONCUR_READ_ONLY 表示 ResultSet 是只读的并发模式(默认)。
    • CONCUR_UPDATABLE 表示 ResultSet 是可更新的并发模式。

    一旦将并发模式设置成 CONCUR_UPDATABLE,那么 JDBC API 就提供了一系列的 updateXxx(int columnIndex, Xxx value) 方法去更新 ResultSet 的数据。

    这些数据的 UPDATE,会直接反应到数据库中。

    3. Demo

    最后贴一下 ResultSet 的示例代码:

    package com.gerrard.demo;
    
    import com.gerrard.entity.Student;
    import com.gerrard.util.Connector;
    import com.gerrard.util.DriverLoader;
    
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public final class ResultSetDemo {
    
        public static void main(String[] args) {
            String sql = "SELECT * from STUDENT";
    
            DriverLoader.loadSqliteDriver();
            try (Connection conn = Connector.getSqlConnection();
                 Statement stmt = conn.createStatement();
                 ResultSet rs = stmt.executeQuery(sql)) {
    
                dealResultSet(rs);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    
        private static void dealResultSet(ResultSet rs) throws SQLException {
            while (rs.next()) {
                int id = rs.getInt(1);
                String name = rs.getString(2);
                String password = rs.getString(3);
                Student student = new Student(id, name, password);
                System.out.println(student);
            }
        }
    }
    

    输出结果:

  • 相关阅读:
    Android 程序员不得不收藏的个人博客(持续更新...)
    硬核讲解 Jetpack 之 LifeCycle 源码篇
    秉心说,不一样的 2019
    秉心说 2019 博文合集
    庖丁解牛 Activity 启动流程
    Jetpack Compse 实战 —— 全新的开发体验
    Box 黑科技 —— 支持手机端反编译 !
    “无处不在” 的系统核心服务 —— ActivityManagerService 启动流程解析
    如何正确的在 Android 上使用协程 ?
    【Medium 万赞好文】ViewModel 和 LIveData:模式 + 反模式
  • 原文地址:https://www.cnblogs.com/jing-an-feng-shao/p/9227085.html
Copyright © 2011-2022 走看看