首页 > 技术文章 > ResultSet只返回一行数据的原因

dlfming 2018-04-09 22:11 原文

  写之前,先告戒一下自己......写代码一定要细心,自己写的即使是非常简单的地方也要细心,不能自我感觉太良好,那往往可能会有些bug在等着你......

  注意事项:

  1、当你为了查看数据库中是否存在某条记录时,比如查询表中是否有某账号名,有就返回前台一个“该账号已注册”的消息。诸如此类的单查询时,可以这么写:

  

       if(rs.next()){
                user.setName(rs.getObject("name").toString());
                user.setPwd(rs.getObject("password").toString());
                user.setPhone(rs.getObject("phone").toString());
                user.setSex(rs.getObject("sex").toString());
                user.setBirthday(rs.getObject("birthday").toString());
                user.setAdress(rs.getObject("adress").toString());
                user.setEmail(rs.getObject("email").toString());
            } else{
                return null;
            }

这里用了“if”,是可以的,因为就是为了查看是否有这么个User,有就返回信息,没有就null。但是,如果想要返回的不止是一个User,而是我想查看所有的User,或者加上某些条件。总之想要查询得到一个集合,然后存入List或者Map,记住!用while,而不是if。可能大多数人不会跟我一样傻......写在这里提醒自己一下吧,要是有缘人相见,但愿对你有所帮助。

  2、除了上一种错误会导致ResultSet只返回一行,貌似还有一种情况,我看到网上有人提到这种代码:

  

       Product product = new Product();
            while(rs.next()){                                                
                product.setName(rs.getObject("name").toString());                
                product.setType(rs.getObject("type").toString());
                product.setPrice(rs.getInt("price"));                
                product.setStock(rs.getInt("stock"));
                product.setSell(rs.getInt("sell"));
                product.setImgurl(rs.getObject("imgurl").toString());
                plist.add(product);
            }

  这里,当你把这个Product对象放在while循环外面是错的,但是并不会只返回一条记录,而是会返回很多条一样的记录。这是因为只有一个product对象在不停的被add在list里面,但是经过实践检验,我发现重复add的都是表中最后一条记录:

  

比如此表,执行查询add到list之后:

  

 

这在我的理解中是因为第一个product在add到List之后,第二个product(其实还是第一个product,因为就一个product对象)被赋予了新的属性,同时第一个product的属性也会被刷新覆盖了。以此类推,直到最后一个product的属性被重新赋予,之前所有的List记录都会被刷新变为最后一次所赋予的属性值。不知道原理是不是这样,我就先这么理解了...... 

  所以,这么写的代码并不会造成ResultSet只有一行的错误......

 

推荐阅读