JDBC只能获取一部分结果

package com.chapter08;

import java.sql.*;
import java.util.Scanner;

public class log {

public static void main(String[] args) {


        Scanner sc=new Scanner(System.in);
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        Connection conn =null;
        PreparedStatement pre =null;
        try {
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/shiyan?serveTimezone=GMT","root","123456");
            //验证登录
            String s="select * from bank where id=? and pwd=?";
            pre = conn.prepareStatement(s);
            System.out.println("请输入账号:");
            int i1 = sc.nextInt();
            System.out.println("请输入密码:");
            //int s2 = sc.nextInt();
            int s1 = sc.nextInt();

            pre.setInt(1,i1);
            pre.setInt(2,s1);
            ResultSet rs = pre.executeQuery();
            int id =0;
            int pwd =0;
            String name=" ";
            while(rs.next()) {
                id = rs.getInt("id");
                pwd = rs.getInt("pwd");
            }
            System.out.println(id==i1&&pwd==s1?"登录成功":"登录失败");
            // 获取数据
            System.out.println("编号\t卡号\t密码\t电话号码\t姓名");
            while(rs.next()){
                System.out.println(rs.getInt("id")+" "+rs.getInt("card")+" "+rs.getInt("pwd")+" "
                +rs.getInt("pho")+rs.getString("name"));
            }

        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            try {
                pre.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            try {
                conn.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }


}

 

因为你在第一个while循环的时候,已经把游标移动第一条数据了,你只有一条数据,第二次while循环后,就没有数据可取了

同学,你这个结果集的使用不太正确,因为rs.next()方法的调用会导致结果集的游标往下一行记录移动,你的结果集其实是取出来这条数据的,在第一个while循环处,你调用rs.next()方法,游标其实已经指向第一条数据了,你此时调用rs.getInt()方法可以正常取到id和pwd,所以你下面System.out.println(id==i1&&pwd==s1?"登录成功":"登录失败");这句代码可以打印"登录成功"。然后因为你结果集中只有一条记录,所以会跳出第一个while循环,走到第二个while循环的地方,此时,你再调用rs.next()方法,会导致结果集rs的游标再往下移动一条记录,指向空记录,所以你此时再通过rs.getXXX()方法是获取不到数据了。你可以在第二个while循环之前,加上rs.previous()方法,将结果集游标往上移动一行记录,就可以正常取到数据了。

rs.previous();
while (rs.next()) {
    System.out.println(rs.getInt("id") + " " + rs.getInt("card") + " " + rs.getInt("pwd") + " "
                        + rs.getInt("pho") + rs.getString("name"));
}