JdbcBatchItemWriter更新数据库中的最后一条记录

时间:2014-06-04 16:12:14

标签: spring spring-batch

我遇到了一个问题,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());
        }
    }
}

1 个答案:

答案 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将使用新配置写入每个对象块。

我希望我很清楚,英语不是我的母语。