我创建了一个蜘蛛程序。
在将数据插入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;
}
请帮助我!
答案 0 :(得分:0)
我没有发现任何错误,这些错误会导致您提供的代码出现问题。要知道的是list.Clear()与list = null不同;因为空列表是不包含元素的列表,clear()清空列表。在你的insert方法中,你可以用!userList.isEmpty()做得更好(看看你总是如何创建一个列表,最糟糕的是从parseUserList返回一个空列表。