MyBatisCursorItemReaderBuilder.java
/*
* Copyright 2010-2024 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.mybatis.spring.batch.builder;
import java.util.Map;
import java.util.Optional;
import java.util.function.Supplier;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.batch.MyBatisCursorItemReader;
/**
* A builder for the {@link MyBatisCursorItemReader}.
*
* @author Kazuki Shimizu
*
* @since 2.0.0
*
* @see MyBatisCursorItemReader
*/
public class MyBatisCursorItemReaderBuilder<T> {
private SqlSessionFactory sqlSessionFactory;
private String queryId;
private Map<String, Object> parameterValues;
private Supplier<Map<String, Object>> parameterValuesSupplier;
private Boolean saveState;
private Integer maxItemCount;
/**
* Set the {@link SqlSessionFactory} to be used by reader for database access.
*
* @param sqlSessionFactory
* the {@link SqlSessionFactory} to be used by writer for database access
*
* @return this instance for method chaining
*
* @see MyBatisCursorItemReader#setSqlSessionFactory(SqlSessionFactory)
*/
public MyBatisCursorItemReaderBuilder<T> sqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
return this;
}
/**
* Set the query id identifying the statement in the SqlMap configuration file.
*
* @param queryId
* the id for the query
*
* @return this instance for method chaining
*
* @see MyBatisCursorItemReader#setQueryId(String)
*/
public MyBatisCursorItemReaderBuilder<T> queryId(String queryId) {
this.queryId = queryId;
return this;
}
/**
* Set the parameter values to be used for the query execution.
*
* @param parameterValues
* the parameter values to be used for the query execution
*
* @return this instance for method chaining
*
* @see MyBatisCursorItemReader#setParameterValues(Map)
*/
public MyBatisCursorItemReaderBuilder<T> parameterValues(Map<String, Object> parameterValues) {
this.parameterValues = parameterValues;
return this;
}
/**
* Set the parameter supplier to be used to get parameters for the query execution.
*
* @param parameterValuesSupplier
* the parameter supplier to be used to get parameters for the query execution
*
* @return this instance for method chaining
*
* @see MyBatisCursorItemReader#setParameterValuesSupplier(Supplier)
*
* @since 2.1.0
*/
public MyBatisCursorItemReaderBuilder<T> parameterValuesSupplier(
Supplier<Map<String, Object>> parameterValuesSupplier) {
this.parameterValuesSupplier = parameterValuesSupplier;
return this;
}
/**
* Configure if the state of the {@link org.springframework.batch.item.ItemStreamSupport} should be persisted within
* the {@link org.springframework.batch.item.ExecutionContext} for restart purposes.
*
* @param saveState
* defaults to true
*
* @return The current instance of the builder.
*
* @see org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader#setSaveState(boolean)
*/
public MyBatisCursorItemReaderBuilder<T> saveState(boolean saveState) {
this.saveState = saveState;
return this;
}
/**
* Configure the max number of items to be read.
*
* @param maxItemCount
* the max items to be read
*
* @return The current instance of the builder.
*
* @see org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader#setMaxItemCount(int)
*/
public MyBatisCursorItemReaderBuilder<T> maxItemCount(int maxItemCount) {
this.maxItemCount = maxItemCount;
return this;
}
/**
* Returns a fully built {@link MyBatisCursorItemReader}.
*
* @return the reader
*/
public MyBatisCursorItemReader<T> build() {
var reader = new MyBatisCursorItemReader<T>();
reader.setSqlSessionFactory(this.sqlSessionFactory);
reader.setQueryId(this.queryId);
reader.setParameterValues(this.parameterValues);
reader.setParameterValuesSupplier(this.parameterValuesSupplier);
Optional.ofNullable(this.saveState).ifPresent(reader::setSaveState);
Optional.ofNullable(this.maxItemCount).ifPresent(reader::setMaxItemCount);
return reader;
}
}