关于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