-
表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
-
表示数据库结果集的数据表,通常通过执行查询数据库的语句生成ResultSet对象保持一个光标指向其当前的数据行。最初,光标位于第一行之前。
-
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过后,它下面的代码就不再走了。