?????本篇文章接著上篇文章形入,還剩下一個知識點是缝左,可滾動的結果接集和可更新的結果集。一般默認情況之下蛇数,多結果集是不可以顯式滾動是越,移動選擇的。如果想要做到浦徊,需要指定一些參數(shù)天梧,那么本篇就接著介紹如何操作可滾動的結果集。
?????默認情況下冕香,結果集是不可以滾動的后豫,如果想要可滾動就需要通過重載的構造方法創(chuàng)建一個不同的Statement對象,如下:
Statement statement = dbConn.createStatement(type,concurrency);
//如果是預編譯的Statement對象
PreparedStatement statement = dbConn.prepareStatement(command,type,concurrency);
其中构眯,type的取值范圍如下:
TYPE_FORWARD_ONLY 結果集不能滾動(默認)
TYPE_SCROLL_INSENSITIVE 結果集可以滾動早龟,對原數(shù)據(jù)庫不敏感
TYPE_SCROLL_SENSITIVE 結果集可以滾動,對原數(shù)據(jù)庫敏感
而Concurrency的取值范圍如下:
CONCUR_READ_ONLY 結果集不能用于更新數(shù)據(jù)庫
CONCUR_UPDATEABLE 結果集可以用來更新數(shù)據(jù)庫
Statement statement = dbConn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
ResultSet rs = statement.executeQuery("SELECT * from users");
while(rs.next()){
System.out.println(rs.getRow());
}
上述代碼將會打印從一開始打印知道結果集最后一行它褪,我們看到翘悉,next方法可以滾動至上一行,previous方法可以滾動到下一行妖混。這種邏輯可能正好和我們的邏輯相反,你可以認為整個結果集是倒置的抬旺。absolute(n)方法可以滾動到指定的行號位置祥楣,relative()方法可以滾動到相對于當前行號的指定位置汉柒。
while(rs.next()){
System.out.println(rs.getRow());
rs.relative(1);
}
這一段代碼展示了各行輸出的效果责鳍。
?????說完了結果集的滾動操作历葛,下面介紹結果集的更新操作。那什么是結果集的可更新操作呢恤溶?就是指咒程,從數(shù)據(jù)庫中查詢出來的結果集,我們通過操作此結果集會映射到數(shù)據(jù)庫中孵坚。下面看看具體代碼的實現(xiàn)卖宠。
Statement statement = dbConn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rs = statement.executeQuery("SELECT * from users");
rs.next();
rs.updateString("pass","1");
rs.updateRow();
statement.close();
dbConn.close();
上述代碼中主要涉及到了三條語句,createStatement中參數(shù)傳遞的更改筷畦。第二刺洒,rs.updateString("pass","1");,我們更改結果集中的信息都是使用的方法UpdateXXX鼎文,和我們的getXXX類似因俐。最后一句是非常重要的,之前的所有更改操作都是對于結果集的操作撑帖,而最后一句rs.updateRow();則是將結果集的更改內(nèi)容映射到數(shù)據(jù)庫中澳眷。如果在使用中忘記添加了這局代碼的調(diào)用,之前的所有更改將會被丟棄衷敌。至于updateXXX中,XXX的類型罐监,只要sql中有的類型瞒爬,都會對應一個調(diào)用時的類型沟堡。nvarchar對應我們的string,int對應int等禀横。
?????除了修改結果集粥血,我們還可以添加行到結果集中,刪除結果集中當前的行趾娃。具體操作如下:
rs.moveToInsertRow();
rs.updateInt("id",20);
rs.updateString("name","walker");
rs.insertRow();
rs.moveToCurrentRow();
第一句代碼moveToInsertRow缔御,將游標移動到了特定的位置,從當前行離開笤成,到結果集的末尾位置眷茁,調(diào)用update方法為每個字段賦值,沒賦值的統(tǒng)統(tǒng)為null培遵,然后調(diào)用insertRow插入到結果集中并且映射數(shù)據(jù)庫雇逞。最后一條語句moveToCurrentRow,返回之前離開的位置节仿。
?????刪除結果集中的某一行就比較簡潔:
rs.deleteRow();
就一條語句表示從結果集中將當前游標執(zhí)行的行刪除并且同步映射數(shù)據(jù)庫掉蔬。
?????至此,jdbc的簡單用法就介紹完了箭启,如果其中有錯誤傅寡,望大家指出!