JAVA中ResultSet结果集为空判断

本文讲述了在Java中处理ResultSet时遇到的一个常见问题,即在判断结果集是否为空时误用`if(rs==null)`导致实际结果为空时未被正确识别。作者通过自己的学习和调试经验,指出应该使用`if(rs.next())`或`if(rs.first())`来正确判断结果集是否有数据。同时,还提供了在使用这些方法后恢复指针位置的方法。

问题来自于一次事故(新手轻喷),如不想看可直接跳至方法

故事(事故)如下

刚刚接触MVC架构,视频刷的飞起,然后,(脑子:我已经会了!!!)(手:不,你不会)
Dao层与Util包都构建好后,开始写Service层,在激动的调试中(改bug中),nice,程序正常结束(插入一些数据)
结果,数据库莫得任何反应(整得我以为又是哪个精神小伙没有好好接上通道还给我偷偷关上了)然而眼球编译器不起作用后,只能好好一步步看debug

然后,重点来了!!!

运行时ResultSet(以下简写rs)不等于null,但本来应该是判断为空(后来才知道这里的问题),而且后面while(rs.next())直接跳过也证明结果集就是空的
所以相当于什么都没执行,当然直接return true了

//这里传入了一本书的信息
public boolean newBook(String isbn, String type, int price, String auth, String bName) throws Exception {

    rs = tBookDao.select("bName",bName);
    if(rs==null){ //错误的根源
        tBookDao.insert(isbn,type,price,auth,bName);
    }else{
        while(rs.next()){
            if(!(rs.getString("isbn").equals(isbn))){
                flag = tBookDao.update("isbn",isbn,rs.getInt("price"),bName);
                if(!flag) return false;
            }
            if(!(rs.getString("type").equals(type))){
                flag = tBookDao.update("type",isbn,rs.getInt("price"),bName);
                if(!flag) return false;
            }
            if(!(rs.getInt("price")==price)){
                flag = tBookDao.update("bName",bName,price,bName);      ////
                if(!flag) return false;
            }
            if(!(rs.getString("auth").equals(auth))){
                flag = tBookDao.update("auth",auth,rs.getInt("price"),bName);
                if(!flag) return false;
            }
        }
    }
    return true;
}

然后我也是看了别人的博客才明白

问题与方法

问题

错误出在判断结果集为空时使用了if(rs==null)
但实际上rs是有一个对象的,只不过对象中的值或为null或为false

解决方法

如果需要判断的话,用if(rs.next())或者是if(rs.first())
前者是判断rs是否有值,没有时返回false;后者是判断rs指针是否指在第一条,如果为空时返回false。
因为rs初始化时是指在第一条的,而我们在调用next(),first()等方法后,它就会指向第二条,所以在做完判断后,我们需要给指针前移一位,用previous()方法。
例子如下

if(rs.first()){
//当结果集存在时
//xxx
rest.previous();
}

while(rs.next()){
//遍历结果集
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值