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進行讀取一次 判斷是否有數據