ResultSet结果集的使用

本文详细介绍了如何使用Java的ResultSet对象遍历数据库查询结果,包括使用getInt、getString和getFloat方法获取不同类型的列数据,以及如何将结果集转换为List集合进行处理。

转载自:https://blog.youkuaiyun.com/above_my_point/article/details/78934163

一、ResultSet结果集的简介
查询数据库时,返回的是一个二维的结果集,我们需要用到ResultSet来遍历结果集,获取每一行的数据。

二、使用ResultSet遍历查询结果
boolean next() 将光标从当前位置向前移一行。
String  getString(int columnIndex) 以java编程语言中String的形式获取此ResultSet对象的当前行中指定列的值
String  getString(String columnLabel) 以java编程语言中String的形式获取此ResultSet对象的当前行中指定列的值

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
 
import model.Book;
import util.DbUtil;
 
public class demo2 {
 
	/**
	 * getString(int columnIndex)使用
	 * @throws Exception
	 */
	private static void listBook() throws Exception{
		DbUtil dbUtil = new DbUtil();
		Connection con = dbUtil.getcon();
		String sql = "select * from t_book";
		PreparedStatement psta = con.prepareStatement(sql);
		ResultSet rs = psta.executeQuery();//返回结果集ResultSet
		while(rs.next()){
			int id = rs.getInt(1);// 获取第一个列的值 编号id
			String bookName = rs.getString(2);// 获取第二个列的值 图书名称 bookName
			String author = rs.getString(3);// 获取第三列的值 图书作者 author
			float price = rs.getFloat(4);// 获取第四列的值 图书价格 price
			System.out.println("id="+id+" bookName="+bookName
					            +" author="+author+" price="+price);
			System.out.println("................................................");
		}
	}
	/**
	 * getString(String columnLabel)使用
	 * @throws Exception
	 */
	private static void listBook2() throws Exception{
		DbUtil dbUtil = new DbUtil();
		Connection con = dbUtil.getcon();
		String sql = "select * from t_book";
		PreparedStatement psta = con.prepareStatement(sql);
		ResultSet rs = psta.executeQuery();
		while(rs.next()){
			int id = rs.getInt("id");// 获取第一个列的值 编号id
			String bookName = rs.getString("bookName"); // 获取第二个列的值 图书名称 bookName
			String author = rs.getString("author");// 获取第三列的值 图书作者 author
			float price = rs.getFloat("price");// 获取第四列的值 图书价格 price
			System.out.println("id="+id+" bookName="+bookName
					            +" author="+author+" price="+price);
			System.out.println("................................................");
		}
	}
	/**
	 * 使用list集合
	 * @return
	 * @throws Exception
	 */
	private static List<Book> listBook3()throws Exception{
		DbUtil dbUtil = new DbUtil();
		List<Book> bookList=new ArrayList<Book>(); 
		Connection con = dbUtil.getcon(); 
		String sql = "select * from t_book";
		PreparedStatement pstmt = con.prepareStatement(sql);
		ResultSet rs = pstmt.executeQuery(); 
		while (rs.next()) {
			int id = rs.getInt("id"); // 获取第一个列的值 编号id
			String bookName = rs.getString("bookName"); // 获取第二个列的值 图书名称 bookName
			String author = rs.getString("author"); // 获取第三列的值 图书作者 author
			float price = rs.getFloat("price"); // 获取第四列的值 图书价格 price
			Book book=new Book(id, bookName, author,price);//book对象实例化
			bookList.add(book);//添加进集合
		}
		return bookList;
	}
	public static void main(String[] args) throws Exception {
		
		//遍历集合
		List<Book> bookList=listBook3();
		for (Book book : bookList) {
			System.out.println(book);
		}
		//listBook3();
	}
 
}

打印的结果:
在这里插入图片描述
所以要在Book内重写toString方法:

	@Override
	public String toString() {
		return "[id=" + id + ", bookName=" + 
	            bookName + ", author=" + author +
	            ", price=" + price + "]";
	}

重写后的效果图:
在这里插入图片描述

ResultSet 是 Java 中用于表示数据库查询结果的接口,在处理大结果时,有一些需要关注的知识。 ### 结果与内存占用 ResultSet 表面看起来是一个记录,实际上该对象只是记录了结果的相关信息,具体的记录并未存放在对象中。具体的记录内容在通过 `next` 方法提取,再通过相关的 `getXXXXX` 方法提取字段内容时才从数据库中获取,这些操作本身不会大量占用内存。真正消耗内存是在将记录中的数据提取出来加入到自己的合中时。若不使用合记录所有记录,就不会出现严重的内存消耗情况 [^3]。 ### 结果游标操作 ResultSet 是一个二维表格,内部维护一个行光标(游标),它提供了一系列方法来移动游标,在处理大结果时可以根据需求移动光标来获取特定的数据。例如: - `void beforeFirst()`: 把光标放到第一行的前面,这也是光标默认的位置。 - `void afterLast()`:把光标放到最后一行的后面。 - `boolean first()`: 把光标放到第一行的位置上,返回值表示调控光标是否成功。 - `boolean last()`:把光标放到最后一行的位置上。 - `boolean isBeforeFirst()`:判断当前光标位置是否在第一行前面。 - `boolean isAfterLast()`:判断当前光标位置是否在最后一行后面。 - `boolean isFirst()`:判断当前光标位置是否在第一行上。 - `boolean isLast()`:判断当前光标位置是否在最后一行上。 - `boolean previous()`: 把光标向上挪一行。 - `boolean next()`: 把光标向下挪一行。 - `boolean relative(int row)`:相对位移,当 `row` 为正数时,表示向下移动 `row` 行,为负数时表示向上移动 `row` 行。 - `boolean absolute(int row)`: 绝对位移,把光标移动到指定的行上。 - `int getRow()`: 返回当前光标所在行 [^4]。 ### 代码示例 以下是一个简单的使用 ResultSet 处理结果的代码示例,在处理大结果时也可参考这种逐行处理的方式,避免一次性将大量数据加载到内存: ```java import java.sql.*; public class ResultSetExample { public static void main(String[] args) { try { // 加载数据库驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 建立数据库连接 Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/yourdatabase", "username", "password"); // 创建 Statement 对象 Statement statement = connection.createStatement(); // 执行查询 ResultSet resultSet = statement.executeQuery("SELECT * FROM yourtable"); // 逐行处理结果 while (resultSet.next()) { // 获取指定列的数据 int id = resultSet.getInt("id"); String name = resultSet.getString("name"); System.out.println("ID: " + id + ", Name: " + name); } // 关闭资源 resultSet.close(); statement.close(); connection.close(); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值