ResultSet一般用于保存数据库返回的结果集,我们可以将其理解成一个与数据库表对应的二维表格。并且为其中保存了一个指针,我们使用该指针可以指向表格的任意一行,并对表格进行相关的操作。先看看上次的例子:
DBCToolSingleTon jDBCToolSingleTon = JDBCToolSingleTon.getInstance();
Connection conn = jDBCToolSingleTon.getConnection();
Statement statement = conn.createStatement();
String sql = "select * from UserInfo";
ResultSet resultSet = statement.executeQuery(sql);
while(resultSet.next()){
System.out.println(resultSet.getString("name"));
}
jDBCToolSingleTon.freeResource(conn, resultSet, statement);
注意,红色的部分,实际上代表了ResultSet的两种常用的操作,即对行进行定位以及列进行定位。我们可以想想,如果要操作一个表的数据,首先先找到某一行,然后再找某一列,就可以找到具体的数据了。
另外,为了方便我们理解,我们可以理解ResultSet中的表格,在其第一行上面还有一行空的数据,在最后一行下面也有一行空数据。
(1)列定位相关的方法
resultSet.getString("name")//即从表格中取出列名为name的列,当然也可以采用resultSet.getString(index)取出列号为Index的字符串数据。
理解了这个,我们就可以理解:
resultSet.getLong("name"):获取名称为Name的Long类型值
resultSet.getByte("name"):获取名称为Name的Byte类型值
resultSet.getTimestamp("name"):获取名称为Name的Timestamp类型值
getBinaryStream 返回只提供数据库原字节而不进行任何转换的流。
getAsciiStream 返回提供单字节 ASCII 字符的流。
getUnicodeStream 返回提供双字节 Unicode 字符的流
........照此类推。
(2)关于行定位
当然我们最常用的是resultSet.next().
我们知道,当执行完脚本后,ResultSet把指针指在空行的位置,当执行resultSet.next().时,系统会判断第一行是否有数据,如果有就返回true并将指针指向第一行。
next():定位到下一行
previous():定位到上一行
absolute(int row):定位到第row行
relative(int rows):定位到当前行+rows行
first():定位到第一行
last():定位到最后一行
afterLast():定位到最后一行后的空行
beforeFirst():定位到第一行之前的空行
还有一些列判断是否第一行之类的方法,比如:
isFirst()isBeforeFirst() isLast(),这些就不再一一说明。
(3)对ResultSet的数据进行更新的方法
public void updateString(int columnIndex ,String x); 或public void updateString(String columnName ,String x);
对某一列的String类型的数据进行更新,其他的照此类推,如:
public void updateLong(int columnIndex ,Long x); 或public void updateLong(String columnName ,Long x);
public void updateObject(int columnIndex ,Object x); 或public void updateObject(String columnName ,Object x);
..........................
rowDeleted():当前记录集是否被删除
rowInserted():当前记录集是否新行
rowUpdated():当前记录集是否更新
insertRow(): 插入新行到当前记录集
updateRow():更新当前行的数据
deleteRow():删除当前行
refreshRow():跟数据库的记录进行同步
增加:
1 调用moveToInsertRow()方法;
2 调用updateXXX()方法指定插入行各列的值;
3 调用insertRow()方法往数据库中插入新的行。
更新:
1 定位到需要修改的行(使用absolute()relative()等方法定位);
2 使用相应updateXXX()方法设定某行某列的新值;XXX 所代表的Java数据类型,必须可以映射为某列的JDBC数据类型,如果希望rollback 该项操作,请在调用updateRow()方法以前,使用cancelRowUpdates()方法,这个方法可以将某行某列的值复原;
3 使用updateRow()方法完成UPDATE的操作。
删除:
1 定位到需要修改的行(使用absolute()relative()等方法定位);
2 使用deleteRow()
(4)其他的方法
close()关闭结果集
findColumn(String name)获取某一列的索引号
getCursorName()获取SQL游标名
setFetchSize():是指从服务器获取数据时,一次获取的数量,也即使缓存数据的数量,比如执行next时,一次性获取10行数据,这样下一次执行next()就可以直接从内存中取,对性能优化相当重要
getMetaData():获取结果集的元数据,相当重要,是很多ORM框架的基础,后面还会说到。
getRow():获取行号,通常与last()配合使用,获取有多少行
getConcurrency():用于检查结果是否可以更新
cancelRowUpdates():取消更新
(5)与ResultSet相关的一些常量
ResultSet.TYPE_FORWARD_ONLY
只能向前滚动(这是默认值)
ResultSet.TYPE_SCROLL_INSENSITIVE\ Result.TYPE_SCROLL_SENSITIVE
这两个方法都能够实现任意的前后滚动,使用各种移动的ResultSet指针的方法。二者的区别在于前者对于修改不敏感,而后者对于修改敏感。
ResultSet.CONCUR_READ_ONLY
设置为只读类型的参数。
ResultSet.CONCUR_UPDATABLE
设置为可修改类型的参数。
ResultSet.HOLD_CURSORS_OVER_COMMIT
表示修改提交时ResultSet不关闭.
ResultSet.CLOSE_CURSORS_AT_COMMIT
表示修改提交时ResultSet关闭.
FETCH_FORWARD
该常数的作用是指定处理记录集中行的顺序,是由前到后即从第一行开始处理一直到最后一行.
FETCH_REVERSE
该常数的作用是指定处理记录集中行的顺序,是由后到前即从最后一行开始处理一直到第一行.
FETCH_UNKNOWN
该常数的作用是不指定处理记录集中行的顺序,由JDBC 驱动程序和数据库系统决定.
TYPE_FORWARD_ONLY
该常数的作用是指定数据库游标的移动方向是向前,不允许向后移动即只能使ResultSet 接口的next()方法而不能使用previous()方法否则会产生错误.
TYPE_SCROLL_INSENSITIVE
该常数的作用是指定数据库游标可以在记录集中前后移动,并且当前数据库用户获取的记录集对其他用户的操作不敏感;就是说,当前用户正在浏览记录集中的数据,与此同时,其他用户更新了数据库中的数据,但是当前用户所获取的记录集中的数据不会受到任何影响。
TYPE_SCROLL_SENSITIVE
该常数的作用是指定数据库游标可以在记录集中前后移动,并且当前数据库用户获取的记录集对其他用户的操作敏感,就是说,当前用户正在浏览记录集,但是其它用户的操作使数据库中的数据发生了变化,当前用户所获取的记录集中的数据也会同步发生变化,这样有可能会导致非常严重的错误产生建议慎重使用该常数。
CONCUR_READ_ONLY
该常数的作用是指定当前记录集的协作方式(concurrencymode)为只读;一旦使用了这个常数,那么用户就不可以更新记录集中的数据。
CONCUR_UPDATABLE
该常数的作用是指定当前记录集的协作方式(concurrencymode)为可以更新;一旦使用了这个常数,那么用户就可以使用updateXXX()等方法更新记。