各位大虾!!!
在Java中判断文档中数据和MySQL表中的数据重复,如果重复就不往里里面添加数据,代码应该怎么写啊!!!
通过多个字段判断

解决方案 »

  1.   

    猜想你用的是格式化文本,开个文件流,每次读一行(为一条记录),用String对象的split方法将其分解为字符串数组,将数组的各个元素用setXXX方法绑定到一个(或两个)PreparedStatement中,完成查询和插入动作。那么长的代码就不写了,有具体需要再续帖。
      

  2.   

    你说的这些我都写完了啊,我说的是这个txt文档里的数据有可能重复添加到表中,这样表中就有重复的数据
    txt文档里的数据时不断增加的,以前的数据不会删除
      

  3.   

    什么样的数据算是重复数据呢,key值相同的话你数据库操作就会抛错
    数据量不是很大的话,用文档里数据当条件去数据库中查一把吧,存在的话就不做insert了
      

  4.   

    9 17:30:00 南苑机场 20:00:00 江北国际机场 中国联航 KN2285 738 50 40 8.0折 ¥1250 经济舱
    10 17:30:00 首都国际机场 20:00:00 江北国际机场 中国国航 CA4142 73G 50 40 全价 ¥1560 经济舱
    11 18:30:00 首都国际机场 20:55:00 江北国际机场 中国国航 CA4144 73G 50 40 全价 ¥1560 经济舱
    15 17:30:00 南苑机场 20:00:00 江北国际机场 中国联航 KN2285 738 50 40 8.0折 ¥1250 经济舱
    16 17:30:00 首都国际机场 20:00:00 江北国际机场 中国国航 CA4142 73G 50 40 全价 ¥1560 经济舱
    17 18:30:00 首都国际机场 20:55:00 江北国际机场 中国国航 CA4144 73G 50 40 全价 ¥1560 经济舱上面这种,除了id后面都重复
      

  5.   

    对的,先做一次select查询,用所有的字段作为判断条件查记录,没记录就做后面的插入。还有,似乎做一个存储过程直接完成不重复插入更好一些。
      

  6.   

    那要怎么做,没做过,是不是在Java里调用存储过程
      

  7.   

    那txt里的数据和表里的数据重复,那要怎么来判断啊
    我的代码
    while((str=br.readLine())!=null)
    {
        String[] array=str.split(",");//分隔符
        PreparedStatement ps=conn.prepareStatement(sql);
        for(int i=0;i<array.length;i++)
        {    
         String strs = array[i].trim();//去掉字符串首尾空格
         String[] listname=strs.split("=");
         if(listname[0].equals("起飞时间")) 
         ps.setString(1,listname[1]);
         else if(listname[0].equals("起飞机场")) 
         ps.setString(2,listname[1]);
         else if(listname[0].equals("到达时间")) 
         ps.setString(3,listname[1]);
         else if(listname[0].equals("到达机场")) 
         ps.setString(4,listname[1]);
         else if(listname[0].equals("航空公司")) 
         ps.setString(5,listname[1]);
         else if(listname[0].equals("航班号")) 
         ps.setString(6,listname[1]);
         else if(listname[0].equals("机型")) 
         ps.setString(7,listname[1]);
         else if(listname[0].equals("机建")) 
         ps.setString(8,listname[1]);
         else if(listname[0].equals("燃油")) 
         ps.setString(9,listname[1]);
         else if(listname[0].equals("折扣")) 
         ps.setString(10,listname[1]);
         else if(listname[0].equals("票价")) 
         ps.setString(11,listname[1]);
         else if(listname[0].equals("舱位")) 
         ps.setString(12,listname[1]);
         if(listname[0].equals("编号")) 
         ps.setString(1,listname[1]);
        }
        ps.execute();
        ps.close();
    }
      

  8.   

    1、只是觉得奇怪了,用那么多if做什么。
    如果文本中字段排序和携参SQL中参数次序不一致,用If解决不了问题。如果次序一致,用if多余,总之用if是不对。
    2、应在ps.execute和ps.close之间,对结果集做处理,看是否有数据返回。
      

  9.   

    在表结构中加一个Hash列(unique),插入的前把Hash值计算好也插入。然后以后插入时都会判断是否重复,重复就不会进行插件了。
      

  10.   

    更正:前面的if...else没问题。最后的
    if(listname[0].equals("编号")) 
    ps.setString(1,listname[1]);
    }
    如果是查询是否存在重复记录,不要这个。另外,你用于查询的语句和用于插入的语句(sql变量的值)应不同。
      

  11.   

    if(listname[0].equals("编号")) 
    ps.setString(1,listname[1]);
    }饿,不用看这个,这个我忘删了
      

  12.   

    起飞机场=首都国际机场,起飞时间=16:45,到达机场=江北国际机场,航空公司=四川航空,航班号=3U8832,到达时间=19:10,机型=319,机建=50,燃油=40,折扣=全价,票价=¥1560,舱位=经济舱     
    起飞时间=17:30 , 起飞机场=南苑机场,到达时间=20:00,到达机场=江北国际机场,航空公司=中国联航,航班号=KN2285,机型=738,机建=50,燃油=40,折扣=8.0折,票价=¥1250,舱位=经济舱
      

  13.   

    简单地说,如果希望从原先做插入的代码把做查询的代码改出来,你需要做这几件事情:
    1、修改insert SQL字符串为select字符串,查询参数一样用?定义出来
    2、一样设各个字段(也就是查询参数),但不包含编号字段
    3、用ps.executeQuery()而不是ps.execute()获得ResultSet,用next()方法判断是否有查询结果返回
    4、如果next()为true表明有数据返回,则不需要做插入,否则正常做原先的插入谨慎一点的话,开个事务吧。
      

  14.   

    呵呵,学习了!是挺麻烦的。不过我的个人观点:这个问题的主要矛盾在txt中的数据来源问题。
    txt中的数据源要是可以控制一下重复的话,就不会这么麻烦了还希望楼主可以从另一个角度去考虑。PS:txt中除了id不是一个key啊,貌似剩余的其他属性才是key呢?
      

  15.   

    select departure_time,departure_airport from piaojia where departure_time=?,departure_airport=?
    ps.setString(1, departure_time());
    ps.setString(1, departure_airport());
    ps.executeQuery();
    ResultSet rs = ps.getResultSet();
    if(rs.next()){
    }
    这种方法吗
      

  16.   

    txt里的数据是不会重复的,因为是陆续往里添加数据的,但是表中数据重复,因为每更新一次,就添加一次
      

  17.   

    这样可以的,在insert之前先用txt里的数据位查询条件,如果没有就插入
      

  18.   

     String sql="select departure_time,departure_airport,arrive_time,arrive_airport,flight_company,flight_code,aircraft_type,airport_count,fuel_count,rebate,fare,space from piaojia where departure_time=?,departure_airport=?,arrive_time=?,arrive_airport=?,flight_company=?,flight_code=?,aircraft_type=?,airport_count=?,fuel_count=?,rebate=?,fare=?,space=?";
    while((str=br.readLine())!=null)
    {
        String[] array=str.split(",");//分隔符
        PreparedStatement ps=conn.prepareStatement(sql);
        for(int i=0;i<array.length;i++)
        {    
         String strs = array[i].trim();//去掉字符串首尾空格
         String[] listname=strs.split("=");
         if(listname[0].equals("起飞时间")) 
         ps.setString(1,listname[1]);
         else if(listname[0].equals("起飞机场")) 
         ps.setString(2,listname[1]);
         else if(listname[0].equals("到达时间")) 
         ps.setString(3,listname[1]);
         else if(listname[0].equals("到达机场")) 
         ps.setString(4,listname[1]);
         else if(listname[0].equals("航空公司")) 
         ps.setString(5,listname[1]);
         else if(listname[0].equals("航班号")) 
         ps.setString(6,listname[1]);
         else if(listname[0].equals("机型")) 
         ps.setString(7,listname[1]);
         else if(listname[0].equals("机建")) 
         ps.setString(8,listname[1]);
         else if(listname[0].equals("燃油")) 
         ps.setString(9,listname[1]);
         else if(listname[0].equals("折扣")) 
         ps.setString(10,listname[1]);
         else if(listname[0].equals("票价")) 
         ps.setString(11,listname[1]);
         else if(listname[0].equals("舱位")) 
         ps.setString(12,listname[1]);
        
        }
        ps.executeQuery();
        ResultSet rs = ps.getResultSet();
        while(rs.next())
        {
        
        }     ps.close();
    }
    conn.close();
      

  19.   

    sql字符串中:from piaojia where departure_time=? and departure_airport=? and ...下面Java代码中:
    ResultSet rs = ps.executeQuery();
    if (!rs.next()){
    //做插入
    }