【JDBC4.2】ResultSet

2024-05-31 22:58
文章标签 resultset jdbc4.2

本文主要是介绍【JDBC4.2】ResultSet,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ResultSet用来从查询语句中获取结果。对ResultSet的操作是反应到数据库游标(cursor)上的。

1.ResultSet分类

ResultSet可从三方面分类,分别是Types,Concurrency ,Holdability

ResultSet Types

从两个方面分类 1.操作的光标方式 2.数据库并发数据修改后ResultSet 的反馈。

ResultSet.TYPE_FORWARD_ONLY :Cursor 只能往前移动, 默认值
ResultSet.TYPE_SCROLL_INSENSITIVE: Cursor 可以前后移动, 但是对于数据库的改动不关心.
ResultSet.TYPE_SCROLL_SENSITIVE: Cursor 可以前后移动, 并且当数据库发生改动(仅update)的时候, ResultSet也会随之更新。
推荐这篇文章——文章链接,详细介绍了ResultSet.TYPE_SCROLL_SENSITIVE,但要注意 : mysql是不支持ResultSet.TYPE_SCROLL_SENSITIVE的!,可以使用Ms-SqlServer等其他DB测试。

DatabaseMetaData#supportsResultSetType(int ResultSetType) 可以测试你使用的数据库支持哪些ResultSet Types

ResultSet Concurrency

用来描述我们是否可以更新结果集中的数据到数据库. 有两个值可以用:
ResultSet.CONCUR_READ_ONLY: 结果集是只读的
ResultSet.CONCUR_UPDATABLE: 结果集是可以更新的

Cursor Holdability

这个属性是关于事务提交后, 是否需要关闭结果集。
HOLD_CURSORS_OVER_COMMIT: 当调用 Connection.commit()后, ResultSet 将不会关闭, 一般用于只读的结果集中.
CLOSE_CURSORS_AT_COMMIT : 当调用 Connection.commit()后, ResultSet 将会关闭

指定ResultSet Types/Concurrency /Holdability

可以使用Connection的createStatement方法指定:

Statement createStatement(int resultSetType, int resultSetConcurrency);
Statement createStatement(int resultSetType, int resultSetConcurrency,                              int resultSetHoldability);

也有生成PreparedStatement,CallableStatement类似的方法。

2.创建和操作ResultSet

游标

一个ResultSet包含了一个游标,当ResultSet被创建的时候,游标位于第一行数据的前面。ResultSet的一些方法对应了游标的移动:

ResultSet方法解释
boolean next()该方法的作用是将数据库游标向前移动一位,使得下一行成为当前行,当刚刚打开记录集对象时,数据库游标的位置在记录集的最前面,第一次使用next()方 法将会使数据库游标定位到记录集的第一行,第二次使用next()方法将会使数据库游标定位到记录集的第二行,以此类推。
boolean previous()该方法的作用是将数据库游标向后移动一位,使得上一行成为当前行.
boolean first()该方法的作用是将当前行定位到数据库记录集的第一行。
boolean last()该方法的作用刚好和first()方法相反
void beforeFirst()该方法的作用是将数据库游标移到记录集的最前面,位于记录集第一行的前面,如果记录集不包含任何的行该方法不产生作用。
void afterLast()该方法的作用是将数据库游标移到记录集的最后,位于记录集最后一行的后面,如果该记录集不包含任何的行该方法不产生作用。
boolean absolute(int row)该方法的作用是将记录集中的某一行设定为当前行,亦即将数据库游标移动到指定的行,参数row 指定了目标行的行号,这是绝对的行号,由记录集的第一行开始计算不是相对的行号.
boolean relative(int rows)该方法的作用也是将记录集中的某一行设定为当前行,但是它的参数rows 表示目标行相对于当前行的行号。

获取值

根据列顺序获取(顺序号从1开始):

while (resultSet.next()){System.out.println(resultSet.getString(1)+"\t"+resultSet.getInt(2));
}

根据列名称获取:

while (resultSet.next()){System.out.println(resultSet.getString("name")+"\t"+resultSet.getInt("age"));
}

根据列名称获取顺序号:

int nameIndex = resultSet.findColumn("name");//返回1
int weightIndex = resultSet.findColumn("weight");//抛出异常

注意:根据列名称获取一般先通过findColumn来获取顺序号,然后再根据列顺序获取得列值。所以在性能要求高的时候,尽量根据列顺序获取列值,当然,这降低了可读性。

修改

如果创建Statement时候制订了ResultSet.CONCUR_UPDATABLE,则通过ResultSet可以修改表数据。

