JDBC以及相关技术学习(三)----运载查询结果的利器ResultSet

时间:2021-09-02 11:51:53

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()等方法更新记。