今晚捣腾了一下关于ResultSet有关的知识,下面就是网上加上自己的总结。。
要让ResultSet可以滚动个和更新,必须在创建Statement对象的时候使用下面的方式指定对应的参数:
Statement stmt = conn.createStatement(type, concurrency);
对于PreparedStatement,使用下面的方式指定参数:
PreparedStatement pstmt = conn.prepareStatement(sql, type, concurrency);
其中,type表示ResuleSet的类型,而concurrency表示是否可以使用ResuleSet来更新数据库。
type和concurrency的取值以及含义:
ResultSet.TYPE_FORWARD_ONLY - 结果集不能滚动,这事默认值;
ResultSet.TYPE_SCROLL_INSENSITIVE - 结果集可以滚动,但ResuleSet对数据库中发送的数据改 变不敏感;
ResultSet.TYPE_SCROLL_SENSITIVE - 结果集可以滚动,并且ResuleSet对数据库中发生的改变敏感
ResultSet.CONCUR_READ_ONLY - 只读结果集,不能用于更新数据库;
ResultSet.CONCUR_UPDATABLE - 可更新结果集,可以用于更新数据库;
当使用TYPE_SCROLL_INSENSITIVE或者TYPE_SCROLL_SENSITIVE来创建Statement对象时,可以使用ResultSet 的 first()/last()/beforeFirst()/afterLast()/relative()/absolute()等方法在结果集中随意前后移动。
提示:即使使用了CONCUR_UPDATABLE参数来创建Statement,得到的记录集也并非一定是“可更新的”,如果你的记录集来自于合并查询,即该查询的结果来自多个表格,那么这样的结果集就可能不是可更新的结果集。可以使用ResuleSet类的getConcurrency()方法来确定是否为可更新的的结果集。如果结果集是可更新的,那么可使用ResultSet的updateRow(),insertRow(),moveToCurrentRow(),deleteRow(),cancelRowUpdates() 等方法来对数据库进行更新。
提示:即使使用了CONCUR_UPDATABLE参数来创建Statement,得到的记录集也并非一定是“可更新的”,如果你的记录集来自于合并查询,即该查询的结果来自多个表格,那么这样的结果集就可能不是可更新的结果集。可以使用ResuleSet类的getConcurrency()方法来确定是否为可更新的的结果集。如果结果集是可更新的,那么可使用ResultSet的updateRow(),insertRow(),moveToCurrentRow(),deleteRow(),cancelRowUpdates() 等方法来对数据库进行更新。
<span style="color:#494949;font-weight: bold;">String url="jdbc:mysql://localhost:3306/first";
String username="root";
String password="root";
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
//获得与数据库的连接
Connection conn=DriverManager.getConnection(url,username,password);
//获得用于向数据库发送sql的 statement
// Statement st= (Statement) conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); 当把这句话注释掉,就会有下面的错误
Statement st= (Statement) conn.createStatement();
//向数据库发送sql
String sql="select name,id from UserTest2";
ResultSet rs= st.executeQuery(sql);
rs.absolute(2);
rs.updateString("name", "James");
rs.updateRow();
System.out.println(rs.getString(1));
while(rs.next()){
System.out.println(rs.getObject("id"));
System.out.println(rs.getObject("name"));
}
rs.close();
st.close();
conn.close();</span>
错误信息:com.mysql.jdbc.NotUpdatable: Result Set not updatable.
当有这句话时(Statement st= (Statement) conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
),但是表单没有主键,会出现这句错误
String username="root";
String password="root";
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
//获得与数据库的连接
Connection conn=DriverManager.getConnection(url,username,password);
//获得用于向数据库发送sql的 statement
// Statement st= (Statement) conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); 当把这句话注释掉,就会有下面的错误
Statement st= (Statement) conn.createStatement();
//向数据库发送sql
String sql="select name,id from UserTest2";
ResultSet rs= st.executeQuery(sql);
rs.absolute(2);
rs.updateString("name", "James");
rs.updateRow();
System.out.println(rs.getString(1));
while(rs.next()){
System.out.println(rs.getObject("id"));
System.out.println(rs.getObject("name"));
}
rs.close();
st.close();
conn.close();</span>