【Java学习】JDBC结果集

JDBC结果集

概述

首先结果集是ResultSet它是一个接口。

所谓的结果集ResultSet,它代表的就是数据表(a table of data)。它通常通过执行一个Statement对象的查询数据库来得到的。

一个ResultSet对象维持着指向当前数据行的一个光标,光标出事指向的第一行之前,使用next方法讲光标移动到下一行,档结果集对象中没有更多的行,就返回false。当然可以使用while循环来遍历整个结果集。

创建指定类型的ResultSet对象

默认的ResultSet对象是不可更新的并且有一个仅仅可以向前移动的光标。这说明,你仅仅能遍历一次结果集--从第一行到最后一行。当然,可以使ResultSet变得可以滚动和或可更新。看下面的代码:

Statement stmt = con.createStatement(Result.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("SELECT a,b FROM TABLE2");
//rs是可滚动的、不会被其他人改变、可更新。

我们来更加详细的说明一下:我们已经知道ResultSet是一个借口,我们以前都是通过Statement执行查询方法,来返回一个ResultSet对象。其中我们只能通过设置Statement对象,来设置返回的ResultSet对象。其中的猫腻就是在创建Statement对象的方法中。其中Connection提供一下方法来创建所需的ResultSet:
第一种:

createStatement(int RSType, int RSConcurrency);

第二种:

prepareStatement(String SQL, int RSType, int RSConcurrency);

第三种:

prepareCall(String sql, int RSType, int RSConcurrency);

这样来看都有有哪些RSType呢,有哪些RSConcurrency呢?

ResultSet类型

可能的RSType值如下。不指定的话默认分配TYPE_FORWARD_ONLY
以下详细解释各个类型:

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

ResultSet并发性

可能的RSConcurrency如下,不指定任何并发类型,将自动份分配CONCUR_READ_ONLY

ResultSet.CONCUR_READ_ONLY 创建只读结果集,这是默认值。
ResultSet.CONCUR_UPDATABLE 创建可更新的结果集

移动光标的方法

进行数据操作,或者列数据更新,都需要移动光标。
下面的一些方法详细说明:

1 public void beforeFirst() throws SQLException 将光标移动到第一行之前
2 public void afterLast() throws SQLException 将光标移动到最后一行之后。
3 public boolean first() throws SQLException 将光标移动到第一行。
4 public void last() throws SQLException 将光标移动到最后一行。
5 public boolean absolute(int row) throws SQLException 将光标移动到指定的行。
6 public boolean relative(int row) throws SQLException 从当前指向的位置,将光标向前或向后移动给定行数。
7 public boolean previous() throws SQLException 将光标移动到上一行。 如果上一行关闭结果集,此方法返回false。
8 public boolean next() throws SQLException 将光标移动到下一行。 如果结果集中没有更多行,则此方法返回false。
9 public int getRow() throws SQLException 返回光标指向的行号。
10 public void moveToInsertRow() throws SQLException 将光标移动到结果集中的特殊行,该行可用于将新行插入数据库。当前光标位置被记住。
11 public void moveToCurrentRow() throws SQLException 如果光标当前位于插入行,则将光标移回当前行; 否则,此方法什么也不做

查看结果集

结果集ResultSet接口提供了更多的getter方法,如:getInt() getLong() getBoolean(),通过这些方法,就可以从当前行中获取列数据。列数据可以通过使用索引值,也可以通过使用列的名字。通常使用索引值会更加高效,注意是从1开始的。
为了最大程度的简便,ResultSet每一行的列数据应该从左往右读,并且只能读一次。

通过列名字,来获取列数据的getter方法,它的大小写是不敏感的。当使用getter方法有列名相同的情况时,将返回第一个匹配的列数据。使用列名是不明确的,所以最好还是用索引值。

除了getter方法,在JDBC2.0API中,又添加了updater方法。getter里面的参数同样适用于updater

更新结果集

与getter方法一样,可以通过类名称来更新 也可以通过列索引

updater方法可以通过以下两种方法使用:

第一种update方法

在当前行更新列数据。在一个可滚动的ResultSet 对象,光标可以像前移动也可以向后移动到一个特定的位置。以下代码演示了,更新第五行的NAME列数据:

rs.absolute(5);//将光标移动到第5行
rs.updateString("Name","AINSWORTH");//更新数据
rs.updateRow();//更新到元数据(源表)
第二种方法

向插入行中插入列数据,怎么理解呢?一个可更新的ResultSet对象有一个特殊的行,这个行能够作为工作行区域,用来创建被插入的行。以下代码体现了向插入行中插入列数据。

rs.moveToInsertRow();//将光标移动到插入行。
rs.upsateString(1,"AINSWORTH");//将第一列,更新数据
rs.updateInt(2,35);//将第2列,更新数据
rs.updateBoolean(3,true);//第三列
rs.insertRow();//将这三列数据插入到rs中,并且更新到元数据中。
rs.moveToCurrentRow();

当Statement对象关闭后,结果集能够自动的关闭。
同时ResultSet对象中的列索引,类型和参数,可以通过Resultset.getMetaData()方法返回。

参考资料

Interface ResultSet
易百教程
ps:我越来越觉得官方文档的好处了,写的很清楚明白。以后就专注官方文档了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值