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使第一行成为当前行; 第二次调用使第二行成为当前行,依此类推,将输出表中所有行。
小伙伴们知道如何解决吗?