我想创建一个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));
答案 0 :(得分:1)
在Spring Batch中,通过准备好的语句管理CSV并不是基于块的编写器的用途。这实际上是Tasklet
实现的任务。从那里,您将可以更好地控制您收到的陈述等。