记录一下今天JDBC连接数据库查询数据时遇到的问题
查询的核心代码如下:
List<User> users=new ArrayList<User>();
...
User user1=new User();
while(rs.next()){
user1.setId(rs.getInt(1));
user1.setrealName(rs.getString(2));
user1.setSex(rs.getString(3));
user1.setAge(rs,getInt(4));
user1.setAddress(rs.getString(5));
user1.setHeight(rs.getInt(6));
user1.setWeight(rs.getInt(7);
user1.setPersonal(rs.getString(8));
users.add(user1);
}
...
return users;
然后控制台是没有报错的,但是我得到的结果却是有问题的,结果如下:
这显然是有问题的啊,于是我就去看底层实现代码,实在是找不到bug啊,一脸懵,然后我加了输出语句,希望把查询的过程每一步都输出到控制台去看,然后发现,没毛病啊,查询的结果是正常的,每条数据都不一样,于是我回过头去看jsp中的遍历集合语句,也是没毛病,于是我在数据的每个传输阶段都加了输出语句(dao、service、servlet、jsp),问题定位到了dao层,还是数据访问层的问题啊,于是又回过头去看代码,发现数据在查询的时候是正确的,但是到了返回值的上一行,数据就不对了,那么肯定拿到数据后再存储的时候出了问题!!!!!
终于找到问题所在,我上面只声明了一个
User user1=new User();
后面一直在集合里添加user1,那么我的users集合里自始至终则只是反复存储了多个User的实例化对象user1,每查询到一条数据,我就把查询到的数据的各个属性值赋给user1;然后存储user1到集合里,而不是存储了多个不同的User的实例化对象;那么结果肯定是错误的啊!
于是我对代码做出如下修改,首先的得到查询的结果条数count,然后声明一个长度为count的User数组,将查询到的数据先存储到数组里的各个User的实例化对象里,然后再将数组的每一个元素添加到集合users里;
代码如下:
...
User user1[]=new User[count];
int i=0;
while(rs.next()){
user1[i].setId(rs.getInt(1));
user1[i].setrealName(rs.getString(2));
user1[i].setSex(rs.getString(3));
user1[i].setAge(rs,getInt(4));
user1[i].setAddress(rs.getString(5));
user1[i].setHeight(rs.getInt(6));
user1[i].setWeight(rs.getInt(7);
user1[i].setPersonal(rs.getString(8));
users.add(user1[i]);
i++;
}
...
return users;
事与愿违啊,悲伤辣么辣么大!!可绕地球三圈半-------》还是报错!!!
空指向异常!哎,也还好,冷静~
老规矩,同上,在控制台输出查询结果rs和count,看看谁是空的,结果都能正常输出,那就继续看代码啦。。。
“元气满满”的一天从找bug开始!我坚强!
!!!是User[]数组的问题!!!
啊~舒畅,找到bug的感觉真滴舒爽!
我的对象数组user1里的各个对象都没有实例化,声明数组并实例化,但是我并没有实例化数组里的对象啊!!
于是再在user1数组的声明的下一行加上代码:
for(int i=0;i<count;i++){
User[i]=new User();
}
OK!至此全部搞定!查询结果终于正常啦!