关于Java-JDBC-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 对象。

通过背景提取三个重点

  1. ResutSet有一个光标(类比指针)
  2. 最初,光标被置于第一行之前
  3. 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 对象提供。

今天就了解这么多,下次再更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值