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

它拥有如下两个性质:

  • 可滚动。
  • 可更新。

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

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

  1. Statement createStatement() throws SQLException;

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

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

1. 可滚动

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

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

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

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

  1. int TYPE_FORWARD_ONLY = 1003;
  2.  
  3. int TYPE_SCROLL_INSENSITIVE = 1004;
  4.  
  5. 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个接口,来支持它可滚动的特性:

  1. // 向后滚动
  2. boolean next() throws SQLException;
  3.  
  4. // 向前滚动
  5. boolean previous() throws SQLException;
  6.  
  7. // 移动到相对当前行的第几行
  8. boolean relative( int rows ) throws SQLException;
  9.  
  10. // 移动到整个 ResultSet 中的第几行
  11. boolean absolute( int row ) throws SQLException;
  12.  
  13. // 移动到第一行
  14. boolean first() throws SQLException;
  15.  
  16. // 移动到最后一行
  17. boolean last() throws SQLException;
  18.  
  19. // 移动到第一行的前一行(没有数据)
  20. void beforeFirst() throws SQLException;
  21.  
  22. // 移动到最后一行的后一行(没有数据)
  23. void afterLast() throws SQLException;

2. 可更新

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

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

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

  1. int CONCUR_READ_ONLY = 1007;
  2.  
  3. 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 的示例代码:

  1. package com.gerrard.demo;
  2.  
  3. import com.gerrard.entity.Student;
  4. import com.gerrard.util.Connector;
  5. import com.gerrard.util.DriverLoader;
  6.  
  7. import java.sql.Connection;
  8. import java.sql.ResultSet;
  9. import java.sql.SQLException;
  10. import java.sql.Statement;
  11.  
  12. public final class ResultSetDemo {
  13.  
  14. public static void main(String[] args) {
  15. String sql = "SELECT * from STUDENT";
  16.  
  17. DriverLoader.loadSqliteDriver();
  18. try (Connection conn = Connector.getSqlConnection();
  19. Statement stmt = conn.createStatement();
  20. ResultSet rs = stmt.executeQuery(sql)) {
  21.  
  22. dealResultSet(rs);
  23. } catch (SQLException e) {
  24. e.printStackTrace();
  25. }
  26. }
  27.  
  28. private static void dealResultSet(ResultSet rs) throws SQLException {
  29. while (rs.next()) {
  30. int id = rs.getInt(1);
  31. String name = rs.getString(2);
  32. String password = rs.getString(3);
  33. Student student = new Student(id, name, password);
  34. System.out.println(student);
  35. }
  36. }
  37. }

输出结果:

JDBC 学习笔记(八)—— ResultSet的更多相关文章

  1. JDBC 学习笔记(十)—— 使用 JDBC 搭建一个简易的 ORM 框架

    1. 数据映射 当我们获取到 ResultSet 之后,显然这个不是我们想要的数据结构. 数据库中的每一个表,在 Java 代码中,一定会有一个类与之对应,例如: package com.gerrar ...

  2. JDBC学习笔记二

    JDBC学习笔记二 4.execute()方法执行SQL语句 execute几乎可以执行任何SQL语句,当execute执行过SQL语句之后会返回一个布尔类型的值,代表是否返回了ResultSet对象 ...

  3. JDBC学习笔记一

    JDBC学习笔记一 JDBC全称 Java Database Connectivity,即数据库连接,它是一种可以执行SQL语句的Java API. ODBC全称 Open Database Conn ...

  4. Learning ROS forRobotics Programming Second Edition学习笔记(八)indigo rviz gazebo

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...

  5. python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑

    python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑 许多人在安装Python第三方库的时候, 经常会为一个问题困扰:到底应该下载什么格式的文件?当我们点开下载页时, 一般 ...

  6. Go语言学习笔记八: 数组

    Go语言学习笔记八: 数组 数组地球人都知道.所以只说说Go语言的特殊(奇葩)写法. 我一直在想一个人参与了两种语言的设计,但是最后两种语言的语法差异这么大.这是自己否定自己么,为什么不与之前统一一下 ...

  7. 【opencv学习笔记八】创建TrackBar轨迹条

    createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...

  8. JDBC 学习笔记(十一)—— JDBC 的事务支持

    1. 事务 在关系型数据库中,有一个很重要的概念,叫做事务(Transaction).它具有 ACID 四个特性: A(Atomicity):原子性,一个事务是一个不可分割的工作单位,事务中包括的诸操 ...

  9. JDBC 学习笔记(六)—— PreparedStatement

    1. 引入 PreparedStatement PreparedStatement 通过 Connection.createPreparedStatement(String sql) 方法创建,主要用 ...

  10. go微服务框架kratos学习笔记八 (kratos的依赖注入)

    目录 go微服务框架kratos学习笔记八(kratos的依赖注入) 什么是依赖注入 google wire kratos中的wire Providers injector(注入器) Binding ...

随机推荐

  1. SGU 258 Almost Lucky Numbers 接近幸运数(数位DP)

    题意: 定义一个具有2n位的正整数,其前n位之和与后n位之和相等,则为lucky数.给定一个区间,问有多少个正数可以通过修改某一位数从而变成lucky数?注意不能含前导0. 思路: 我的想法是记录那些 ...

  2. BZOJ 1137: [POI2009]Wsp 岛屿 半平面交

    1137: [POI2009]Wsp 岛屿 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 165  Solved: ...

  3. java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config

    今天写SpringMvc时,遇到这样一个问题: java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config at org.sp ...

  4. UVA 246 10-20-30 10-20-30游戏 模拟+STL双端队列deque

    Input Each input set consists of a sequence of 52 integers separated by spaces and/or ends of line. ...

  5. String java

    https://www.golinuxcloud.com/java-interview-questions-answers-experienced-2/ 75. What is the meaning ...

  6. 线程的sleep方法

  7. Makefile 编写实例

    make命令常用的三个选项: 1.-k:它的作用是让make命令在发现错误的时候仍然继续执行.我们可以利用这个选项在一次操作中发现未编译成功的源文件. 2.-n:它的作用是让make命令输出将要执行的 ...

  8. java基础—static关键字

    一.static关键字

  9. SpringMVC 项目中引用其他 Module 中的方法

    1. 将要引用的Module 引入项目中 2. 在主Module中添加依赖, 3. 被引用的类必须放在 Module 中/src/下的某个package中,否则引用不到(重要)

  10. 详解wordpress如何把文件保存到阿里云OSS上!

    自己搞了一个Wordpress的博客,装完之后一直晾着没管,最近闲来开荒.为了减小服务器的带宽.存储.CUP的压力,决定把博客中的所有文件都保存到阿里云OSS上面. 关于这个问题,自己去调用OSS的S ...