2016-05-04 2 views
0

Я создал программу-паук.Почему java.util.list добавляет предыдущие данные, которые были очищены при добавлении новых данных.

Существует проблема, когда некоторые данные повторяются при вставке данных в базу данных MySQL.

Например, когда программа вставили данные А, во-первых, вставляет некоторые значения поля А в в базу данных, прежде чем вставить данные B, а затем вставки B.

в базе данных >>>>>

please click to check the exmple

B не имеет красных данных, но все еще вставлен. Я удалил список перед вставкой B, однако он не работает.

Когда я отладки:

вставки a_list [a.size 45, list.size = 45]

list.clear() [список = 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

Похож на 'htmlParser.parseUserlist (user)' связан с эта проблема ... вы можете добавить ее в код или сообщить нам, что это библиотека? – Tom

+0

Я добавил код.please есть чек, он просто возвращает список. – JiaoPaner

+0

btw: 'sqlvisited +" '"+ userlist.get (j) .getUserid() + "'" 'является дырой безопасности **, если ** и только если' getUserid() 'может возвращать правильную строку SQL. Никогда не объединяйте параметры данных, даже если ваши данные поступают непосредственно из сама база данных ... называется «лучшей практикой». Используйте готовые заявления абсолютно ** каждый раз и везде **, даже если это означает ненужный код. Еще лучше: используйте критерии JPA, они автоматически экранируются и несколько безопасны по дизайну . – specializt

ответ

0

Я не вижу ничего плохого, что могло бы стать причиной вашей проблемы в коде, который вы предоставили. Одно дело знать, что list.Clear() не совпадает с list = null; потому что пустой список - это список, который не содержит элементов, а clear() опустошает список. В вашем методе вставки вы бы лучше с помощью userList.isEmpty() (видя, как вы всегда создаете список и в худшем случае возвращаете пустой список из parseUserList.

+0

Проблема решена. Спасибо тоже. Я буду модифицировать свой код лучше на основании вашего совета – JiaoPaner

Смежные вопросы