關於rs.next()問題



rs.next(); -- 從查詢出來的集合中拿出了一條數據

表示的集合表中的第一個對象。

如果說你在做數據庫查詢的時候,返回了一個Result結果集。只有一條數據時,常常很容易犯了這樣的錯誤。

先對數據進行判斷。

數據庫中的數據:

如圖:

這里有兩條數據

 1 //查詢一條用戶信息  
 2     public User select(User t) {  
 3         int in = 0;  
 4         sql = "select * from blog_users where blogstate=? ";  
 5         conn = DBconn.getConnection();  
 6         try {  
 7             ps = conn.prepareStatement(sql);  
 8             System.out.println(t);  
 9             ps.setInt(1, in);  
10             rs = ps.executeQuery();  
11 //          if(rs.next()){//在這里進行判斷集合中是否有數據存在...其實這里集合已經拿到集合中的第一條數據  
12             User user =null;  
13                 while(rs.next()){//這里已經是第二條  
14                     System.out.println(rs.getString("username"));  
15                     user = new User();  
16                     user.setUserid(rs.getInt("userid"));  
17                     user.setUsername(rs.getString("username"));  
18                     user.setPassword(rs.getString("password"));  
19                     user.setEmail(rs.getString("email"));  
20                     user.setNickname(rs.getString("nickname"));  
21                     user.setBlogstate(rs.getInt("blogstate"));  
22                     user.setUserstate(rs.getInt("userstate"));  
23                     System.out.println("用戶對象:"+user);     
24                 }  
25             return user;  
26 //          }  
27         } catch (SQLException e) {  
28             System.out.println("查詢用戶"+t.getUsername()+"可能不存在!");  
29             e.printStackTrace();  
30         }finally{  
31 //          DBconn.close(rs, stm, ps);  
32         }  
33         System.out.println("該對象不存在"+in);  
34         return null;  
35     }  

User [blogstate=0, email=null, nickname=null, password=null, userid=0, username=yejin191258966, userstate=0]
yejin191258966
用戶對象:User [blogstate=0, email=191258966@qq.com, nickname=靈嗅, password=aaaa, userid=1, username=yejin191258966, userstate=1]
yejin903207534
用戶對象:User [blogstate=0, email=903207534@qq.com, nickname=空靈, password=bbbb, userid=2, username=yejin903207534, userstate=1]

很多時候,我們都會有一個習慣先去判斷下;

因為rs.next()返回的是true 和false 如果集合中有數據返回的就是true

判斷完成我們再去遍歷

這樣數據就會少點。從第二條數據開始遍歷。當然,如果你當前查詢的只是一條數據的話。那你遍歷的結果始終都是null

所以千萬不要做這樣的判斷。我可能是之前對這個認識的不夠,所以才犯了這樣一個錯誤。


如果說是"判斷結果集里有沒有值" 那么用if(rs.next) 

while是用來做循環輸出的 換句話說 就是"如果結果集里還有值" 沒有則停止循環 這個一般在JSP做顯示用

1、rs = stmt.exeQuery(sql)后,rs肯定不會為null,注意,是rs對象不會為null,而不是其包含的result
2、既然rs不會為null,所以在rs = stmt.exeQuery(sql)后,使用while(rs.next())或者if(rs.next())時就不用判斷rs != null;
3、rs.next時,游標最先是指向第一條記錄前的位置,所以第一次rs.next后,游標指向的正好是第一條記錄(如果有的話)
4、要判斷rs的結果是否為空,只要使用一次rs.next方法就行了,如果它返回為false,則證明rs的結果為null
所以最終的代碼可以寫為:

 1     public void run() {
 2         DbTestConn conn = new DbTestConn();
 3         String sql = "select * from mo_info where mo_state = '1'";
 4         ResultSet rs = conn.exeQuery(sql);
 5         //while (!isNull) {
 6             try {
 7                 while (rs.next()) {
 8                     tr.setId(rs.getInt(1));
 9                     tr.setUser(rs.getString(2));
10                     tr.setPwd(rs.getString(3));
11                     //isNull = false;
12                 }
13             } catch (SQLException e) {
14                 //isNull = true;
15                 e.printStackTrace();
16             }
17         //}
18     }

說的簡單的話就是
while(rs.next()) //就是 將rs全部進行讀取
if(rs.next()) //rs進行讀取一次 判斷是否有數據


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM