ResultSet底层

  1. 表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。

  2. 表示数据库结果集的数据表,通常通过执行查询数据库的语句生成ResultSet对象保持一个光标指向其当前的数据行。最初,光标位于第一行之前。

  3. next方法将光标移动到下一行,并且由于在ResultSet对象中没有更多行时返回false,因此可以在while循环中使用循环来遍历结果集。 


最先前是指向表的第一行的最前面,并没有指向第一行,然后可以通过next方法,通过next方法,可以往下移动,移动到下一行就是移动到id为1的那一行,再往下移就是2,因为是next,会判断下一行有没有,如果它判断下一行没有更多的记录,就会返回false,返回false就不继续往下走,如果继续往下走就会有空指针异常。 


package godairo.jdbc.resultset_;


import godairo.jdbc.myjdbc.JdbcConn;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Date;
import java.util.Properties;

/**
 * @author GodAiro
 * @since JavaWeb 4.0.0
 * Creation Time: 2022/7/14 18:51.
 * 演示select语句返回ResultSet,并取出结果
 */
public class ResultSet_ {
   
   public static void main(String[] args) throws SQLException, IOException, ClassNotFoundException {
	  Properties properties = new Properties();
	  properties.load(new FileInputStream("F:\\JavaWeb-Study\\JavaWeb\\JdbcStudy\\src\\main\\resources\\jdbc.properties"));
	  //获取相关的值
	  String user = properties.getProperty("user");
	  String password = properties.getProperty("password");
	  String driver = properties.getProperty("driver");
	  String url = properties.getProperty("url");
	  //1.注册驱动
	  Class.forName(driver);
	  //2.得到连接
	  Connection connection = DriverManager.getConnection(url, user, password);
	  //3.得到Statement
	  Statement statement = connection.createStatement();
	  //4.组织SQL
	  String sql = "select id,name,sex,borndate,phone from actor";
	  //执行给定的SQL语句,该语句返回单个 ResultSet对象,类似于返回一张表
	  ResultSet resultSet = statement.executeQuery(sql);
	  //5.使用while取出数据
	  /**id	  name    sex	 	borndate			phone
	   *  2	 刘德华	   男	1970-11-11 00:00:00		110
	   *  3	 GodAiro   男	1999-04-15 00:00:00		1855055452
	   *  4	 Jacky	   男	2000-04-15 00:00:00		1516166656
	   */	
	  while(resultSet.next()){
		 int id = resultSet.getInt(1);//获取该行的第1列数据
		 String name = resultSet.getString(2);//获取该行的第2列数据
		 String sex = resultSet.getString(3);//获取该行的第3列数据
		 Date date = resultSet.getDate(4);//获取该行的第4列数据
		 String phone = resultSet.getString(5);//获取该行的第5列数据
		 System.out.println(id+"\t"+name+"\t"+sex+"\t"+date+"\t"+phone);
	  }
	  //6.关闭连接
	  resultSet.close();
	  statement.close();
	  connection.close();
   }
}

源码解读

将ResultSet resultSet = statement.executeQuery(sql);这一行打上标记进行Debug

然后往下执行,产生了resultSet对象。

值得注意的是,代码中的ResultSet是一个接口,真正的类型是Degbug中的。

 JDBC42ResultSet,这个类,是实现了接口的一个类,JDBC是一个规范,是一个接口,Mysql产商实现了这个接口,它真正的类型是这个类型——JDBC42ResultSet。

resultSet里面有个rowData,也就是行数据。

rowData里面有个rows,它由很多行数据构成,是个ArrayList,集合。size=3,就说明有3行数据。它真正的数据是放在对象数组的。

点击rows里面有0、1、2

里面有个internalRowData,继续点击,这下就比较清晰了。

 然后我们点击0进去看

那"刘德华"这个数据占9是因为是UTF-8类型,一个汉字占3个字节,3x3就是9,所以它用了9个字节,那么这里面存储的就是刘德华这三个字对应的ASCII码的组合 

所以在底层,会看接下去会不会是空,如果是空,那么就返回false,返回一个false过后,它下面的代码就不再走了。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GodAiro

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值