版权声明:本文为博主原创文章,转载请注明出处:https://blog.youkuaiyun.com/qq_41922058
一、问题来源
做项目开发查询所有用户功能时出现的一个严重逻辑错误。
要开发一个带有后台管理用户的功能:
于是先进行数据库数据查询封装进JavaBean添加进数据结构,发现界面展示的数据并不是自己想要的数据,而是最后一条记录的重复数据。
二、问题展示
查询代码:
public static List<TbUser> queryLogin() {
List<TbUser> list = new ArrayList<TbUser>();
ResultSet rs = findForResultSet("select * from tb_userlist");
TbUser tb = new TbUser();
try {
while(rs.next()) {
String name = rs.getString(1);
String pwd = rs.getString(2);
tb.setName(name);
tb.setPassword(pwd);
System.err.println(tb);
list.add(tb);
// System.err.println(list);
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
} 
数据库数据

三、思路
不断测试发现list是这样变化的

1.更改list声明区域
无论将数据结构改为成员变量、局部变量还是更改static,结果还是重复。
显然不是集合区域问题。
2.list.add()原理
List.add(tb);???问题出在这里,list不是添加的对象的本身,而是添加了一个引用。
代码将TbUser对象声明在循环外边,所以引用只有一个,所以这也就不难解释为啥只有最后一条记录的重复。
TbUser tb = new TbUser();
try {
while(rs.next()) {
list.add(tb);
}
} catch (SQLException e) {
e.printStackTrace();
}四、解决方案
将TbUser对象声明在循环内,每次创建不同的引用。
try {
while(rs.next()) {
TbUser tb = new TbUser();
list.add(tb);
}
} catch (SQLException e) {
e.printStackTrace();
} 
五、附加
操作mysql数据库极有可能出现写入数据乱码问题。这就需要在连接数据库时声明编码类型,默认编码为ISO-8859-1。
String dbUrl = "jdbc:mysql://127.0.0.1:3306/db_database28?characterEncoding=UTF-8";// 访问MySQL数据库的路径
本文介绍了一种在Java中从数据库查询数据时遇到的问题及解决方法。问题表现为查询结果集中只显示最后一条记录的重复数据。通过分析,发现原因是由于在循环外部声明了TbUser对象,导致每次循环都修改同一个对象的属性。最终解决方案是在循环内部重新声明TbUser对象,确保每次循环都有一个新的对象被添加到列表中。
14万+

被折叠的 条评论
为什么被折叠?



