本次的学习主要分为九个部分
第一节:JDBC的概述
第二节:JDBC连接数据库
第四节:使用PreparedStatement接口实现增、删、改的操作
第五节:Resultset结果集
第六节:处理大数据对象
第七节:使用CallableStatement接口调用存储过程
第八节:使用元数据分析数据库
第九节:JDBC的事务处理事务
下面是第五部分,其他部分可以通过上面的链接访问
5.Resultset结果集
总结一下:前面的四个小节自己主要学习的是对JDBC的认识,以及连接数据库,之后通过两种方法的对比的学习,明白怎么将对一条数据进行操作,这里的操作有:
- 将数据写进数据库中
- 更新数据库中的数据
- 删除数据库中的数据
以上的操作每次能改变的数据的个数都是一条!!!
而下面的学习就不再是只对一条数据进行操作了。
这一节的学习主要从两个方面来学
ResultSet 结果集的引入
当我们查询数据库时,返回的是一个二维的结果集,我们这时候需要使用 ResultSet 来遍历结果集,获取每一行 的数据。使用 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();
}
}
执行的效果是这样的
输出的不太美观,但是我们要的效果还是有了,取到了表中的二维的数据。
表格的数据在这里:
值得注意的是:
- 一定要预编译
- 要用while循环,jdk中指出初始的时候指向的不是第一行,第一次的next的时候指向的才是第一行
- 每次next,都会换一行,当遍历到最后一行的时候,此时返回的就是false
- 我们可以定义一个中间变量使rs成为一个循环的,当结果集为false的时候,重新用最开始存储的结果集
- 取表中的数据的时候,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