Spring 批次 - reader 中的最后一项正在更新
Spring Batch - Last item from the reader alone is getting updated
我必须从文件 (FlatFile) 中读取并更新列,如果文件中存在的 ID 与正在正确读取的 column.The 文件中的 ID 相匹配,但只有最后一个 ID 值正在更新这里 。请找到片段
工作-Config.xml
<bean id="abcitemReader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step">
<property name="resource" value="file:datafile/outputs/ibdData.txt" />
<property name="lineMapper">
<bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
<property name="lineTokenizer">
<bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
<property name="names" value="ID,NAM,TYPE" />
<property name="delimiter" value="|"/>
</bean>
</property>
<property name="fieldSetMapper">
<bean class="com.pershing.intraware.springbatch.mapper.abcFieldsetMapper" />
</property>
</bean>
</property>
</bean>
<bean id="abcitemWriter" class="org.springframework.batch.item.database.JdbcBatchItemWriter" scope="step">
<property name="dataSource" ref="dataSource" />
<property name="sql"><value>UPDATE TEST_abc SET BIZ_ARNG_CD = CASE WHEN ID IN (SELECT ID FROM TEST_abc WHERE ID= ? and MONTH=(to_char(sysdate, 'MM')) AND YR =(to_char(sysdate, 'YY'))) THEN 'Y' ELSE 'N' END</value></property>
<!-- It will take care matching between object property and sql name parameter -->
<property name="itemPreparedStatementSetter" ref="testPrepStatementSetter" />
</bean>
</beans>
Setter.java
public class IDItemPreparedStatementSetter implements ItemPreparedStatementSetter<Test> {
@Override
public void setValues(Test item, PreparedStatement ps) throws SQLException {
// TODO Auto-generated method stub
ps.setString(1, item.getID());
}
}
您的查询每次触发时都会更新数据库的每一行。你需要限制它。现在;它必须将 BIZ_ARNG_CD 设置为 'Y' 以获取 ID 等于传递给编写器的最后一条记录的 ID 的记录。
您可以通过两种方式解决此问题 -
- 默认数据库列为'N',不要在更新语句中将其设置为'N'
- 在更新脚本中添加 where 子句 (BIZ_ARNG_CD != 'Y')
我必须从文件 (FlatFile) 中读取并更新列,如果文件中存在的 ID 与正在正确读取的 column.The 文件中的 ID 相匹配,但只有最后一个 ID 值正在更新这里 。请找到片段
工作-Config.xml
<bean id="abcitemReader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step">
<property name="resource" value="file:datafile/outputs/ibdData.txt" />
<property name="lineMapper">
<bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
<property name="lineTokenizer">
<bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
<property name="names" value="ID,NAM,TYPE" />
<property name="delimiter" value="|"/>
</bean>
</property>
<property name="fieldSetMapper">
<bean class="com.pershing.intraware.springbatch.mapper.abcFieldsetMapper" />
</property>
</bean>
</property>
</bean>
<bean id="abcitemWriter" class="org.springframework.batch.item.database.JdbcBatchItemWriter" scope="step">
<property name="dataSource" ref="dataSource" />
<property name="sql"><value>UPDATE TEST_abc SET BIZ_ARNG_CD = CASE WHEN ID IN (SELECT ID FROM TEST_abc WHERE ID= ? and MONTH=(to_char(sysdate, 'MM')) AND YR =(to_char(sysdate, 'YY'))) THEN 'Y' ELSE 'N' END</value></property>
<!-- It will take care matching between object property and sql name parameter -->
<property name="itemPreparedStatementSetter" ref="testPrepStatementSetter" />
</bean>
</beans>
Setter.java
public class IDItemPreparedStatementSetter implements ItemPreparedStatementSetter<Test> {
@Override
public void setValues(Test item, PreparedStatement ps) throws SQLException {
// TODO Auto-generated method stub
ps.setString(1, item.getID());
}
}
您的查询每次触发时都会更新数据库的每一行。你需要限制它。现在;它必须将 BIZ_ARNG_CD 设置为 'Y' 以获取 ID 等于传递给编写器的最后一条记录的 ID 的记录。
您可以通过两种方式解决此问题 -
- 默认数据库列为'N',不要在更新语句中将其设置为'N'
- 在更新脚本中添加 where 子句 (BIZ_ARNG_CD != 'Y')