首先结果集是ResultSet
它是一个接口。html
所谓的结果集ResultSet
,它表明的就是数据表(a table of data)。它一般经过执行一个Statement
对象的查询数据库来获得的。java
一个ResultSet
对象维持着指向当前数据行的一个光标,光标出事指向的第一行以前,使用next方法讲光标移动到下一行,档结果集对象中没有更多的行,就返回false。固然可使用while循环来遍历整个结果集。sql
默认的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
可能的RSType值以下。不指定的话默认分配TYPE_FORWARD_ONLY
如下详细解释各个类型:code
ResultSet.TYPE_FORWARD_ONLY
光标只能在结果集中向前移动。ResultSet.TYPE_SCROLL_INSENSITIVE
光标能够向前和向后滚动,结果集对建立结果集后发生的数据库所作的更改不敏感。ResultSet.TYPE_SCROLL_SENSITIVE
光标能够向前和向后滚动,结果集对建立结果集以后发生的其余数据库的更改敏感。htm
可能的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
方法能够经过如下两种方法使用:
在当前行更新列数据。在一个可滚动的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:我愈来愈以为官方文档的好处了,写的很清楚明白。之后就专一官方文档了。