修改:

resultSet.next();
resultSet.updateString("name","XXXXXX");
resultSet.updateRow();

同样,ResultSet也可以删除数据,对应的方法有ResultSet#deleteRow();
插入一行演示:

resultSet.moveToInsertRow();
resultSet.updateString(1, "XiaoMing");
resultSet.updateInt(2, 25);
resultSet.insertRow();

关闭ResultSet

下列情况下,ResultSet会被关闭:
1. 当执行ResultSet#close方法时候。
2. 创建该ResultSet的Statement和Connection被关闭时候。
3. Statement被重新执行。
4. Statement指定了CLOSE_CURSORS_AT_COMMIT,并提交。

这篇关于【JDBC4.2】ResultSet的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1019278

相关文章

如何判断ResultSet返回的结果集数据为空

rsOld = stmt.executeQuery("select * from randnumber");if(rsOld.next()){System.out.println("rsOld.next() is true");}else{System.out.println("rsOld.next() is false");}

JDBC开发之四大核心API:DriverManager Connection Statement ResultSet

DriverManager 方法都是静态的 注册驱动 在Mysql5之后我们就不用注册驱动了 在jar包里已经写好了 读取文件 第二个方法 如果连接的是主机mysql并且端口是默认的3306 则可以简化书写 代码书写 import java.sql.Connection;import java.sql.DriverManager;impo

JDBC ResultSet

JDBC ResultSet ResultSet包含记录 创建ResultSet ResultSet类型、并发性和可保持性 迭代ResultSet 访问列值 ResultSet类型 导航方法 ResultSet并发 更新ResultSet 将行插入ResultSet中 ResultSet可保持性 Java JDBC ResultSet接口表示数据库查询的结果。关于查询的文本

由MapTile引发的ResultSet的思考及实践

其实这篇文章应该是上周末来写的,但是苦逼啊。别人都抱怨工作996,我特么直接9117了,连轴转12天,完全没有个人时间,苦逼啊! 本来周末计划看完龙珠Z(日语)布欧篇 呢,给自己一个过儿童节的仪式感,结果也只看了一点,时间太紧张了。 要写的代码、要总结的东西太多了。至于ResultSet这个,从梳理思路、验证逻辑、查阅资料、理解原理、总结记录,又花了我小一天时间,搞到半夜。 一、背景

JDBC进化史--从JDBC1.0到JDBC4.2

JDBC是一种可用于执行SQL语句的JavaAPI(ApplicationProgrammingInterface应用程序设计接口)。它由一些Java语言编写的类和界面组成。JDBC为数据库应用开发人员、数据库前台工具开发人员提供了一种标准的应用程序设计接口,使开发人员可以用纯Java语言编写完整的数据库应用程序。 本文简单介绍了JDBC1.0--JDBC4.2的发展,简单介绍了每个版本的新特性

【JDBC4.2】JDBC中的Exception

JDBC中的异常类包括SQLException类和它的子类们。 1.SQLException SQLException包含下面信息: 信息项获取方法备注错误描述SQLException#getMessageSQLStateSQLException#getSQLStateerror codeSQLException#getMessagecauseSQLException#getCause递归获

【JDBC4.2】三、Statements

数据库localhost:3306 DBname: test 表:student 本编博客包括Statement接口,以及它的子接口PreparedStatement和CallableStatement Statement接口 Statement的获取 public class StatementTest {public static void main(String[] ar

【JDBC4.2】一、JDBC简介

注意:本编文章以下代码均为简写方式,无法执行,仅供参考 1. JDBC的由来 直接使用socket协议访问数据库 应用程序可以直接通过多种方式访问数据库,最普通的是通过socket访问数据库。以Mysql 为例:首先通过程序通过socket和数据库建立了TCP连接,把准备执行的SQL语句或命令封装成特定于Mysql 数据库的应用层数据包,发送给Mysql 数据库,Mysql数据库执行命令,

ResultSet的几个静态变量

createStatement(int resultSetType, int resultSetConcurrency)参数意义仔细地阅读了j2sdk1.4.2文档以及http://java.sun.com/j2se/1.4.2/docs/api/上的文档,对java.sql.Connection.createStatement(int,int)有了一些体会。根据j2sdk文档中的定义,resul

Mandarax查询之后判断ResultSet中是否存在answer的方法

注意到在mandarax自己提供的crm例子中有: public Discount getDiscount() {  try {   return (result == null) ? null : (Discount) result.getResult(Discount.class,QUERY_VARIABLE);  }  catch (InferenceException x) {   ret