JDBC连接mysql数据库查询数据时遇到的bug

记录一下今天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!至此全部搞定!查询结果终于正常啦!在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值