使用java从csv文件读取数据并使用jdbcTemplate批量插入

时间:2015-12-31 09:37:17

标签: spring jdbctemplate

我得到一个例外,

  

“在索引:: 1处缺少IN或OUT参数”

当我批量插入从csv文件中读取的数据时。有趣的是,只有当我循环使用jt.batchUpdate()方法时才会出现异常。否则插入成功。

因此,我的数据是成千上万的..我想以5000的批量插入它,但如果我没有得到例外。

代码示例:

for (int curRowCount = 0; curRowCount < dataCount; curRowCount += batchSize) {
    jt.batchUpdate(insert_query, new BatchPreparedStatementSetter() {
    @Override
    public void setValues(PreparedStatement ps, int i) throws SQLException {
    int rowCount=0;
    try {
        while ((line = br.readLine()) != null) {
        final String[] data = line.split(cvsSplitBy);
        if(rowCount>0){
        ps.setTimestamp(1, new Timestamp(date.getTime()));
        ps.setString(2, "A"); // so on
        }
        rowCount++;
        }
        } catch (Exception e) {
        e.printStackTrace();
        }}
        @Override
        public int getBatchSize() {
        return dataCount;
        }
        });
}

1 个答案:

答案 0 :(得分:0)

BatchPreparedStatementSetter将被Spring调用多次,因为它们是批处理中的元素。

它将在i = 0时第一次调用,并且该调用应该填充PreparedStatement参数以插入第一行。

然后它会在i = 1的情况下第一次被调用,并且该调用应该填充PreparedStatement参数以插入第二行。

等。等到达极限:dataCount

但是你的代码并没有这样做。第一次调用BatchPreparedStatementSetter时,它会读取阅读器中的所有行,设置第一行的参数,然后将其替换为第二行的参数等,直到读者不再有行为止。因此,您可以设置i = 0的参数,并使用文件最后一行中的值。然后Spring调用setter,因为i = 1,但是你的读者已经完全读完了,所以它没有在语句中设置任何参数,因此错误。