本次的学习主要分为九个部分

第一节:JDBC的概述

第二节:JDBC连接数据库

第三节:使用Statement接口实现增、删、改操作

第四节:使用PreparedStatement接口实现增、删、改的操作

第五节:Resultset结果集

第六节:处理大数据对象

第七节:使用CallableStatement接口调用存储过程

第八节:使用元数据分析数据库

第九节:JDBC的事务处理事务

下面是第五部分,其他部分可以通过上面的链接访问

5.Resultset结果集

总结一下:前面的四个小节自己主要学习的是对JDBC的认识,以及连接数据库,之后通过两种方法的对比的学习,明白怎么将对一条数据进行操作,这里的操作有:

  1. 将数据写进数据库中
  2. 更新数据库中的数据
  3. 删除数据库中的数据

以上的操作每次能改变的数据的个数都是一条!!!
而下面的学习就不再是只对一条数据进行操作了。

这一节的学习主要从两个方面来学

  1. ResultSet 结果集的引入
    当我们查询数据库时,返回的是一个二维的结果集,我们这时候需要使用 ResultSet 来遍历结果集,获取每一行 的数据。

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

老样子,先看JDK文档

在这里插入图片描述在这里插入图片描述
通过对JDBC中的ResultSet结果集的学习,我写出了下面的代码

package chap5_sec02;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import util.DbUtil;

public class Demo1 {
	private static DbUtil dbUtil=new DbUtil();
	
	//下面输出的是一个结果集,查询这个表的信息并打印出这个信息
	private static void listBook()throws Exception{
		Connection con=dbUtil.getCon();//获取连接
		String sql="select *from t_book";//遍历整个表的SQL语句
		PreparedStatement pstmt=con.prepareStatement(sql);//预编译(第四节学的)
		ResultSet rs=pstmt.executeQuery();//返回一个二维的结果集
		/*
		 * 最开始rs的地方不知道在哪里
		 * 这里不要用do while,因为rs.next()第一次执行后,指向第一行
		 * 并不是一开始就在第一行的,并且结果是boolean类型的值
		 */
		while(rs.next()){//next一次就换一行,当没有行的时候,就返回false
			int id=rs.getInt(1);//获取第一个列的值
			String bookName=rs.getString(2);
			Float price=rs.getFloat(3);
			String author=rs.getString(4);
			int bookTypeId=rs.getInt(5);
			System.out.println("图书编号:"+id+"| 图书名称:"+bookName+
					"| 图书价格:"+price+"| 图书作者:"+author+
					"| 图书编号:"+bookTypeId);
		}
	}
	public static void main(String[] args) throws Exception{
		listBook();
	}
}

执行的效果是这样的

在这里插入图片描述

输出的不太美观,但是我们要的效果还是有了,取到了表中的二维的数据。
表格的数据在这里:

在这里插入图片描述

值得注意的是:

  1. 一定要预编译
  2. 要用while循环,jdk中指出初始的时候指向的不是第一行,第一次的next的时候指向的才是第一行
  3. 每次next,都会换一行,当遍历到最后一行的时候,此时返回的就是false
  4. 我们可以定义一个中间变量使rs成为一个循环的,当结果集为false的时候,重新用最开始存储的结果集
  5. 取表中的数据的时候,get后面跟的是数据类型,弄混了会出现数据丢失或者报错或者乱码的情况

上面的学习只是到二维的一个过渡,一般开发的时候用的是下面的方法

变动不大,本质没区别,就是可读性变强了

区别在这
在这里插入图片描述以前的是这样的
在这里插入图片描述换成字符串的形式的缘由,可增强可读性,并且字符串数据来自列名
在这里插入图片描述下面用泛型存储数据,可以先看一下我对foreach的学习,因为这里要用到泛型,并用foreach的方式进行输出。
这个是我写的JAVA——foreach的学习(泛型和数组的例子)
泛型遍历的详细的方法在这里

下面继续说ResultSet结果集。

上面我们的输出是通过System进行输出的,下面把这个数据放进泛型里,充分的用上我们的Book类。

