PreparedStatementSetter问题

时间:2018-12-17 13:27:41

标签: java oracle jdbc

为什么我的代码两次导入最后一行?每行从零到x都是可以的,然后再将最后一行添加一次。

@Override
public void batchUpt2(User_FK users) {
    long startTime = System.nanoTime(); 
    jdbcTemplate.update("INSERT INTO INS_RAZNO.BULK_TEST VALUES (?, ?, ?)", new PreparedStatementSetter() {
        public void setValues(PreparedStatement ps) throws SQLException {
            int x;
            int size = users.getUser().size();
            for(x = 0; x < size; ++x) {
                ps.setInt(1, x + 1);
                ps.setLong(2, users.getUser().get(x));
                ps.setInt(3, users.getSys());
                ps.addBatch();
            }ps.executeBatch();
        }

    });
    long endTime = System.nanoTime();
    long duration = (endTime - startTime) / 1000000;
    System.out.println("-------------"+duration+"-----------------forEach");

}

我在参数中有这个“用户”:[1,2,3,4,5,6]但有7个插入。结果在第1,2,3,4,5,6,6行

2 个答案:

答案 0 :(得分:0)

也许最后一个用户在源列表中被添加了两次。您可以通过在setValues()中打印源列表的大小来检查吗?

答案 1 :(得分:0)

这是我正在使用的最终解决方案。

@Override
public void batchUpt2(User_FK users) {


    long startTime = System.nanoTime(); 
    for(int i = 0; i < users.getUser().size(); i++) {
        jdbcTemplate.update("INSERT INTO INS_RAZNO.BULK_TEST VALUES (?, ?, ?)", new Object[] {
            i+1, users.getUser().get(i), 1  
        });
    }
    long endTime = System.nanoTime();
    long duration = (endTime - startTime) / 1000000;
    System.out.println("-------------"+duration+"-----------------forEach");

}