结果集(Result Sets)
从数据库查询读取数据的SQL语句,返回结果集中的数据。 SELECT语句是从数据库中选择行并在结果集中查看行的标准方法。 java.sql.ResultSet接口表示数据库查询的结果集。
ResultSet对象维护一个指向结果集中当前行的游标。 术语“结果集”指的是ResultSet对象中包含的行和列数据。
ResultSet接口的方法可以分为三类 -
Navigational methods:用于移动光标。
Get methods:用于查看光标指向的当前行的列中的数据。
Update methods:用于更新当前行的列中的数据。 然后,也可以在底层数据库中更新更新。
光标可根据ResultSet的属性移动。 在创建生成ResultSet的相应Statement时,将指定这些属性。
JDBC提供了以下连接方法来创建具有所需ResultSet的语句 -
createStatement(int RSType, int RSConcurrency);
prepareStatement(String SQL, int RSType, int RSConcurrency);
prepareCall(String sql, int RSType, int RSConcurrency);
第一个参数表示ResultSet对象的类型,第二个参数是两个ResultSet常量之一,用于指定结果集是只读还是可更新。
ResultSet的类型
可能的RSType如下。 如果未指定任何ResultSet类型,则将自动获得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 | 创建可更新的结果集。 |
到目前为止我们编写的所有示例都可以编写如下,它初始化一个Statement对象以创建一个只进,只读的ResultSet对象 -
try {
Statement stmt = conn.createStatement(
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY);
}
catch(Exception ex) {
....
}
finally {
....
}
导航结果集
ResultSet接口中有几个涉及移动光标的方法,包括 -
SN | 方法和描述 |
---|---|
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接口包含许多用于获取当前行数据的方法。
每种可能的数据类型都有一个get方法,每个get方法有两个版本 -
一个接受列名称的人。
一个接受列索引的。
例如,如果您要查看的列包含int,则需要使用ResultSet的getInt()方法之一 -
SN | 方法和描述 |
---|---|
1 | public int getInt(String columnName) throws SQLException 返回名为columnName的列中当前行的int。 |
2 | public int getInt(int columnIndex) throws SQLException 返回指定列索引中当前行的int。 列索引从1开始,表示行的第一列为1,行的第二列为2,依此类推。 |
类似地,ResultSet接口中的get方法适用于八种Java原始类型中的每一种,以及常见类型,如java.lang.String,java.lang.Object和java.net.URL。
还有获取SQL数据类型java.sql.Date,java.sql.Time,java.sql.TimeStamp,java.sql.Clob和java.sql.Blob的方法。 有关使用这些SQL数据类型的更多信息,请查看文档。
为了更好地理解,让我们研究一下查看 - 示例代码 。
更新结果集
ResultSet接口包含一组更新方法,用于更新结果集的数据。
与get方法一样,每种数据类型都有两种更新方法 -
一个接受列名称的人。
一个接受列索引的。
例如,要更新结果集的当前行的String列,您将使用以下updateString()方法之一 -
SN | 方法和描述 |
---|---|
1 | public void updateString(int columnIndex, String s) throws SQLException 将指定列中的String更改为s的值。 |
2 | public void updateString(String columnName, String s) throws SQLException 与前一个方法类似,不同之处在于列的名称由其名称而不是索引指定。 |
有八种原始数据类型的更新方法,以及java.sql包中的String,Object,URL和SQL数据类型。
更新结果集中的行会更改ResultSet对象中当前行的列,但不会更改基础数据库中的列。 要更新对数据库中行的更改,需要调用以下方法之一。
SN | 方法和描述 |
---|---|
1 | public void updateRow() 通过更新数据库中的相应行来更新当前行。 |
2 | public void deleteRow() 从数据库中删除当前行 |
3 | public void refreshRow() 刷新结果集中的数据以反映数据库中的任何最新更改。 |
4 | public void cancelRowUpdates() 取消对当前行进行的任何更新。 |
5 | public void insertRow() 在数据库中插入一行。 只有在光标指向插入行时才能调用此方法。 |
为了更好地理解,让我们研究更新 - 示例代码 。