package chap5_sec02;

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 Demo1 {
	private static DbUtil dbUtil=new DbUtil();
	
	//下面输出的是一个结果集,查询这个表的信息并打印出这个信息
	private static void listBook()throws Exception{
		Connection con=dbUtil.getCon();//获取连接
		String sql="select *from t_book";//遍历整个表的SQL语句
		PreparedStatement pstmt=con.prepareStatement(sql);//预编译(第四节学的)
		ResultSet rs=pstmt.executeQuery();//返回一个二维的结果集
		/*
		 * 最开始rs的地方不知道在哪里
		 * 这里不要用do while,因为rs.next()第一次执行后,指向第一行
		 * 并不是一开始就在第一行的,并且结果是boolean类型的值
		 */
		while(rs.next()){//next一次就换一行,当没有行的时候,就返回false
			int id=rs.getInt(1);//获取第一个列的值
			String bookName=rs.getString(2);
			Float price=rs.getFloat(3);
			String author=rs.getString(4);
			int bookTypeId=rs.getInt(5);
			System.out.println("图书编号:"+id+"| 图书名称:"+bookName+
					"| 图书价格:"+price+"| 图书作者:"+author+
					"| 图书编号:"+bookTypeId);
		}
	}
	
	//下面输出的是一个结果集,查询这个表的信息并打印出这个信息
		private static void listBook2()throws Exception{
			Connection con=dbUtil.getCon();//获取连接
			String sql="select *from t_book";//遍历整个表的SQL语句
			PreparedStatement pstmt=con.prepareStatement(sql);//预编译(第四节学的)
			ResultSet rs=pstmt.executeQuery();//返回一个二维的结果集
			/*
			 * 最开始rs的地方不知道在哪里
			 * 这里不要用do while,因为rs.next()第一次执行后,指向第一行
			 * 并不是一开始就在第一行的,并且结果是boolean类型的值
			 */
			//用列名替换编号
			while(rs.next()){//next一次就换一行,当没有行的时候,就返回false
				int id=rs.getInt("id");//获取第一个列的值
				String bookName=rs.getString("bookName");
				Float price=rs.getFloat("price");
				String author=rs.getString("author");
				int bookTypeId=rs.getInt("bookTypeId");
				System.out.println("图书编号:"+id+"| 图书名称:"+bookName+
						"| 图书价格:"+price+"| 图书作者:"+author+
						"| 图书编号:"+bookTypeId);
			}
		}
		
		//下面输出的是一个结果集,查询这个表的信息并打印出这个信息
				private static List<Book> listBook3()throws Exception{
					List<Book> bookList=new ArrayList<Book>();
					Connection con=dbUtil.getCon();//获取连接
					String sql="select *from t_book";//遍历整个表的SQL语句
					PreparedStatement pstmt=con.prepareStatement(sql);//预编译(第四节学的)
					ResultSet rs=pstmt.executeQuery();//返回一个二维的结果集
					while(rs.next()){//next一次就换一行,当没有行的时候,就返回false
						int id=rs.getInt("id");//获取第一个列的值
						String bookName=rs.getString("bookName");
						Float price=rs.getFloat("price");
						String author=rs.getString("author");
						int bookTypeId=rs.getInt("bookTypeId");
						//定义一个实体对象,把五大属性存进去
						Book book=new Book(id, bookName, price, author, bookTypeId);
						bookList.add(book);
					}
					return bookList;
				}
	
	public static void main(String[] args) throws Exception{
		//listBook();
		//listBook2();
		List<Book> bookList=listBook3();
		for (Book book : bookList) {
			System.out.println(book);
		}
	}
}

主要看的就是这部分的
在这里插入图片描述在这里插入图片描述当然,如果看了上面的我对foreach的学习的,应该知道,我这里输出的是book对象,如果只是输出对象,会出现一堆看不懂的东西,具体的要输出的是对象中的元素。
所以得在Book类中加上这个
在这里插入图片描述

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

最后得到的结果是这样的。
在这里插入图片描述
需要学习的时候用到的数据库和所有的源代码,请去百度网盘提取
链接:https://pan.baidu.com/s/1wDL_aFCPQ9WAZ_vSy6UVdg
提取码:hime


版权声明:本文为qq_43918130原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_43918130/article/details/99633094