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进行读取一次 判断是否有数据