为什么java.util.list会添加在添加新数据时清除的先前数据

时间:2016-05-04 12:27:06

标签: java mysql

我创建了一个蜘蛛程序。

在将数据插入MySQL数据库时,存在重复某些数据的问题。

例如,当程序插入A的数据时,它首先在插入B的数据之前将A的字段的一些值插入数据库,然后插入B.

数据库中的

>>>>>

please click to check the exmple

B没有红色数据但仍插入。 我在插入B之前清除了列表,但它不起作用。

当我调试时:

插入A_list [A.size为45,list.size = 45]

list.clear()[list = null]

列表= getB()

插入B_list [list.size = 45 + 49 = 94] [B.size为49]

为什么此时列表的大小为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;
}

请帮助我!

1 个答案:

答案 0 :(得分:0)

我没有发现任何错误,这些错误会导致您提供的代码出现问题。要知道的是list.Clear()与list = null不同;因为空列表是不包含元素的列表,clear()清空列表。在你的insert方法中,你可以用!userList.isEmpty()做得更好(看看你总是如何创建一个列表,最糟糕的是从parseUserList返回一个空列表。