ResultSet
大家好,我是EverdayForCode。你今天学习了吗?
通过官方文档|ResultSet带你走进Result世界
ResultSet家庭成员
ResultSet是长这样的:
public interface ResultSet extends Wrapper
所以ResultSet的父类接口是 Wrapper
下面给出ResultSet 子类接口:
CachedRowSet
, FilteredRowSet
, JdbcRowSet
, JoinRowSet
, RowSet
, SyncResolver
, WebRowSet
ResultSet背景
表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
ResultSet 对象具有指向其当前数据行的光标
。最初,光标被置于第一行之前
。next 方法将光标移动到下一行
;因为该方法在 ResultSet 对象没有下一行时返回 false,所以可以在 while 循环中使用它来迭代结果集。
默认的 ResultSet 对象不可更新,仅有一个向前移动的光标。因此,只能迭代它一次,并且只能按从第一行到最后一行的顺序进行。可以生成可滚动和/或可更新的 ResultSet 对象。
通过背景提取三个重点
- ResutSet有一个光标(类比指针)
- 最初,光标被置于第一行之前
- next 方法将光标移动到下一行
代码验证
此处涉及到JavaJDBC操作详细介绍参考下文:
花几分钟带你了解JDBC
import java.sql.*;
import util.JDBCUtil;
public class ResultSetTest {
public static void main(String args[]) {
String driver="com.mysql.cj.jdbc.Driver";
String user = "root";
String password = "passwordhkjmdj";
String url = "jdbc:mysql://localhost:3306/classmgr?characterEncoding=utf8&useSSL=false&serverTimezone=UTC";
Connection connection = null;
ResultSet rSet = null;
PreparedStatement pStatement = null;
JDBCUtil jUtil = new JDBCUtil();
connection = jUtil.getConnection(driver, url, user, password);
String sql = "select * from stuinfo where stuNum=?";
try {
pStatement = connection.prepareStatement(sql);
pStatement.setString(1, "201831063356");
rSet = pStatement.executeQuery();
//rSet.next();
System.out.println(rSet.getString("sex"));
jUtil.close(connection, pStatement, rSet);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
这段代码的意思是查询学号是201831063356学生的性别,返回结果应该只有一条记录,但是
结果报错了:Before start of result set
java.sql.SQLException: Before start of result set
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:127)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:95)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:87)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:61)
at com.mysql.cj.jdbc.result.ResultSetImpl.checkRowPos(ResultSetImpl.java:506)
at com.mysql.cj.jdbc.result.ResultSetImpl.getString(ResultSetImpl.java:869)
at com.mysql.cj.jdbc.result.ResultSetImpl.getString(ResultSetImpl.java:890)
at ResultSetTest.main(ResultSetTest.java:30)
报错的原因是:
最初,光标被置于第一行之前
需要用rSet.next()把光标移至下一行,也就是本次结果集的第一行
把注释去掉
//rSet.next();
rSet.next();
再次运行代码
女
结果正确
继续研究ResultSet背景
ResultSet 接口提供用于从当前行获取列值的 获取 方法( getBoolean、 getLong 等)。可以使用列的索引编号或列的名称获取值。一般情况下,使用列索引较为高效。
列从 1 开始编号
。为了获得最大的可移植性,应该按从左到右的顺序读取每行中的结果集列,每列只能读取一次
。
对于获取方法,JDBC 驱动程序尝试将底层数据转换为在获取方法中指定的 Java 类型,并返回适当的 Java 值。JDBC 规范有一个表,显示允许的从SQL 类型到 ResultSet 获取方法所使用的 Java 类型的映射关系
。
用作获取方法的输入的列名称不区分大小写
。用列名称调用获取方法时,如果多个列具有这一名称,则返回第一个匹配列的值
。在生成结果集的 SQL 查询中使用列名称时,将使用列名称选项。对于没有在查询中显式指定的列,最好使用列编号。如果使用列名称,则程序员应该注意保证名称唯一引用预期的列,这可以使用 SQL AS 子句确定。
当生成ResultSet 对象的 Statement 对象关闭、重新执行或用来从多个结果的序列获取下一个结果时,ResultSet 对象将自动关闭。
ResultSet 对象的列的编号、类型和属性由 ResultSet.getMetaData 方法返回的 ResulSetMetaData 对象提供。
今天就了解这么多,下次再更新