【Java学习】JDBC结果集

JDBC结果集

概述

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

所谓的结果集ResultSet,它表明的就是数据表(a table of data)。它一般经过执行一个Statement对象的查询数据库来获得的。java

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

建立指定类型的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:
第一种:api

createStatement(int RSType, int RSConcurrency);

第二种:并发

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

第三种:oracle

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

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

ResultSet类型

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

ResultSet.TYPE_FORWARD_ONLY 光标只能在结果集中向前移动。
ResultSet.TYPE_SCROLL_INSENSITIVE 光标能够向前和向后滚动,结果集对建立结果集后发生的数据库所作的更改不敏感。
ResultSet.TYPE_SCROLL_SENSITIVE 光标能够向前和向后滚动,结果集对建立结果集以后发生的其余数据库的更改敏感。htm

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:我愈来愈以为官方文档的好处了,写的很清楚明白。之后就专一官方文档了。

相关文章
相关标签/搜索