首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

Inside JDBC(3)

2012-11-12 
Inside JDBC(三)??? ??? 在上一篇Inside JDBC(二)中,介绍了Connection接口的功能,以及DatabaseMetaData接

Inside JDBC(三)


??? ??? 在上一篇Inside JDBC(二)中,介绍了Connection接口的功能,以及DatabaseMetaData接口。本篇主要介绍
SQL语句对象及结果集。
??? ??? 数据库连接建立好之后,我们就可以与数据库进行交互了,这种交互主要体现为执行各种SQL语句。SQL
语句的执行需要Statement对象来完成。为了讲述SQL语句对象的具体用法,先给大家介绍结果集(ResultSet)
??? ??? 结果集由java.sql.ResultSet接口定义,接口起到定义规范(标准)的作用,就是说任何JDBC驱动都需要
实现ResultSet接口,提供封装查询结果的功能,从而符合JDBC规范。在Connector/J中,实现ResultSet接口的
类是com.mysql.jdbc.ResultSetImpl类。
??? ??? 我们可以简单把结果集理解成执行Select语句之后符合条件的数据从数据库传输到内存中形成的一张内存
数据表,此表具有表头、列索引、行索引以及定位用的行指示器。行、列索引都是从1开始计数行指示器停留
在当前行,但是对于刚刚产生的结果集,行指示器停留在第一行之前。那么如何来移动行指示器呢?大家肯定
能猜到了ResultSet定义了用于移动行指示器的方法,但是别急,移动行指示器是有前提的,就是要看结果集的
类型。结果集类型的指定用以下代码:

?


在getData方法中,指定ResultSet的类型为只读不可滚动的结果集(CONCUR_READ_ONLY,TYPE_FORWARD_ONLY)。

??? ??? ResultSet还提供了多个导航方法,分别如下:


boolean absolute(int row)绝对定位到row指定的行,row如果是负数则相对最后一行。例如定位到第五行为
absolute(5),定位到最后一行absolute(-1);
void afterLast() 定位到最后一行之后。
void beforeFirst() 定位到第一行之前。
boolean first() 定位到第一行。
boolean isAfterLast() 是否位于最后一行之后。
boolean isBeforeFirst() 是否位于第一行之前。
boolean isFirst() 是否位于第一行。
boolean isLast() 是否位于最后一行。
boolean last() 定位到最后一行。
boolean next() 逐行前移。
boolean relative(int rows)相对当前位置移动rows行,rows可正可负,0时不移动。
boolean previous() 逐行后退。

如果需要把上例数据倒序输出,需要把handleData改为:

?



首先需要把行指示器定位于结果集最后一行之后,使用rs.afterLast(),再逐行后退rs.previous();

同时把getData改为:

????
如果getData方法仍然是ResultSet.TYPE_FORWARD_ONLY,是不允许rs.afterLast()这些非next()操作的。(Connector/J
没有严格遵守JDBC规范,允许TYPE_FORWARD_ONLY下非next()操作,要试验需要用其他驱动,如Oracle驱动)。

??? ??? ResultSet还提供了从当前行获取数据的方法getXXX(),参数可以使列索引或者是结果集“表头”的列名。
如果把上例的sql语句改为:
String sql = "select stationId,trainNum,station,outTime,dayTime,sitePrice as 价格 from station where trainNum='k339'";
第三列的数据可以用rs.getDouble(3)或者rs.getDouble("价格")获得。

??? ??? ResultSet还提供了修改数据的方法:
void updateXXX(int columnIndex,XXX value)或者void updateXXX(int columnName,XXX value)用于标示当前行
columnIndex或columnName指定列用新数据value进行更新。
void updateRow()用于发出更新操作。
需要注意的是,如果需要更新数据,需要结果集中包含主键数据,上述例题中为station表的stationId列;同时
结果集类型需要时ResultSet.CONCUR_UPDATABLE类型。例如在本例中我们新增更新方法:

?


main方法修改为:

?


moveToInsertRow()把行指示器移动到用于新增行的临时区域,用updateXXX方法标记新数据,再用insertRow方法发出insert操作,最后用moveToCurrentRow方法把行指示器移回当前行。

如果需要删除当前行数据,只需调用rs.deleteRow()方法,这项功能相对简单,就不举例了,节省篇幅。SQL语句对象还是留到下篇在描述吧。

热点排行