Ich habe ein Spider-Programm erstellt.Warum fügt java.util.list vorherige Daten hinzu, die beim Hinzufügen neuer Daten gelöscht wurden
Es gibt ein Problem, dass einige Daten beim Einfügen von Daten in die MySQL-Datenbank wiederholt werden.
Wenn beispielsweise das Programm die Daten von A eingefügt hat, fügt sie zunächst einige Werte von A Feld in der Datenbank, bevor die Daten von B Einsetzen dann B.
Einsetzen in Datenbank >>>>>
please click to check the exmple
B nicht über die rot-Daten aber noch eingefügt. Ich löschte Liste vor dem Einfügen von B, aber es funktioniert nicht.
Wenn I debuging:
Einfügen A_list [a.size 45, list.size = 45]
list.clear() [list = null]
list = getB()
Einfügen B_list [list.size = 45 + 49 = 94] [B.Size 49]
warum ist die Größe der Liste zu diesem Zeitpunkt 94? Es sollte wieder 49.list Daten von A hinzugefügt werden.
Hier sind meine Codes:
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;
}
}
}
die htmlParser.parseUserlist (Benutzer) Codes:
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;
}
mir bitte helfen!
Sieht aus wie 'htmlParser.parseUserlist (Benutzer)' verwandt ist Dieses Problem ... können Sie hinzufügen, es ist der Code oder sagen Sie uns, welche Bibliothek das ist? – Tom
Ich habe die code.please eine Überprüfung. Es gibt nur eine Liste. – JiaoPaner
BTW: 'sqlvisited +" '"+ userlist.get (j) .getUserid() + "'" 'ist eine Sicherheitslücke ** if ** und nur wenn' getUserid() 'in der Lage ist eine gültige SQL-Zeichenkette zurückzugeben. Verketten Sie nie Datenparameter, auch wenn Ihre Daten direkt von dort kommen die Datenbank selbst ... das heißt "best practice". Verwenden Sie vorbereitete Anweisungen absolut ** immer und überall **, auch wenn es unnötigen Code bedeutet. Noch besser: Verwenden Sie JPA-Kriterien, diese werden automatisch ausgeblendet und sind von Grund auf sicher – specializt