26可滾動的結果集
阿新 • • 發佈:2019-01-23
public class Result26 {
public static void main(String[] args) throws Exception { Connection conn = ConnectionFactory.getInstance().getLocalConnection(); int money=0; ResultSet rt=null; Statement st=null; String sql="select * from test_user order by uid asc"; st=conn.createStatement(); rt=st.executeQuery(sql); while (rt.next()){ System.out.print(rt.getInt("uid")+"\t"); System.out.print(rt.getInt("money")+"\t"); System.out.println("\n"); } System.out.println("-------------------------"); while(rt.previous()){ //向上滾動 System.out.print(rt.getInt("uid")+"\t"); System.out.print(rt.getInt("money")+"\t"); System.out.println("\n"); } } }
發現這是包括當前行的。
但是我們如果定位到某一行,則不會包括那一行:
public class Result26 { public static void main(String[] args) throws Exception { Connection conn = ConnectionFactory.getInstance().getLocalConnection(); int money=0; ResultSet rt=null; Statement st=null; String sql="select * from test_user order by uid asc"; st=conn.createStatement(); rt=st.executeQuery(sql); rt.absolute(3);//定位到某行 while (rt.next()){ System.out.print(rt.getInt("uid")+"\t"); System.out.print(rt.getInt("money")+"\t"); System.out.println("\n"); } rt.absolute(3); System.out.println("-------------------------"); while(rt.previous()){ //向上 System.out.print(rt.getInt("uid")+"\t"); System.out.print(rt.getInt("money")+"\t"); System.out.println("\n"); } }
4789
54890
-------------------------
2450
150
關於可更新的結果集是有好處的。使用可更新的結果集和對資料敏感的結果集的表必須擁有主鍵:alter table test_user modify uid int primary key;
使用可更新的結果集是有好處的,比如一次性的修改很多的行的值。
public class Result26 { public static void main(String[] args) throws Exception { Connection conn = ConnectionFactory.getInstance().getLocalConnection(); int money=0; ResultSet rt=null; Statement st=null; String sql="select * from test_user order by uid asc"; //所謂併發,就是對Result既能讀,也能寫。 st=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); rt=st.executeQuery(sql); while (rt.next()){ System.out.print(rt.getInt("uid")+"\t"); System.out.print(rt.getInt("money")+"\t"); System.out.println("\n"); rt.updateInt("money", 24); rt.updateRow();//不要忘了更新行,這個時候快取值才被寫入資料。 } System.out.println("-------------------------"); while(rt.previous()){ //向上 System.out.print(rt.getInt("uid")+"\t"); System.out.print(rt.getInt("money")+"\t"); System.out.println("\n"); } } }
ResultSet.TYPE_SCROLL_SENSITIVE表示ResultSet對資料庫更新是敏感的:比如在next中間,對資料庫中的值進行了修改。那麼在previous中就感知到這種變化,所以在previous中間,打印出的momey都是24.(next中間感受不到這些變化,它還沒有這麼神奇)
但實際上ResultSet.TYPE_SCROLL_INSENSITIVE,對於previous仍然可以感知到這個變化。也就是JDBC這個特性在mysql 的實現中並不是嚴格按照sun公司的標準。