如何使用ItemWriter执行mysql LOAD DATA INFILE?

时间:2017-08-17 10:18:47

标签: java mysql spring spring-batch

我想创建一个spring-batch作业,将csv内容(内存)批量加载到mysql数据库中。

我必须在Statement本身打电话给一个二传手。 st.setLocalInfileInputStream(..)

问题:我尝试使用ItemPreparedStatementSetter,但PreparedStatement内部只是一个私有代理,无法转换为语句,获得异常:

java.lang.ClassCastException: com.sun.proxy.$Proxy74 cannot be cast to com.mysql.jdbc.Statement

那么,我如何使用ItemWriter来执行批量插入?

以下不起作用:

    JdbcBatchItemWriter<String> writer = new JdbcBatchItemWriter<>();
    writer.setDataSource(ds);
    writer.setSql("LOAD DATA LOCAL INFILE '' into table mytable");

    ItemPreparedStatementSetter<String> ps = new ItemPreparedStatementSetter<String>() {
        @Override
        public void setValues(String csv, PreparedStatement ps) throws SQLException {
            //this fails
            ((com.mysql.jdbc.Statement) ps).setLocalInfileInputStream(new ByteArrayInputStream(csv.getBytes()));
        }
    };

    writer.setItemPreparedStatementSetter(ps);
    writer.write(Arrays.asList(content));

1 个答案:

答案 0 :(得分:1)

在Spring Batch中,通过准备好的语句管理CSV并不是基于块的编写器的用途。这实际上是Tasklet实现的任务。从那里,您将可以更好地控制您收到的陈述等。