✅ 1. Manual MyBatis Update (Per Row)
This method manually invokes an update per item.
🔹 XML Mapper (ApiRetryMapper.xml
)
xml
<mapper namespace="com.example.batch.mapper.ApiRetryMapper">
<update id="updateApiRetryStatus">
UPDATE ApiRetry
SET status = #{status}, retryCount = #{retryCount}, updatedAt = NOW()
WHERE id = #{id}
</update>
</mapper>
🔹 Mapper Interface
java
public interface ApiRetryMapper {
void updateApiRetryStatus(@Param("id") Long id,
@Param("status") String status,
@Param("retryCount") int retryCount);
}
🔹 ItemWriter Implementation
java
public class ApiRetryItemWriter implements ItemWriter<ApiRetry> {
@Autowired
private ApiRetryMapper apiRetryMapper;
@Override
public void write(List<? extends ApiRetry> items) {
for (ApiRetry item : items) {
apiRetryMapper.updateApiRetryStatus(item.getId(), item.getStatus(), item.getRetryCount());
}
}
}
✅ 2. Batch Update with MyBatisBatchItemWriter
(Recommended for Performance)
Uses Spring's MyBatis batch writer which sends batch SQL to the DB.
🔹 XML Mapper (ApiRetryMapper.xml
)
xml
<mapper namespace="com.example.batch.mapper.ApiRetryMapper">
<update id="batchUpdateApiRetryStatus">
UPDATE ApiRetry
SET status = #{status}, retryCount = #{retryCount}, updatedAt = NOW()
WHERE id = #{id}
</update>
</mapper>
🔹 Mapper Interface
java
public interface ApiRetryMapper {
void batchUpdateApiRetryStatus(ApiRetry apiRetry); // This will be called for each item in batch
}
🔹 MyBatisBatchItemWriter
Bean Configuration
java
@Bean
public MyBatisBatchItemWriter<ApiRetry> myBatisBatchItemWriter(SqlSessionFactory sqlSessionFactory) {
MyBatisBatchItemWriter<ApiRetry> writer = new MyBatisBatchItemWriter<>();
writer.setSqlSessionFactory(sqlSessionFactory);
writer.setStatementId("com.example.batch.mapper.ApiRetryMapper.batchUpdateApiRetryStatus");
return writer;
}
🔁 Spring Batch Config (Common for Both)
java
@Bean
public Step apiRetryStep(StepBuilderFactory stepBuilderFactory,
MyBatisPagingItemReader<ApiRetry> apiRetryReader,
ItemWriter<ApiRetry> writer) {
return stepBuilderFactory.get("apiRetryStep")
.<ApiRetry, ApiRetry>chunk(10)
.reader(apiRetryReader)
.writer(writer)
.build();
}
@Bean
@StepScope
public MyBatisPagingItemReader<ApiRetry> apiRetryReader(SqlSessionFactory sqlSessionFactory) {
MyBatisPagingItemReader<ApiRetry> reader = new MyBatisPagingItemReader<>();
reader.setSqlSessionFactory(sqlSessionFactory);
reader.setQueryId("com.example.batch.mapper.ApiRetryMapper.selectApiRetries");
return reader;
}
✅ Which Should You Use?
FeatureManual ItemWriterMyBatisBatchItemWriter
Ease of debugging✅ Easy⚠️ More indirectPerformance⚠️ Slower for large data✅ Optimized for batch writesTransactional✅ Manual management✅ Handled by batch contextParallel step support✅ Yes✅ Yes
If you're dealing with large datasets, go with MyBatisBatchItemWriter
. For simple updates or low volume, the manual writer is just fine.