Executebatch只能在数据库中插入最后一行

时间:2015-01-12 06:15:37

标签: java jdbc

我这样做但在数据库的最后一行只更新。

我已检查过20行,所有行都是在addbatch时添加但是在executeBatch时,在数据库中仅添加了最后一行。

ArrayList<String> li = (ArrayList<String>)request.getAttribute("VL01Data");
Iterator<String> it = li.iterator();
String splitter = request.getAttribute("SPLITTER") != null ?(String)request.getAttribute("SPLITTER"): "!";                       

String QueryIn = "INSERT INTO ......) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";                   

while(it.hasNext()) {
    String value =it.next().toString(); 

    StringTokenizer strTok = new StringTokenizer(value,splitter);
    String S = strTok.nextElement().toString().trim();
    String I = strTok.nextElement().toString().trim();              
    String M = strTok.nextElement().toString().trim();
    String d = strTok.nextElement().toString();             
    String R = strTok.nextElement().toString().trim();              
    String Pu = strTok.nextElement().toString().trim();             
             .               
             .                 

    pstmt = con.prepareStatement(QueryIn);
    pstmt.setString(1,e );
    pstmt.setString(2, r);
    pstmt.setString(3, y);
    pstmt.setString(4, d);
    pstmt.setString(5, y);
    pstmt.setString(6, i);  
                 .
                 .
    pstmt.setString(19,f1 );    
    pstmt.setString(20,f2);                 
    pstmt.addBatch();                                           
}

pstmt.executeBatch();               
con.commit();           

1 个答案:

答案 0 :(得分:1)

不要在循环体中重新prepare语句。在循环之前准备一次

pstmt = con.prepareStatement(QueryIn);

while(it.hasNext()) {
  String value = it.next().toString(); 

  StringTokenizer strTok = new StringTokenizer(value,splitter);
  String S = strTok.nextElement().toString().trim();
  String I = strTok.nextElement().toString().trim();                
  String M = strTok.nextElement().toString().trim();
  String d = strTok.nextElement().toString();               
  String R = strTok.nextElement().toString().trim();                
  String Pu = strTok.nextElement().toString().trim();

  // pstmt=con.prepareStatement(QueryIn);
  // ...

当您通过调用pstmt重新分配prepareStatement引用时,它会丢失先前的(批处理)状态(在每次循环迭代中),因此您只能获得当你致电executeBatch()时,最后一个。