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);
}
}
}
输出结果:

JDBC 学习笔记(八)—— ResultSet的更多相关文章
- JDBC 学习笔记(十)—— 使用 JDBC 搭建一个简易的 ORM 框架
1. 数据映射 当我们获取到 ResultSet 之后,显然这个不是我们想要的数据结构. 数据库中的每一个表,在 Java 代码中,一定会有一个类与之对应,例如: package com.gerrar ...
- JDBC学习笔记二
JDBC学习笔记二 4.execute()方法执行SQL语句 execute几乎可以执行任何SQL语句,当execute执行过SQL语句之后会返回一个布尔类型的值,代表是否返回了ResultSet对象 ...
- JDBC学习笔记一
JDBC学习笔记一 JDBC全称 Java Database Connectivity,即数据库连接,它是一种可以执行SQL语句的Java API. ODBC全称 Open Database Conn ...
- Learning ROS forRobotics Programming Second Edition学习笔记(八)indigo rviz gazebo
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...
- python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑
python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑 许多人在安装Python第三方库的时候, 经常会为一个问题困扰:到底应该下载什么格式的文件?当我们点开下载页时, 一般 ...
- Go语言学习笔记八: 数组
Go语言学习笔记八: 数组 数组地球人都知道.所以只说说Go语言的特殊(奇葩)写法. 我一直在想一个人参与了两种语言的设计,但是最后两种语言的语法差异这么大.这是自己否定自己么,为什么不与之前统一一下 ...
- 【opencv学习笔记八】创建TrackBar轨迹条
createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...
- JDBC 学习笔记(十一)—— JDBC 的事务支持
1. 事务 在关系型数据库中,有一个很重要的概念,叫做事务(Transaction).它具有 ACID 四个特性: A(Atomicity):原子性,一个事务是一个不可分割的工作单位,事务中包括的诸操 ...
- JDBC 学习笔记(六)—— PreparedStatement
1. 引入 PreparedStatement PreparedStatement 通过 Connection.createPreparedStatement(String sql) 方法创建,主要用 ...
- go微服务框架kratos学习笔记八 (kratos的依赖注入)
目录 go微服务框架kratos学习笔记八(kratos的依赖注入) 什么是依赖注入 google wire kratos中的wire Providers injector(注入器) Binding ...
随机推荐
- 洛谷 P2827 蚯蚓
题目描述 本题中,我们将用符号\lfloor c \rfloor⌊c⌋表示对c向下取整,例如:\lfloor 3.0 \rfloor= \lfloor 3.1 \rfloor=\lfloor 3.9 ...
- 使用com.sun.imageio.plugins.png.PNGMetadata读取图片的元数据
所谓图片元数据,就是除了我们肉眼看到的图片内容外,隐藏在这些内容背后的一些技术数据. 本文介绍如何使用Java代码将一张图片的隐藏信息读取出来. 首先不需要下载任何额外的Java库,用JDK自带的库就 ...
- UVA 11552 Fewest Flops(区间dp)
一个区间一个区间的考虑,当前区间的决策只和上一次的末尾有关,考虑转移的时候先统计当前区间出现过的字母以及种数ct 枚举上一个区间的末尾标号j,规定小于INF为合法状态,确定j之后看j有没有在当前的区间 ...
- Aho-Corasick自动机
在模式匹配问题中,如果模板有很多个,KMP算法就不太适合了.因为每次查找一个模板.都要遍历整个文本串.可不可以只遍历一次文本串呢?可以,方法是把所有模板组成一个大的状态转移图(称为$Aho-Coras ...
- guruguru
6576: guruguru 时间限制: 1 Sec 内存限制: 128 MB提交: 28 解决: 12[提交] [状态] [讨论版] [命题人:admin] 题目描述 Snuke is buyi ...
- oracle 数据导到 sql server
方法一: navicate:用法比较简单,选择工具-数据传输就可以了.目前测试了下暂时没遇到什么问题. 方法二: Microsoft SQL Server Migration Assistant 8. ...
- PAT (Basic Level) Practise (中文)- 1007. 素数对猜想 (20)
http://www.patest.cn/contests/pat-b-practise/1007 让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数.显然有 d1=1 且对 ...
- vue 报错unknown custom element解决方法
原因: 没有引入相关组件导致的 解决办法: 如果组件是按需引入的必须引入你当前用到的组件,否则会报错
- Java中 Character方法练习:字符串中英文字母个数 5435abc54abc3AHJ5 正则:matches("[a-zA-Z0-9]{1}")
package com.swift; public class String_Letter_Number_Test { public static void main(String[] args) { ...
- 在Scrollview中使用AutoLayout
AutoLayout 与 UIScrollView的相遇是一个不可避免的场景,像UITableView.UIWebView这些都是继承于UIScrollView的,关于它们的autolayout布局大 ...