ArrayList aSql =new ArrayList();//装SQL语句
String sSql ="select a.Consignee_Name,a.distribution_type,b.order_no from kt_TRACKING_2 as a inner join TARCH_ORDER as b on a.tarch_no =b.tarch_no where distribution_type=? and Consignee_Name=? and CREATE_DATE like '"+sDate+"%'";        //sDate是日期,可变的
PreparedStatement pst =oConn.prepareStatement(sSql);//oConn 是自定义的静态类,用来连接数据库
for(int i=0;i<saConsignenNo.length;i++)
{
   /*saDistribution_type的长度和saConsignenNo的长度是一样的*/
    pst.setString(1,saDistribution_type[i]);//saDistribution_type是事先定义好的数组
    pst.setString(2,saConsignenNo[i]);//saConsignenNo是事先定义好的数组
   oResultSet =pst.executeQuery();//oResultSet是自定义的,功能和ResultSet一样的                
                        
   if(!oResultSet.next())
  {                                
       String sNo =String.valueOf(SysUtil.getSerialNo("kt_TRACKING_2.TARCH_NO"));
       String sSqls ="insert into kt_TRACKING_2    (TARCH_NO,Consignee_Name,CREATE_DATE,distribution_type) values ('"
     +sNo+"','"+saConsignenNo[i]+"','"+sDate+"','"+saDistribution_type[i]+"')";
                                                                        
      aSql.add(sSqls);
}}
Dao.updateBatch(aSql,oConn);//Dao是自定义的类,批量执行SQL 语句用
上面的代码是想循环执行查询,将两个数组的值作为条件,然后判断是否有值返回,若有值返回表示数据库有相同的值。则不予理会,若next()方法没有执行,表示没有值返回,则将当前两个数组中的值添加到数据库中。
但是,现在每次执行的时候,数据库中有相同的值也往里面添加,实在是很奇怪,请各位高手帮忙看一下这段代码,敬请指出问题所在。非常感谢!  

解决方案 »

  1.   

    没有数据,是不是next也会执行一次?
    在if前打印一次oResultSet.next()
      

  2.   

    将你不想重复插进的字段 在数据库里设置成 unique 的不行吗,这个东西要靠 java 来控制吗?当插进重复值的时候,抛出异常接住他不就行了嘛
      

  3.   

    但是我试了.却没有这种情况,可能是其它地方有错
    import java.sql.*;
    public class TestJDBC{
    public static void main(String[] args){
    Connection con = null;
    String DriverName = "com.mysql.jdbc.Driver";
    String URL = "jdbc:mysql://localhost:3306/photo?useUnicode=true&characterEncoding=utf-8";
    String user = "root" ;
    String password = "root";
    String fullURL = URL+"&user="+user+"&password="+password; try{
    Class.forName(DriverName);
    }catch(Exception e){
    e.printStackTrace();
    }
    try{
    con = DriverManager.getConnection(fullURL);
    }catch(Exception e){
    e.printStackTrace();
    }
    try{
    Statement stmt = con.createStatement();
    ResultSet rs = stmt.executeQuery("select * from entity1 where 1=1");
    //System.out.println(rs.next());
    if (!rs.next()){
    System.out.println("dddd");
    } rs = stmt.executeQuery("select * from entity1 where 1=2");
    //System.out.println(rs.next());
    if (!rs.next()){
    System.out.println("dddd");
    }
    con.close();
    }catch(Exception e){
    e.printStackTrace();
    } }
    };
      

  4.   

    问题解决了,是“select  a.Consignee_Name,a.distribution_type,b.order_no  from  kt_TRACKING_2  as  a  inner  join  TARCH_ORDER  as  b  on  a.tarch_no  =b.tarch_no  where  distribution_type=?  and  Consignee_Name=?  and  CREATE_DATE  like  '"+sDate+"%'";  ”这个SQL语句取出来的值不对引起的。
    非常感谢 lydvqq(碧水情缘♀黑哥)和didoleo(冷月无声)的指点。谢谢!