我在mysql数据库中有一个表,其中有一些行可用。我想从我的jdbc程序中的表中检索数据,其中ResultSet
仅向前。我的代码是:
import java.sql.*;
public class Test1 {
static{
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Connection con=null;
Statement st=null;
ResultSet rs=null;
int id=0;
String name=null;
try {
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/hiitstudents","root", "rustyiron");
st=con.createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.TYPE_SCROLL_INSENSITIVE);
String query="select * from students";
rs=st.executeQuery(query);
while(rs.next()){
id=rs.getInt(1);
name=rs.getString(2);
System.out.println(id+"\t"+name);
} ;
while(rs.previous()){
id=rs.getInt(1);
name=rs.getString(2);
System.out.println(id+"\t"+name);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
try{
if(rs!=null)
rs.close();
if(st!=null)
st.close();
if(con!=null)
con.close();
}catch(SQLException se){
se.printStackTrace();
}
}
}
}
但由于默认结果集只是转发,我们不能在其中调用previous()
或它不应该工作,但在我的程序中这样做也会以相反的顺序检索数据。我的代码有什么问题?
答案 0 :(得分:1)
这是MySQL
处理它的方式,其他数据库可能表现不同。
默认情况下,ResultSet完全检索并存储在内存中。
如果您正在使用具有大量行数的ResultSet 大值并且无法在JVM中为内存分配堆空间 必需的,您可以告诉驱动程序将结果流回一行 一次。
要启用此功能,请在中创建一个Statement实例 以下方式:
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);