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:我越来越觉得官方文档的好处了,写的很清楚明白。以后就专注官方文档了。