我遇到了一个问题,JdbcBatchItemWriter
正在选择最后一条更新记录,我创建了ItemPrepartedStatementSetter
,它正在迭代一个对象数组并设置preparedStatement
。请提供任何输入,下面是代码
XML:
<bean id="jdbcWriter"
class="org.springframework.batch.item.database.JdbcBatchItemWriter">
<property name="sql"
value="UPDATE XTABLE SET FLG = ? , LST_UPDT_DT =?
where CTGRY= ? AND TYPE =? AND SEQ_NBR =? AND SOURCE_KEY =?" />
<property name="dataSource" ref="dataSource" />
<property name="itemPreparedStatementSetter">
<bean class="com.batch.setter.XItemPrepartedStatementSetter" />
</property>
</bean>
类
public class XItemPrepartedStatementSetter implements
ItemPreparedStatementSetter<AggrPreference[]> {
@Override
public void setValues(X[] xArr, PreparedStatement preparedStatement)
throws SQLException {
for (int i = 0; i < xArr.length; i++) {
X x = xArr[i];
preparedStatement.setString(1, x.getFLG());
preparedStatement.setTimestamp(2, x.getLST_UPDT_DT());
preparedStatement.setString(3, x.getCTGRY());
preparedStatement.setString(4, x.getTYPE());
preparedStatement.setString(5, x.getSEQ_NBR());
preparedStatement.setBigDecimal(6, x.getSOURCE_KEY());
}
}
}
答案 0 :(得分:0)
首先:为什么setValues()
有X[],PreparedStatement
而非AggrPreference[],PreparedStatement
为签名?
您正在以错误的方式使用JdbcBatchItemWriter
,因为您没有对X[] arr
中的每个元素执行更新,但仅针对最后一个元素执行更新(这是您最后只更新了最后一个元素的原因)元素)。
如果您的域对象是正确的(X[] arr
),您必须编写一个循环对象的自定义ItemWriter
并使用真实的JdbcBatchItemWriter
来执行写入一个元素。
如果您打算将每个X作为单个项目编写,则您的域对象是错误的,应该是单个X
对象而不是数组。
根据这些修改,您必须将XItemPrepartedStatementSetter
更改为
public class XItemPrepartedStatementSetter implements ItemPreparedStatementSetter<AggrPreference> {
@Override
public void setValues(AggrPreference x, PreparedStatement preparedStatement) throws SQLException {...}
}
从ItemProcessor
返回的对象必须是AggrPreference
类型,SB将使用新配置写入每个对象块。
我希望我很清楚,英语不是我的母语。