为什么 java.util.list 添加以前的数据,这些数据在添加新数据时被清除
why does java.util.list adds previous data which were cleared when adding new data
我创建了一个蜘蛛程序。
在向MySQL数据库中插入数据时出现了一些数据重复的问题。
比如程序插入A的数据时,先把A的字段的一些值插入数据库,再插入B的数据,再插入B。
在数据库中>>>>>
please click to check the exmple
B没有红色数据但仍然插入。
我在插入 B 之前清除了列表,但是它不起作用。
调试时:
插入A_list[A.size是45,list.size=45]
list.clear() [列表=空]
list=getB()
插入B_list[list.size=45+49=94][B.size是49]
为什么此时list的大小是94?
应该是49.list再次添加了A的数据。
这是我的代码:
private static void Insert(List<User> rootusers) throws Exception{
String sql="insert into t_userlist(userid,username,rootuserid,rootusername,visited) values(?,?,?,?,?)";
String sqlupdate="update t_userlist set visited=1 where userid=?";
String sqlvisited="SELECT * from t_userlist where visited=1 and userid=";
Connection conn=null;
PreparedStatement psmt = null;
PreparedStatement ps;
for(int i=0;i<rootusers.size();i++){
User user=rootusers.get(i);
List<User> userlist=htmlParser.parseUserlist(user);
if(userlist!=null){
conn=DbUtil.getConn();
conn.setAutoCommit(false);
try {
for(int j=0;j<userlist.size();j++){
int visitedUser=selectUserID(sqlvisited+"'"+userlist.get(j).getUserid()+"'").size();
psmt=conn.prepareStatement(sql);
psmt.setString(1, userlist.get(j).getUserid());
psmt.setString(2, userlist.get(j).getUsername());
psmt.setString(3, user.getUserid());
psmt.setString(4, user.getUsername());
if(visitedUser!=0){
psmt.setInt(5, 1);
}
else {
psmt.setInt(5, 0);
}
psmt.executeUpdate();
psmt.close();
}
ps=conn.prepareStatement(sqlupdate);
ps.setString(1,user.getUserid());
ps.executeUpdate();
conn.commit();
ps.close();
DbUtil.closeConn(conn);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (Exception e) {
try {
if(conn!=null)
{
conn.rollback();
// conn.setAutoCommit( true);
}
} catch (Exception e1) {
e1.printStackTrace();
}
}
**userlist.clear();**
System.out.println("insert"+user.getUsername()+"successfully");
}else {
continue;
}
}
}
htmlParser.parseUserlist(用户)代码:
public static ArrayList<User> parseUserlist(User user) throws Exception{
String userlist=GetUserlist.getUserList(user.getUserid());//just return html
ArrayList<User> list=new ArrayList<User>();
if(userlist!=null){
Document doc=Jsoup.parse(userlist);
Elements users=doc.select("a[usercard]");
for(Element nodeuser:users){
//System.out.println(nodeuser.toString());
User u=new User();
u.setUserid(nodeuser.attr("usercard").substring(3,13));
u.setUsername(nodeuser.text());
u.setRootuserid(user.getUserid());
list.add(u);
//System.out.println(u.getUserid()+" "+u.getUsername());
}
}else {
System.out.println(user.getUsername()+"没有关注任何人");
}
//System.out.println(users.toString());
//System.out.println(list.get(1).getUsername());
return list;
}
请帮帮我!
在您提供的代码中,我没有发现任何会导致您出现问题的错误。需要知道的一件事是 list.Clear() 与 list = null; 不同。因为空列表是不包含任何元素的列表,而 clear() 会清空列表。在你的插入方法中,你会用 !userList.isEmpty() 做得更好(看看你如何总是创建一个列表,最坏的情况是从 parseUserList.
返回一个空列表
我创建了一个蜘蛛程序。
在向MySQL数据库中插入数据时出现了一些数据重复的问题。
比如程序插入A的数据时,先把A的字段的一些值插入数据库,再插入B的数据,再插入B。
在数据库中>>>>>
please click to check the exmple
B没有红色数据但仍然插入。 我在插入 B 之前清除了列表,但是它不起作用。
调试时:
插入A_list[A.size是45,list.size=45]
list.clear() [列表=空]
list=getB()
插入B_list[list.size=45+49=94][B.size是49]
为什么此时list的大小是94? 应该是49.list再次添加了A的数据。
这是我的代码:
private static void Insert(List<User> rootusers) throws Exception{
String sql="insert into t_userlist(userid,username,rootuserid,rootusername,visited) values(?,?,?,?,?)";
String sqlupdate="update t_userlist set visited=1 where userid=?";
String sqlvisited="SELECT * from t_userlist where visited=1 and userid=";
Connection conn=null;
PreparedStatement psmt = null;
PreparedStatement ps;
for(int i=0;i<rootusers.size();i++){
User user=rootusers.get(i);
List<User> userlist=htmlParser.parseUserlist(user);
if(userlist!=null){
conn=DbUtil.getConn();
conn.setAutoCommit(false);
try {
for(int j=0;j<userlist.size();j++){
int visitedUser=selectUserID(sqlvisited+"'"+userlist.get(j).getUserid()+"'").size();
psmt=conn.prepareStatement(sql);
psmt.setString(1, userlist.get(j).getUserid());
psmt.setString(2, userlist.get(j).getUsername());
psmt.setString(3, user.getUserid());
psmt.setString(4, user.getUsername());
if(visitedUser!=0){
psmt.setInt(5, 1);
}
else {
psmt.setInt(5, 0);
}
psmt.executeUpdate();
psmt.close();
}
ps=conn.prepareStatement(sqlupdate);
ps.setString(1,user.getUserid());
ps.executeUpdate();
conn.commit();
ps.close();
DbUtil.closeConn(conn);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (Exception e) {
try {
if(conn!=null)
{
conn.rollback();
// conn.setAutoCommit( true);
}
} catch (Exception e1) {
e1.printStackTrace();
}
}
**userlist.clear();**
System.out.println("insert"+user.getUsername()+"successfully");
}else {
continue;
}
}
}
htmlParser.parseUserlist(用户)代码:
public static ArrayList<User> parseUserlist(User user) throws Exception{
String userlist=GetUserlist.getUserList(user.getUserid());//just return html
ArrayList<User> list=new ArrayList<User>();
if(userlist!=null){
Document doc=Jsoup.parse(userlist);
Elements users=doc.select("a[usercard]");
for(Element nodeuser:users){
//System.out.println(nodeuser.toString());
User u=new User();
u.setUserid(nodeuser.attr("usercard").substring(3,13));
u.setUsername(nodeuser.text());
u.setRootuserid(user.getUserid());
list.add(u);
//System.out.println(u.getUserid()+" "+u.getUsername());
}
}else {
System.out.println(user.getUsername()+"没有关注任何人");
}
//System.out.println(users.toString());
//System.out.println(list.get(1).getUsername());
return list;
}
请帮帮我!
在您提供的代码中,我没有发现任何会导致您出现问题的错误。需要知道的一件事是 list.Clear() 与 list = null; 不同。因为空列表是不包含任何元素的列表,而 clear() 会清空列表。在你的插入方法中,你会用 !userList.isEmpty() 做得更好(看看你如何总是创建一个列表,最坏的情况是从 parseUserList.
返回一个空列表