之前对ResultSet结果集的next()方法的引用没太多在意,常常就是直接while(rs.next())进行遍历。
如果要对rs结果集做是否为空进行判断的话,很多人第一想法是 if(rs == null),这是错误的,无论什么结果都会返回 false 的结果,
在这里我们就需要用if(rs.next())或者是if(rs.first())。前者是判断rs是否有值,没有时返回false;后者是判断rs指针是否指在第一条,如果为空时返回false。
因为rs初始化时是指在第一条的,而我们在调用next()、first()等方法后,它就会指向第二条,因此在做完判断我们需要给指针前移一位,用previous()这个方法。
if(rs.first()){//当结果集存在时
list = new ArrayList();
rest.previous();
}
while(rs.next()){//遍历结果集
xxxxxxx
list.add(xxx);
}
这里用first()方法是个人习惯,用next()方法也是同样的原理。
有些人会说为什么要判断,直接遍历不好吗,多此一举。。。。但是我们如果需要根据结果来初始化对象时,就需要做判断,就像我上面的代码一样。
因为以前也是拿到rs后直接就while(rs.next)进行遍历了,所以也没发现问题。今天碰巧遇到了,给自己留点记忆,供自己也是提醒朋友们避免这个问题。