rs.next()之谜


rs.next()之谜

在表中中插入后立即查询:


package JDBC_0921;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class a {
    private static final String Driver = "com.mysql.cj.jdbc.Driver";
    private static final String URL = "jdbc:mysql://127.0.0.1:3306/tt";
    private static final String UNAME = "root";
    private static final String PASSWD = "123456";
    static {
        try {
            Class.forName(Driver);
            System.out.println("1.数据库驱动加载成功");
        } catch (Exception e) {
            System.out.println("加载数据库驱动失败");
        }
    }

    public static final Connection getconnection() throws SQLException {
        Connection conn = DriverManager.getConnection(URL, UNAME, PASSWD);
        System.out.println("2.创建数据库连接");
        return conn;
    }

    public static void InsertMethod(int id, String name, String email) throws SQLException {
        Connection conn = getconnection();
        PreparedStatement ps = null;
        ResultSet rs = null;
        Statement stat = conn.createStatement();
        String sql = "insert into student(id,name,email) values(?,?,?)";
        String sql2 = "select * from student";
        // 3.创建sql语句对象
        try {
            ps = conn.prepareStatement(sql);
            System.out.println("3.创建sql语句对象");
            ps.setInt(1, id);
            ps.setString(2, name);
            ps.setString(3, email);
            // 4.执行sql语句
            ps.executeUpdate();
            System.out.println("4.执行sql语句");
            System.out.println("插入成功");
            rs = stat.executeQuery(sql2);
            while (rs.next()) {
                int id2 = rs.getInt("id");
                String name2 = rs.getString("name");
                String email2 = rs.getString("email");
                System.out.println("id:" + id + "\t\t" + "name:" + name + "\t\t" + "email:" + email);
            }
        } catch (Exception e) {
            System.out.println("插入异常");
        } finally {
            rs.close();
            ps.close();
            conn.close();
            System.out.println("数据库连接关闭");
        }
    }

    public static void main(String[] args) throws SQLException {
        InsertMethod(1025, "JDBC", "java.com");
    }
}

在这里插入图片描述
重新用另一个类进行查询

package JDBC_0921;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBC01 {

	public static void main(String[] args) {
		Connection conn = null;
		Statement stat = null;
		ResultSet rs = null;
		ResultSet rs2 = null;
		try {
			// 1.加载数据库驱动
			System.out.println("1.加载数据库驱动");
			Class.forName("com.mysql.cj.jdbc.Driver");
			// 2.创建数据库连接
			System.out.println("2.创建数据库连接");
			conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/tt", "root", "123456");
			// 3.创建sql语句对象
			System.out.println("3.创建sql语句对象");
			stat = conn.createStatement();
			// 4.执行sql语句
			System.out.println("4.执行sql语句");
			String sql = "select * from student";
			rs = stat.executeQuery(sql);
			// 获取查询结果
			while (rs.next()) {
				int id = rs.getInt("id");
				String name = rs.getString("name");
				String email = rs.getString("email");
				System.out.println("id是:" + id + "\t\t" + " 名字:" + name + "\t\t" + " email是:" + email);
			}
			// 5.关闭数据库连接
			System.out.println("5.关闭数据库连接");
			rs.close();
			stat.close();
			conn.close();

		} catch (ClassNotFoundException | SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}

在这里插入图片描述
**

数据库中实际为

**
在这里插入图片描述

造成这二次查询不一致的原因是:

ResultSet对象保持一个光标,位置不同。

1. 当表中插入数据后,光标在最后一行。调用rs.next()方法 每次光标-1,造成最后一行数据项循环输出

2. 而查询元素,光标最初位于第一行之前; 第一次调用方法next使第一行成为当前行; 第二次调用使第二行成为当前行,依此类推,将输出表中所有行。

小伙伴们知道如何解决吗?

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值